转发不带签名的方法

Forward a method without a signature

本文关键字:方法 转发      更新时间:2023-10-16

我正试图为libEGL.dll编写一个转发库,这样我就可以捕获通过它进行调试的调用。

问题是库缺少两个方法NvEglGetStdProcAddressNvEglRegClientApi

这是一个为Arm7(WinCE(构建的C库。我为libEGL准备的头文件不包括这两个方法,所以我不知道转发调用的签名是什么。

有没有什么方法可以在不知道签名的情况下转接电话?我可以反汇编dll并查找从堆栈中弹出的参数吗?

DumpBin在RVA 0x217C和Ox1E5C处显示这些,/ALL/DISASM显示从0x11000开始的.text部分。如何在这两个偏移之间转换?

我猜这是行不通的,它会把参数留在堆栈上,然后用局部变量稍微篡改它们吗?的返回值(如果有(会发生什么

typedef void (*NvEglGetStdProcAddressFunc) (void);
void NvEglGetStdProcAddress()
{
    NvEglGetStdProcAddressFunc ptr = (NvEglGetStdProcAddressFunc)GetProcAddress(hInst, _T("NvEglGetStdProcAddress"));
    ptr();
}

您可以简单地转发导出调用。

因此,我的调试libEGL.dll .def文件现在在其顶部有两行额外的

; libEGL.def
EXPORTS
  NvEglGetStdProcAddress = libEGLOld.NvEglGetStdProcAddress 
  NvEglRegClientApi = libEGLOld.NvEglRegClientApi
  eglBindAPI
  eglBindTexImage
  ...

我的一位同事对此进行了测试并验证了它的有效性,尽管它也要求指定序数