【发布时间】:2017-09-15 12:11:09
【问题描述】:
我将我的 DLL 注入到一个进程中,然后像这样挂钩一个函数:(recv)
BOOL HookFunction(LPCWSTR moduleName, LPCSTR funcName, LPVOID funcProxy,
unsigned char* lpBackup)
{
BYTE jmp[6] = { 0xe9,0x00,0x00,0x00,0x00,0xc3 };
DWORD funcAddr = (DWORD)GetProcAddress(GetModuleHandle(moduleName), funcName);
DWORD prev;
VirtualProtect((LPVOID)funcAddr, 6, PAGE_EXECUTE_READWRITE, &prev);
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcAddr, lpBackup, 6, NULL);
DWORD proxy = ((DWORD)funcProxy - funcAddr) - 5;
memcpy(&jmp[1], &proxy, 4);
memcpy((LPVOID)funcAddr, jmp, 6);
VirtualProtect((LPVOID)funcAddr, 6, prev, &prev);
FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
return funcAddr;
}
// Hook
HookFunction(L"ws2_32.dll", "recv", (LPVOID*)nRecv, hookR);
我正在附加一个调试器,结果如下:
虽然有几件事我不明白,因为我仍在尝试理解和可视化堆栈、堆等如何在调试器中一起工作。
BYTE jmp[6] = { 0xe9,0x00,0x00,0x00,0x00,0xc3 };
我是不是在这里替换指令,例如将原始函数的“move, edi, edi” (recv) 替换为 0xe9?然后是 0x00 的下一条指令......或者它究竟是如何工作的?
任何详细的解释将不胜感激。
【问题讨论】:
-
看起来更像 C 而不是 C++,至少在风格上。
-
代码使用的是 Windows API 函数,这些函数与标准 C 或 C++ 无关。要获得更有用的答案,请移除 C++ 标签,并添加相关标签,例如 windows。
-
谢谢你,已经做到了:)
-
@Anders 这是一个非常无效的声明。我正在学习,我需要帮助,在这里问这件事是不是很糟糕,或者你们是天才?
-
您正在使用 ReadProcessMemory,但使用的是普通的 memcpy 写入,这闻起来像复制和粘贴。在尝试以这种方式挂钩之前,您应该了解地址空间和汇编语言。 IAT 挂钩是一个更安全的选择。
标签: windows debugging hook code-injection