飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 945|回复: 0

[其它] [IDA使用技巧]#164: 我的代码呢?函数参数丢失的情况

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 2023-12-6 17:40:45 | 显示全部楼层 |阅读模式
    翻译:梦幻的彼岸


    让我们来看看 x86 Windows 二进制文件的反编译片段:
    missing-arg1.png
    使用相同的参数调用了相同的函数两次,最后一次似乎没有使用 GetComputerNameExW 调用的结果。
    通过切换到反汇编,我们可以看到在每次调用之前都用字符串地址初始化了eax:
    missing-arg2.png

    但是反编译器并不考虑它,因为在 x86 系统中,栈是传递参数的常用方式,而 eax 通常只是一个临时的寄存器。
    一种方法是编辑 sub_10006FC7 的原型,使用 __usercall调用约定,然后手动将 eax 添加到参数中。但当函数位于同一个二进制文件中时,通常更简单的做法是直接进入函数内部并反编译,这样反编译器就能看到函数在初始化前确实使用了 eax,从而将其添加到参数列表中:
    missing-arg3.png
    此外,esi 也被检测到是一个参数。
    如果我们现在回到调用程序,就会看到之前丢失的参数被传递给了调用程序:
    missing-arg4.png
    注意:使用非标准、自定义调用约定通常表明函数使用了手动编写的汇编代码,或者启用了整个程序优化(也称为LTO或LTCG)。
    扩展资料:
    • LTO代表链接时优化(Link Time Optimization),它是一种编译器优化技术,用于在编译时和链接时对代码进行优化。
    • LTCG是“链接时代码生成”(Link Time Code Generation)的缩写,是Microsoft Visual Studio编译器的一种优化技术。它允许编译器在链接时生成代码,以改进代码的性能和优化。


    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表