为什么 IDA Pro 会生成“j_printf”函数调用?

逆向工程 艾达 拆卸 视窗 重新组装
2021-06-16 10:12:08

测试平台为windows 32位。国际开发协会专业版 64

所以,基本上我使用 IDA pro 来反汇编一个 PE 文件,并对我得到的 asm 代码做一些转换工作,使其可重新组装

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

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

我用它来重新组装我创建的代码:

nasm -fwin32 --prefix _ test.s
cl test.obj /link msvcrt.lib

我得到了一个 PE 可执行文件,基本上它运行良好(比如 hello world 程序、快速排序程序等)。

但是,当我使用IDA pro 重新反汇编我创建的新 PE 可执行文件时,奇怪的事情发生了。

IDA pro 生成如下函数调用:

国际开发协会专业版

当我使用:

idaq.exe -B test.exe 

要生成新的汇编代码,在 printf 函数调用部分,它会生成:

call j_printf

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

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

call printf

或者

call _printf

再次或任何其他解决方案?

1个回答

是 cl.exe 插入了跳转 thunk。它有一些优点,例如在加载后的运行时期间更容易重定向函数,并使加载器只需为该函数执行一次重定位。另一种选择是通过地址使用间接调用。由于调用与跳转或地址之间的距离,两者都不是真正的最佳性能,这可能会损害缓存。您可以通过禁用增量链接禁用跳转 thunk

也就是说,您正在做的事情可能是个坏主意。IDA 并不是真正用来生成可以重新组装的代码。通常所做的是扩展最后一部分或添加带有修补代码的新部分,然后通过调用或跳转将原始代码重定向到补丁。