我正在尝试为libEGL.dll编写一个转发库,这样我就可以捕获通过它进行调试的调用。
问题是该库缺少2种方法NvEglGetStdProcAddress
和NvEglRegClientApi
。
这是为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();
}
答案 0 :(得分:0)
您可以简单地forward export calls.
所以我的调试libEGL.dll .def
文件现在顶部有两行额外的行
; libEGL.def
EXPORTS
NvEglGetStdProcAddress = libEGLOld.NvEglGetStdProcAddress
NvEglRegClientApi = libEGLOld.NvEglRegClientApi
eglBindAPI
eglBindTexImage
...
我的一位同事对此进行了测试并验证了它是否有效,尽管它也要求指定序数