【发布时间】:2020-03-28 19:21:24
【问题描述】:
我需要从一个程序中得到一些东西。在 ollydbg 和 IDA 的帮助下,我发现我能得到的“东西”在一个名为 sub_HEXHEX 的函数中。
现在我知道如何从 Dll 中挂钩一个函数,例如 DrawTextA 或其他函数。
我需要获取函数地址
HMODULE hmod = LoadLibrary(L"User32.dll");
GetProcAddress(hmod, "DrawTextA")
但是当我需要挂钩这个sub_HEXHEX 时,我感到困惑。我可以得到那个 exe 的 HANDLE,我知道函数的地址(那个 0x00HEXHEX),但是没有 GetProcAddress 我可以使用。我尝试使用 HANDLE + 0x00HEXHEX 作为函数的地址,但我认为我对“偏移”的东西有误。
这就是我所做的
DWORD dwPid = GetCurrentProcessId();
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid);
OldA2ECB0 = (sub_A2ECB0)((HMODULE)hProcess + 0xA2ECB0);
pfOldA2ECB0 = (FARPROC)OldA2ECB0;
还有 sub_A2ECB0
typedef int(*sub_A2ECB0)(LPCSTR param1, int param2);
但 pfOldA2ECB0 将为 NULL。
我对 C++ 和 Win32(英语也是)的知识很差,所以这对我来说太难了。
【问题讨论】:
-
没有
GetProcAddress可以使用是什么意思? -
@jkb 目标函数不是 DLL 中的导出函数,它是 EXE 中的函数。
GetProcAddress()不能用于获取此类函数的地址。 -
雷米回答你的问题,这就是我的意思。谢谢。
-
如果您知道函数的相对虚拟地址 (RVA),那么您可以使用
module_base + RVA计算其在进程地址空间中的地址。如果这对你不起作用,那么你做错了。由于我们看不到该代码,因此我们无能为力。 -
进程句柄不是模块句柄。向进程句柄添加内存偏移是无意义的操作。您需要致电 GetModuleHandle。一旦你放弃了 C 风格的强制转换,编译器就会帮助你。此外,您的函数指针
typedef缺少调用约定。