如何在DLL中用E8指令调用逆向分析得到的EXE函数?
问题:DLL劫持调用EXE指定地址函数并生成E8直接调用指令
我逆向分析了一个Windows x86架构的.exe文件,目前仅持有该.exe文件,已获取部分函数信息。我的目标是通过DLL劫持技术创建一个与目标.exe同进程的DLL,调用.exe中地址为0x401000的函数foo。
我希望用C/C++编写代码,让DLL生成的汇编代码使用0xE8指令(即直接call 0x401000,且重定位后相对调用地址正确)。但目前尝试的方法都无法达到预期:
- 定义const函数指针,生成的汇编是两步调用逻辑,比如
call dword ptr [指针变量]或者mov ecx, 0x401000; call ecx,不是直接的E8指令调用。 - 尝试内嵌汇编
__asm {call foo},生成的机器码是FF 15 00 00 00 00,同样不是E8指令。
已知信息:目标.exe的镜像基址为0x400000,DLL的虚拟内存地址在编译时无法确定,按照PE格式的理论,应该可以通过重定位表实现E8指令的正确相对调用。
我的疑问是:是否需要基于该.exe生成自定义的.obj或.lib文件?已知.lib需要函数导出信息,但目标.exe并没有导出表。
示例代码如下:
// 编译后对应汇编输出可参考相关结果 void (* const foo)(int b, int c) = (void (* const)(int b, int c)) 0x401000; #pragma optimize("",off) int bar(int a, int b) { return a * b; } #pragma optimize("",on) int main(int argc, char**argv) { int ba = bar(100, 200); foo(100, ba); return 0; }
内容的提问来源于stack exchange,提问作者Edward Gynt
相关产品推荐
相关产品推荐

