如何使用ASM将FARPROC的内存地址移动到另一个功能?

时间:2013-03-07 16:55:53

标签: c++ c dll assembly

我有两个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?

1 个答案:

答案 0 :(得分:1)

外部DLL中的每个引用函数都会在可执行文件的标题区域中的“导入地址表”中获取一个条目。该条目的一部分是函数的地址。这就是你打电话让电话去其他地方。应该有很多关于如何在开放的互联网上做到这一点的例子,虽然我没有碰巧有一个方便的链接。

如果您想自己动手,请从msdn下载Portable Executable规范,看看这些标题的格式是什么。