2017-07-27 3 views
1

Ich versuche, Hooking zu lernen und möchte nur eine .exe send/recv-Funktion haken.C++ hooking ws2_32.dll recv

ich das Projekt als DLL baue und injizieren es dann auf die .exe

Nun mein Problem ist, ich bin stecken.

Ich bin in der Lage, erfolgreich die Adresse für recv Funktion zu finden, das nächste würde ich die Pakete zu sehen, wie die empfangen ist wird ..

eine kleine Anleitung pls auf das, was als nächstes zu tun .. Das ist mein CPP ist

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include "dll.h" 

#include <Winsock.h> 
#pragma warning(disable:4996) 
#pragma comment (lib,"ws2_32.lib") 

typedef int(*WINAPI oldsend)(SOCKET s, const char* buf, int len, int flags); 



void Proc_Attach() 
{ 
DWORD dwProtect; 
HINSTANCE hLib = LoadLibrary(L"WS2_32.dll"); 
DWORD OldFuncAddr = (DWORD)GetProcAddress(hLib, "recv"); 
WCHAR szTest[100]; // WCHAR is the same as wchar_t 
        // swprintf_s is the same as sprintf_s for wide characters 
swprintf_s(szTest, 100, L"%d", OldFuncAddr); // use L"" prefix for wide chars 
MessageBox(0, szTest, L"A", MB_ICONINFORMATION); 
//MessageBox(0, L" Process Attached!\n", L"Hi", MB_ICONINFORMATION); 
} 



BOOL APIENTRY DllMain(HINSTANCE hInst  /* Library instance handle. */, 
DWORD reason  /* Reason this function is being called. */, 
LPVOID reserved  /* Not used. */) 
{ 
switch (reason) 
{ 
case DLL_PROCESS_ATTACH: 

    Proc_Attach(); 

    break; 

case DLL_PROCESS_DETACH: 

    break; 

case DLL_THREAD_ATTACH: 

    break; 

case DLL_THREAD_DETACH: 

    break; 
} 


return TRUE; 
} 

Header-Datei

#pragma once 
#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void Proc_Attach(void); 



#endif /* _DLL_H_ */ 

Antwort

1

Es gibt 3 Möglichkeiten, wie weit einen API-Aufruf von Einhaken ich weiß:

  1. In die Anwendung eine DLL einschreiben, die die Importadressentabelle mit der Adresse des API-Aufrufs neu schreibt, sodass die Anwendung stattdessen Ihre Funktion aufruft;
  2. Schreiben Sie eine Dummy-DLL mit dem gleichen Namen der DLL mit dem API-Aufruf, den Sie haken möchten, und platzieren Sie sie im Stammverzeichnis der Anwendung, damit die APIs anstelle der Systemdateien geladen werden;
  3. Umleiten Sie den API-Aufruf, indem Sie seinen Code mit einem JMP yourfunc oder etwas mit ähnlichem Effekt umschreiben.

Methode 1 ist ziemlich beliebt ein, es selbst in den Wikipedia page about Hooking und in verschiedenen Beispielen beschrieben ist, wenn Sie es Google, wie this one oder this one.

Methode 2 ist ein bisschen knifflig, Sie müssen eine DLL mit dem gleichen Namen erstellen und exportieren als die, die Sie imitieren, und umgehen Sie alle Funktionen, die Sie nicht daran interessiert sind, benutzerdefinierten Code für den einen zu schreiben und zu schreiben Du bist. Ich finde diese Methode sehr sauber, weil Sie Speicher nicht ändern müssen, Sie müssen diese DLL nicht explizit mit einem externen Programm injizieren, Windows tut es nur für Sie, und mit einem Plus, fliegen sie in der Regel unter dem Radar von Anti-Debug- und Anti-Hack-Erkennung. Here is an example wie man das macht (32-bit).

Methode 3 ist Microsoft's favorite. Es hat einen besonders guten Vorteil: Sie können jede Funktion, Methode oder virtuelle Anrufe haken. Es kommt nicht darauf an, dass die Funktion extern aufgerufen wird, um sie anzuhängen. Daher ist es sehr beliebt, DirectX-Methoden zum Beispiel anzuhängen. Dies ist die Methode, die von FRAPS, Discord Overlay, Overwolf Overlay und so ziemlich jeder anderen Software verwendet wird, die entweder ein Overlay in Spiele einfügt oder Gameplay aufzeichnet. Sie müssen Microsoft Detours nicht speziell verwenden, da ist auch die generic alternative.