2017-07-27 131 views
1

我想學習鉤子,並且只想鉤住.exe的send/recv函數。C++ hooking ws2_32.dll recv

我建設項目作爲一個.dll文件,然後將其注入到.EXE

現在我的問題是我堅持。

我能夠順利地找到地址recv函數,接下來我想查看通過接收數據包..

小指南請在下一步做什麼.. 這是我的.cpp

#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; 
} 

頭文件

#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_ */ 

回答

1

有,據我所知掛鉤API調用的3種方式:

  1. 在應用程序中注入一個DLL,該DLL將重寫包含API調用地址的導入地址表,以便應用程序調用您的函數;
  2. 使用要調用的API調用編寫一個具有相同DLL名稱的虛擬DLL,並將其放在應用程序的根目錄中,這樣它將加載您的API而不是系統;
  3. 繞過API調用,用JMP yourfunc或其他類似效果重寫它的代碼。

方法1是非常流行的一種,它在Wikipedia page about Hooking和各種例子,如果你Google一下,像this one,或this one甚至描述。

方法2有點棘手,你必須建立一個名稱相同的DLL並導出爲你所模仿的DLL,並繞過你不感興趣的所有函數,併爲這個函數編寫自定義代碼你是。我發現這個方法非常乾淨,因爲你不需要修改內存,你不必使用外部程序明確地注入這個DLL,Windows只是爲你做的,而且加上它通常會在反調試和反黑客檢測。 Here is an example如何做到這一點(32位)。方法3是Microsoft's favorite。它有一個特別好的優點:您可以掛接任何和每個功能,方法或虛擬呼叫。它不依賴於被外部調用的函數來掛鉤它,所以它非常受歡迎,例如鉤住DirectX方法。這是FRAPS,Discord Overlay,Overwolf Overlay和幾乎所有其他在遊戲中放置疊加層或記錄遊戲玩法的軟件所使用的方法。您不需要專門使用Microsoft Detours,也可以使用generic alternative