2017-07-27 129 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