反编译窗口里出现多余参数、指针被当成整数,或者返回值类型明显不对,往往需要重新指定函数原型。围绕“IDA Pro怎么修改函数原型IDA Pro函数参数和返回值识别错误如何修正”,下面介绍修改方法和检查顺序。菜单采用英文名称,伪代码操作需要对应架构的Hex-Rays反编译器。
一、IDA Pro怎么修改函数原型
修改前保留数据库副本。类型修改只影响分析结果,不会改变程序实际的传参方式。
1、找到需要修改的函数
选中局部变量后按Y,修改的是变量类型。修改整条声明,应选中函数名。
①在【Functions】窗口双击目标函数,按F5打开伪代码。
②将光标放在第一行的函数名上,按Y,打开【Set item type…】。
③没有反编译窗口时,定位到反汇编中的函数入口,按Y设置函数类型。
2、填写完整的函数声明
声明使用C语法,包含返回类型、调用约定及参数列表。优先参考匹配版本的头文件、符号和实际指令。
①在类型编辑框中填写声明,例如int __cdecl sub_401000(const char*text,int count);。
②检查参数顺序、指针符号和结尾分号,点击【OK】。
③返回伪代码,查看函数头和调用表达式;需要改函数名时,单独按N重命名。
3、修正指针与结构体类型
指针误认成整数时,伪代码中常出现地址强转或大量偏移运算。先确认访问对象,再补类型。
①已确认参数指向字符串时,把对应参数改为const char*;确认可写时再选择合适的非const类型。
②参数指向结构体时,打开【View】→【Open subviews】→【Local Types】,先建立或导入结构体定义。
③回到函数声明,将参数改为对应结构体指针,核对成员偏移与指令访问宽度。
4、按目标平台核对调用约定
32位x86的栈传参、寄存器传参与清栈方式需要区分。分析其他平台时,应按对应ABI判断,不能照搬x86规则。
①查看调用前的寄存器赋值、栈操作,以及调用后的栈恢复指令。
②按证据修正__cdecl、__stdcall等声明;不能仅凭一条ret指令确定全部参数。
③确认采用非标准寄存器传参时,再使用__usercall指定位置,例如int __usercall sub_401000
二、IDA Pro函数参数和返回值识别错误如何修正
先从出错函数及其调用位置查起。某个被调用函数的类型错误,也可能影响当前函数中的其他调用。
1、参数多了、少了或顺序不对
优化后的代码未必为每个参数单独准备一条指令,寄存器原值也可能被继续使用。需要同时查看调用端准备和函数内部读取。
①在函数入口按X打开交叉引用,选择实际调用位置。
②对照调用前的寄存器和栈数据,检查函数进入后读取了哪些输入;区分输入参数与函数内部赋值。
③回到函数名按Y,增加、删除或调整参数;C++成员函数还要核对this等隐藏参数。
④重新查看其他调用位置,确认声明能够解释多处调用,避免只适配一个样本。
2、返回值类型或宽度错误
没有使用返回值,不代表函数返回void;出口寄存器里保留了某个值,也不一定构成有效返回。函数出口与调用者后续用法都要查看。
①检查各个返回路径,记录返回值来自哪里,是否存在符号扩展、截断或浮点返回。
②跳回调用位置,查看结果用于数值比较、地址访问,还是作为其他函数的参数。
③按Y修正函数返回类型;64位程序也不能把所有返回值都设成64位整数。
④返回类型改好后,检查接收结果的局部变量。此前手动指定的变量类型可能仍需单独按Y调整。
3、间接调用异常或提示call analysis failed
函数指针、回调和虚表调用,可能缺少目标类型。
①已知直接调用目标时,进入目标函数,按Y修正原型,再查看调用者。
②只需调整某一处调用时,在伪代码的调用表达式上右键,选择【Set call type…】,输入适用于该处的声明。
③函数指针类型已经核实,但参数仍按错误方式推断时,在调用处右键选择【Force call type】。
④仍然报错时,检查当前函数的栈指针变化及其他被调用函数原型;不要为了消除报错随意补参数。
三、IDA Pro函数原型修改后怎么核对
伪代码变得简洁后,还要对照指令和调用关系确认是否改对。
1、检查修改的影响范围
修改函数本身的原型会影响相关调用;【Set call type…】针对当前调用位置,两者的使用范围不同。
①从交叉引用打开几个不同调用者,逐项比较实参数量、传递位置和返回值用途。
②发现只有一处异常时,检查该处调用类型,避免再次改动所有调用者共用的函数原型。
③对照原始指令,确认成员访问、类型转换和条件判断都有依据,再保留修改。
2、记录依据并保存数据库
部分函数只能确定参数位置和宽度,暂时无法确定业务含义。含义未定时,可暂用中性名称。
①在注释中记录类型来源、相关调用地址及尚未确认的部分。
②保存数据库;需要撤回错误类型时,在反汇编入口按Y,清空声明并确认,再重新检查推断结果。
总结
希望“IDA Pro怎么修改函数原型IDA Pro函数参数和返回值识别错误如何修正”这篇文章能帮到大家。逆向分析需要耐心,也离不开日常经验的积累。面对陌生程序,不必急着把每一处细节都解释完整,能把已有认识表达清楚,就能为后续工作提供帮助。一份可靠的分析资料,也能让团队交流更顺畅,减少理解偏差。希望大家在学习软件的过程中逐步形成自己的判断,把时间花在值得研究的问题上,在实际项目中有所收获。如果有IDA Pro软件使用或选型方面的需求,欢迎联系我们咨询。
