测试平台是Windows 32位。 IDA pro 64

因此,基本上,我使用IDA pro来分解PE文件,并对获得的asm代码进行一些转换工作,以使其可重新组装。

在我生成的转换后的代码中,像printf这样的系统函数调用将按照通常的方式编写。

extern printf
....
....
call printf


我得到了PE可执行文件,并且基本上可以正常运行(如hello world程序,快速排序程序等)。 />但是,当我使用IDA pro重新反汇编我创建的新PE可执行文件时,发生了奇怪的事情。

IDA pro生成如下函数调用:

,当我使用时: />
nasm -fwin32 --prefix _ test.s
cl test.obj /link msvcrt.lib


没有j_printf proc near函数定义...

所以基本上我想知道是否有人知道如何处理这样,让IDA pro再次生成

还是任何其他解决方案?

评论

为什么JMP可以与CALL一起使用?

@JasonGeffner:虽然我同意它看起来像重复的,但问题的提出方式却完全不同(这将在搜索时帮助未来的太空人)。

#1 楼

是cl.exe插入了跳变。它具有一些优点,例如,使加载后的运行时过程中的函数重定向更容易,并且使加载器仅需对该函数进行一次重定位。另一种选择是通过地址使用间接调用。由于调用与跳转或地址之间的距离(可能会损害缓存),因此两者都不是性能的最佳选择。您可以通过禁用增量链接来禁用跳转功能。实际上,IDA并不是生产可以重新汇编的代码。通常要做的是扩展最后一部分或使用补丁代码添加新部分,然后通过调用或跳转将原始代码重定向到补丁。