转发没有签名的方法

时间:2014-05-01 10:17:12

标签: c++ function-pointers

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

问题是该库缺少2种方法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();
}

1 个答案:

答案 0 :(得分:0)

您可以简单地forward export calls.

所以我的调试libEGL.dll .def文件现在顶部有两行额外的行

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

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