我有两个FARPROC,我想用ASM替换另一个的地址。
什么是FARPROC? “[int(FAR WINAPI * FARPROC)()]在C中,FARPROC声明表示一个具有未指定参数列表的回调函数。但是,在C ++中,声明中的空参数列表表示函数没有参数。微妙的区别可以打破粗心的代码。以下是处理这种情况的一种方法:“
现在已经涵盖了,这是我的代码:
HMODULE h = LoadLibrary("myDLL.dll");
FARPROC p = GetProcAddress(h, "_GetHelloMessage@0");
if(!p) MessageBox(hwnd, "injected, but function not found", "Loader", NULL);
HMODULE dllHmodule = GetModuleHandle("InjectFunctions.dll");
FARPROC injproc = GetProcAddress(dllHmodule, "_GetHelloMessage@0");
if(!injproc) MessageBox(hwnd, "injproc is null", "Loader", NULL);
__asm{
mov eax, p
ADD injproc [EAX],8
}
我的问题是,如果加载此DLL的程序调用p,它将如何调用它而不是调用injproc?
答案 0 :(得分:1)
外部DLL中的每个引用函数都会在可执行文件的标题区域中的“导入地址表”中获取一个条目。该条目的一部分是函数的地址。这就是你打电话让电话去其他地方。应该有很多关于如何在开放的互联网上做到这一点的例子,虽然我没有碰巧有一个方便的链接。
如果您想自己动手,请从msdn下载Portable Executable规范,看看这些标题的格式是什么。