recv Hook; packet auslesen -> bekomme nur nullen
-
Hallo.
Ich hoffe es kann mir jemand helfen.
Also ich versuche die recv() funktion mit detours zu hooken und 2 bestimmte bytes vom inhalt der packets auszulesen..
der recv hook mit detours funktioniert, das weiss ich, aber wenn ich den inhalt ausgeben lassen will bekomme ich nur nullen..
ich muss dazu sagen dass ich eine DLL schreibe, deren DLLMain funktion exportiert wird, damit die dll bei programmstart
direkt mitgeladen werden kann, wenn sie in der IAT eingetragen ist.in WPE bestehen die packets nicht nur aus 00 sondern aus daten, verschlüsselt mit Xor 0xFF.
Benutzt wird ausschließlich recv die anderen wie recvfrom und WSArecv werden nicht benutzt.ich benutze MS Visual C++ 2008 Express
weiss jemand was ich falsch mache??
oder gibt es vielleicht noch einen anderen weg das zu machen?danke im voraus
Karlsonhier mein code:
#include <WinSock2.h> #include <windows.h> #include "detours.h" #include <stdio.h> #pragma comment(lib, "detours.lib") #pragma comment(lib, "Ws2_32.lib") typedef int (WINAPI * tRecv)(SOCKET s, char *buf, int len, int flags); tRecv oRecv = NULL; int WINAPI myRecv(SOCKET s, char *buf, int len, int flags) { printf("recieved: %X %X\n",buf[2],buf[3]); return (oRecv)(s, buf, len, flags); } __declspec(dllexport) BOOL WINAPI DllMain(HANDLE HDllHandle, DWORD reason, LPVOID Reserved) { if(DLL_PROCESS_ATTACH == reason) { oRecv = reinterpret_cast<tRecv>(DetourFunction((PBYTE)&recv, (PBYTE)&myRecv)); AllocConsole(); freopen("conin$", "r", stdin); freopen("conout$", "w", stdout); freopen("conout$", "w", stderr); printf( "Console Started!\n" ); } return TRUE; }
-
Nimm erstmal Detours 2.1.
Codebeispiel:long (__stdcall *RealDirectInputCreate)(HINSTANCE hInst, unsigned long dwVersion, LPDIRECTINPUTA* ppDI, LPUNKNOWN punkOuter) = DirectInputCreateA; long (__stdcall *TramDirectInputCreate)(HINSTANCE hInst, unsigned long dwVersion, LPDIRECTINPUTA* ppDI, LPUNKNOWN punkOuter); long __stdcall HookDirectInputCreate(HINSTANCE hInst, unsigned long dwVersion, LPDIRECTINPUTA* ppDI, LPUNKNOWN punkOuter); bool __stdcall DllMain(HMODULE, unsigned long reason, void*) { if(reason == DLL_PROCESS_ATTACH) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttachEx(&reinterpret_cast<void*&>(RealDirectInputCreate), HookDirectInputCreate, &reinterpret_cast<DETOUR_TRAMPOLINE*&>(TramDirectInputCreate), 0, 0); DetourTransactionCommit(); } else if(reason == DLL_PROCESS_DETACH) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&reinterpret_cast<void*&>(RealDirectInputCreate), HookDirectInputCreate); DetourTransactionCommit(); } return true; } long __stdcall HookDirectInputCreate(HINSTANCE hInst, unsigned long dwVersion, LPDIRECTINPUTA* ppDI, LPUNKNOWN punkOuter) { long result = TramDirectInputCreate(hInst, dwVersion, ppDI, punkOuter); // ... return result; }
-
oha .. und erm .. wo kann cih da jetz meinen code einfügen zum auslesen der zwei bytes? Oo
-
Ein bisschen Eigeninitiative bitte.
Die Funktionszeiger und die Funktion änderst du halt auf recv() ab.
-
achsoo xD nu hab ich den code auch verstanden .. danke erstmal .. mal schaun ob es damit klappt.
ich melde mich nochmal, wenn jemand noch was weiss bitte trotzdem schreiben
bin für alles dankbar
-
danke bronson es funktioniert

sry nochmal für die blöde frage "oha .. und erm .. wo kann cih da jetz meinen code einfügen zum auslesen der zwei bytes? Oo" .. musste erstmal umdenken vom doch sehr einfachen detours 1.5 xD hab es aber nu verstanden und es gehtweiss ja nich wie das hier gehandhabt wird, aber thread kann geclosed werden oder so

greetz