Artykuły na każdy temat
[C++] Hookowanie funkcji send() i recv()
#include <winsock2.h>
#include <windows.h>
#include <iostream>
typedef INT (WINAPI *SendPtr)(SOCKET sock, CONST CHAR* buf, INT len, INT flags);
typedef INT (WINAPI *RecvPtr)(SOCKET sock, CHAR* buf, INT len, INT flags);
INT WINAPI OurSend (SOCKET sock, CONST CHAR* buf, INT len, INT flags);
INT WINAPI OurRecv (SOCKET sock, CHAR* buf, INT len, INT flags);
VOID *Detour(BYTE *source, CONST BYTE *destination, CONST INT length);
SendPtr RealSend;
RecvPtr RealRecv;
HANDLE Console;
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
if(reason == DLL_PROCESS_ATTACH)
{
// Dla okienkowych aplikacji i osób nie lubiących OutputDebugString(), można jeszcze dodać logowanie pakietów do pliku
AllocConsole();
Console = GetStdHandle(STD_OUTPUT_HANDLE);
CHAR buffer[256];
RealSend = (SendPtr)GetProcAddress(GetModuleHandle("ws2_32.dll"), "send");
RealRecv = (RecvPtr)GetProcAddress(GetModuleHandle("ws2_32.dll"), "recv");
sprintf(buffer, "Adres send() w aplikacji = 0x%x\n", RealSend);
WriteConsole(Console, buffer, strlen(buffer), NULL, NULL);
sprintf(buffer, "Adres recv() w aplikacji = 0x%x\n", RealRecv);
WriteConsole(Console, buffer, strlen(buffer), NULL, NULL);
RealSend = (SendPtr)Detour((BYTE*)RealSend, (BYTE*)&OurSend, 5);
RealRecv = (RecvPtr)Detour((BYTE*)RealRecv, (BYTE*)&OurRecv, 5);
sprintf(buffer, "Adres send() w bibliotece = 0x%x\n", RealSend);
WriteConsole(Console, buffer, strlen(buffer), NULL, NULL);
sprintf(buffer, "Adres recv() w bibliotece = 0x%x\n", RealRecv);
WriteConsole(Console, buffer, strlen(buffer), NULL, NULL);
}
else if(reason == DLL_PROCESS_DETACH)
{
CloseHandle(Console);
FreeConsole();
}
return TRUE;
}
VOID *Detour(BYTE *source, CONST BYTE *destination, CONST INT length)
{
DWORD back;
BYTE *jmp = (BYTE*)malloc(length + 5);
VirtualProtect(source, length, PAGE_READWRITE, &back);
memcpy(jmp, source, length);
jmp += length;
jmp[0] = 0xE9;
*(DWORD*)(jmp + 1) = (DWORD)(source + length - jmp) - 5;
source[0] = 0xE9;
*(DWORD*)(source + 1) = (DWORD)(destination - source) - 5;
VirtualProtect(source, length, back, &back);
return (jmp - length);
}
INT WINAPI OurSend(SOCKET sock, CONST CHAR* buf, INT len, INT flags)
{
CHAR buffer[256];
sprintf(buffer, "SEND -> %s\n", buf);
WriteConsole(Console, buffer, strlen(buffer), NULL, NULL);
// OutputDebugString(buffer);
return RealSend(sock, buf, len, flags);
}
INT WINAPI OurRecv(SOCKET sock, CHAR* buf, INT len, INT flags)
{
CHAR buffer[256];
sprintf(buffer, "RECV -> %s\n", buf);
WriteConsole(Console, buffer, strlen(buffer), NULL, NULL);
// OutputDebugString(buffer);
return RealRecv(sock, buf, len, flags);
}
Komentarze
VOID *Detour(BYTE *source, CONST BYTE *destination, CONST INT length)ochrona pamięci w systemie wywala program kiedy ten chce się wykonywać w miejscu gdzie nie powinien czyli "*jmp "
{
// ...
BYTE *jmp = (BYTE*)malloc(length + 5);
memcpy(jmp, source, length);
VirtualProtect(jmp, length, PAGE_EXECUTE_READWRITE, &back);
// ...
}
Dodaj komentarz
CapaciousCore