我正在尝试学习挂钩,并且只想挂钩.exe的发送/接收功能。
我将项目构建为.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_ */
答案 0 :(得分:1)
据我所知,有三种方法可以挂钩API调用:
JMP yourfunc
或具有类似效果的内容重写代码来绕过API调用。方法1非常受欢迎,它甚至在Wikipedia page about Hooking和各种示例中都有描述,如果您使用它,例如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也是如此。