在IDA Pro里看函数时,很多人前面的问题不是不会反编译,而是参数一旦识别错,后面整段伪代码都会跟着乱。参数少了,调用现场像缺东西;参数多了,函数签名又会显得很假。Hex-Rays官方文档对这件事说得很直接,反编译器能自动推断函数类型、调用约定和参数数量,但它并不是每次都能猜对;一旦函数类型不正确,就应该手工修改。
一、IDA Pro怎么恢复函数参数
恢复函数参数时,不要一上来就在每个调用点里乱改。更稳的做法,是先把函数本体的原型修正过来,再回头看个别调用点是不是还需要单独补。Hex-Rays官方说明里明确写到,Set type这条命令本来就能直接修改函数原型,而且在修改当前函数原型时,可以添加或删除函数参数、修改返回类型、修改调用约定。
1、先把光标放到函数原型上按【Y】
官方文档说明,Set type的快捷键就是【Y】。如果你是在伪代码窗口里操作,把光标放到函数声明位置再按【Y】,就能直接改整个函数类型;如果反编译器原先识别少了参数或多了参数,这一步就是最直接的恢复入口。
2、参数数量错了就直接在函数原型里补齐或删掉
Hex-Rays官方写得很清楚,修改当前函数原型时,可以增加或删除参数。如果你已经从调用现场确认这函数本来该有三个参数,而现在只识别出两个,就不要只在调用点里脑补,先把函数原型本身改对,后面的伪代码通常会一起顺下来。
3、调用约定不对时先一起改
参数识别错误,很多时候并不是参数本身坏了,而是调用约定先错了。官方文档明确提醒,调用约定、参数数量和参数类型都必须正确;如果它们不对,反编译结果就会被带偏。所以恢复参数时,不要只盯着参数个数,还要顺手把调用约定一起改到合理状态。
4、栈分析有问题时先修栈,再谈参数
如果你发现函数参数一直识别不稳,尤其是栈上传参函数总是多一截、少一截,就不要只在函数签名里硬改。Hex-Rays官方问题列表说明,这时要先检查栈指针变化,也就是【Edit】【Functions】【Change stack pointer】,必要时再到【Edit function】里修改返回时清理的字节数。栈追踪一旦错了,参数恢复就很难真正站稳。
二、IDA Pro函数参数类型怎么手动修改
参数类型手动修改,最好分两层看。一层是改整个函数原型里的参数类型,另一层是只改某一个调用点的参数解释。Hex-Rays官方把这两种场景拆成了不同命令,所以更稳的顺序不是一把梭全改,而是先判断你要改的是“函数本身”,还是“这一次调用”。
1、改函数本体参数类型还是按【Y】
官方文档说明,如果在伪代码窗口第一行操作,而且光标正放在参数声明上,Set type会修改当前函数参数的类型;如果光标不在参数声明上,它就会修改整个函数类型。也就是说,想改函数签名里某个参数的正式类型,最直接的动作还是【Y】。
2、间接调用看不准时用【Set call type】
如果问题不在函数原型,而是在某个具体调用点上,比如一个函数指针调用、虚调用或间接调用参数看着不对,官方给出的专门命令是Set call type。Hex-Rays文档明确说明,这个命令只修改当前调用点的类型,不会改掉被调函数自己的原型,所以特别适合做局部修正。
3、反编译器漏参时再用【Force call type】
有些情况下,调用对象本身的类型其实是对的,但反编译器在当前调用点漏掉了参数分析。官方对Force call type的解释很直接,它会让反编译器停止自己做调用参数分析,而是直接采用调用对象的类型。对虚表调用、寄存器传参和某些优化代码,这一步很有用。
4、函数类型一直改不稳时先查相关类型定义
Hex-Rays故障页提到,如果类型本身不正确,或者引用了未定义类型,反编译结果也会跟着出问题。也就是说,参数类型怎么改都不顺时,不一定是当前函数坏了,也可能是结构体、函数指针或被调对象的类型源头本来就没定义好。
三、IDA Pro参数识别错位先改哪里
真正容易返工的地方,往往不是不会按【Y】,而是顺序反了。明明是栈追踪错了,却先在函数声明里反复改参数;明明只是某一个间接调用解释不对,却把整个函数原型全改掉。更稳的做法,通常是先分清问题落在函数本体、调用点,还是栈分析。这样改,通常比一上来就对着伪代码硬修参数更快收住。
1、先看是不是函数原型整体错了
如果同一个函数在多个地方都表现出参数数量不对、类型不对,那优先就该改函数原型本身。因为这种情况通常说明问题在函数签名这一层,而不是单个调用点。官方文档也明确把【Y】定义成修改函数原型的主要入口。
2、再看是不是只有某个调用点解释错了
如果函数本体大体没问题,只有某次调用特别怪,尤其是虚调用、回调、函数指针调用这种场景,就先用Set call type或Force call type去做局部修正,不要急着把整个函数类型推翻。
3、最后才查栈和清栈字节
如果你发现参数数量总在飘,或者调用约定怎么看都不顺,这时再回头查栈指针变化和函数返回时清理的字节数。Hex-Rays官方问题列表已经把这条路径说得很清楚,这类底层分析一旦错了,表面上的参数恢复往往都不稳定。
总结
IDA Pro里恢复函数参数,真正要先做的不是“多看几眼伪代码”,而是先判断问题落在函数原型、调用点,还是栈分析。函数本体错了,就直接用【Y】把参数数量、类型和调用约定改正;只有单个调用点解释不对,就用Set call type或Force call type做局部修正;如果参数总是飘,再回头查栈指针和清栈字节。顺着这条线往下改,参数通常会比一开始就到处手补更容易恢复干净。
