Mailslot protokolü, SMB protokol ailesinin bir parçasıdır. Bir mailslot, aynı ağdaki birkaç bilgisayar tarafından çok sayıda veri kaydının yazılabildiği ve okunabileceği (geçici) RAM tabanlı bir dosyadır. Genellikle Mailslot, taşıma protokolü olarak SMB kullanır.
Bilindik koxplarda sendfunction remote olarak kullanılıyor.
Burada mailslot ve asm SendFunctionu “call” sözdizimi ile de kullanabilirsiniz
Bu sistemi benim gördüğüm tek kişi 458f idi.
dll kısmı (win32 dll)
header files klasörüne bir header dosyası açın.
1 2 3 4 5 6 7 8 9 |
#include <windows.h> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <stdlib.h> #include <string> #include <sstream> #include <iomanip> |
Bağdaştırıcılar
1 2 3 |
DWORD GAME_PKTPTR = 0x00C27F10; DWORD GAME_SNDPTR = 0x00C1D368; DWORD GAME_SNDFNC; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void SendFunction() { switch ((*(BYTE *)(GAME_SNDPTR))) { case 22: __asm mov GAME_SNDFNC, 0 break; case 23: __asm mov GAME_SNDFNC, 1 break; case 20: __asm mov GAME_SNDFNC, 2 break; case 21: __asm mov GAME_SNDFNC, 3 break; case 18: __asm mov GAME_SNDFNC, 4 break; case 19: __asm mov GAME_SNDFNC, 5 break; case 16: __asm mov GAME_SNDFNC, 6 break; case 17: __asm mov GAME_SNDFNC, 7 break; case 30: __asm mov GAME_SNDFNC, 8 break; case 31: __asm mov GAME_SNDFNC, 9 break; } // printf("call sendfunction\n"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void SendPacketz(BYTE *packets, size_t sizes) { SendFunction(); __asm { mov ecx, GAME_PKTPTR mov ecx, dword ptr ds:[ecx] mov eax, GAME_SNDFNC push sizes push packets call [eax*4+ecx+40064h] } // printf("Send\n"); } |
Gelelim mailslot’a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
void MailSlot() { LPCTSTR errMsg; HANDLE handle; handle = CreateMailslot("\\\\.\\mailslot\\KNIGHTONLINE", 0, MAILSLOT_WAIT_FOREVER, NULL); if (handle == INVALID_HANDLE_VALUE) { TCHAR strError[256]; errMsg = "CreateMailslot failed: %s"; print_err: FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &strError[0], 256, 0); printf(errMsg, &strError[0]); if (handle != INVALID_HANDLE_VALUE) CloseHandle(handle); } while (1) { DWORD msgSize; BOOL err; err = GetMailslotInfo(handle, 0, &msgSize, 0, 0); if (!err) { errMsg = "GetMailslotInfo failed: %s"; goto print_err; } if (msgSize != (DWORD)MAILSLOT_NO_MESSAGE) { void *buffer; buffer = GlobalAlloc(GMEM_FIXED, msgSize); if (!buffer) printf("An error getting a memory block!"); else { DWORD numRead; err = ReadFile(handle, buffer, msgSize, &numRead, 0); if (!err) printf("ReadFile error: %d", GetLastError()); else if (msgSize != numRead) printf("ReadFile did not read the correct number of bytes!"); else { BYTE *bufcuk = (BYTE *)(void *)buffer; SendPacketz(bufcuk, sizeof(msgSize)); } // CloseHandle(buffer); GlobalFree(buffer); } } Sleep(100); } } |
Buradaki “KNIGHTONLINE” mailslot ismi
1 |
"\\\\.\\mailslot\\KNIGHTONLINE" |
Mailslota bilgileri yazdıracağınız projenizde mailslot ismi ile dll de kontrol ettiğiniz mailslot aynı olmalıdır.
header dosyası bu kadar.
dllmain.cpp
1 2 3 4 5 6 7 8 9 10 11 12 |
#include "stdafx.h" #include "windows.h" #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <io.h> #include <math.h> #include <iostream> #include <ostream> #include <string> #include "Atom.h" |
1 |
#include "Atom.h" |
Oluşturduğum header dosyasını dllmain.cpp de kullanabilmem için include ettim.
sizin header dosyanızın ismi ne ise o misal: “Motor.h”
1 |
using namespace std; |
1 |
DWORD THRID; |
1 |
extern void MailSlot(); |
burada header dosyamızdaki mailslot bölümünü dllmainde kullanabilmemiz için
içe aktarıyoruz. (dllmain.cpp)
1 2 3 |
int hCrt, i; FILE *hf; HANDLE hConsole; |
1 2 3 4 5 6 7 8 9 10 |
void modAllocConsolle() { AllocConsole(); hConsole = GetStdHandle(STD_OUTPUT_HANDLE); hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); hf = _fdopen(hCrt, "w"); *stdout = *hf; i = setvbuf(stdout, NULL, _IONBF, 0); SetConsoleTitle("Test"); SetConsoleOutputCP(65001); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: modAllocConsolle(); CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&MailSlot, 0, 0, &THRID); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } |
Inject edildikten sonra console çıkmasını istiyorsanız
1 |
modAllocConsolle(); |
Mailslot için thread oluşturuyoruz.
1 |
CreateThread(0,0,(LPTHREAD_START_ROUTINE)&MailSlot,0,0,&THRID); |
1 |
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== |
Kolay gelsin