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

How do I move a FARPROC's memory address to another Function using ASM?

本文关键字:移动 另一个 功能 地址 内存 ASM 何使用 FARPROC      更新时间:2023-10-16

我有2个FARPROCs,我想用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?

外部DLL中的每个引用函数在可执行文件头区域的Import Address Table中获得一个条目。该条目的一部分是函数的地址。这是你用来把电话转到别的地方的。在开放的互联网上应该有很多关于如何做到这一点的例子,尽管我碰巧手边没有链接。

如果你想自己做这件事,从msdn下载可移植可执行文件规范,看看这些头文件的格式是什么