行业解决方案
查看所有行业解决方案
IDA 用于解决软件行业的关键问题。
发布时间:2026-07-30 11: 40: 00
IDA Pro分析ARM程序时,函数参数不一定会完整显示在F5伪代码中,特别是程序缺少符号、函数原型识别错误或使用自定义调用方式时。处理“IDA Pro怎么判断ARM架构的调用约定IDA Pro分析ARM参数传递时要看哪些寄存器”时,需要先区分AArch32和AArch64,再从调用指令前后的寄存器赋值、栈空间和返回值位置判断参数。
一、IDA Pro怎么判断ARM架构的调用约定
ARM程序通常遵循AAPCS调用规则,但32位和64位使用的寄存器不同。进入函数后,可以先根据寄存器名称判断当前架构。
1、确认是AArch32还是AArch64
①使用IDA Pro打开目标文件,等待自动分析完成。
②进入任意一个代码函数,查看反汇编中的寄存器名称。
③出现R0至R15、SP、LR和PC时,通常属于AArch32。
④出现X0至X30、W0至W30、SP和LR时,属于AArch64。
⑤按F5打开【伪代码】窗口,检查IDA Pro当前生成的函数声明。
W0是X0的低32位。函数使用W0传递参数时,通常表示当前参数按32位数据处理;使用X0时,则可能是64位整数或指针。
2、判断函数是否遵循常规调用规则
①在反汇编窗口中找到BL或BLX调用指令,AArch64间接调用还可能显示为BLR。
②向上查看调用指令前连续出现的寄存器赋值。
③记录被写入的参数寄存器。
④进入被调用函数,查看这些寄存器是否在重新赋值前被读取。
⑤检查函数返回后,调用者是否立即读取返回值寄存器。
调用前写入、函数入口读取,并且多个调用位置保持相同规律时,通常可以按照标准调用约定恢复函数原型。
二、IDA Pro分析ARM参数传递时要看哪些寄存器
AArch32通常使用R0至R3传递前四个通用参数,额外参数放入栈中;AArch64通常使用X0至X7传递前八个通用参数。浮点参数是否进入浮点寄存器,还要结合目标文件采用的浮点调用规则判断。
1、AArch32参数寄存器
(1)R0至R3用于传递前四个整数、指针或符合条件的参数。
(2)超出四个的参数通常放在栈中,通过SP附近的地址读取。
(3)普通返回值通常位于R0,64位结果可能同时使用R0和R1。
(4)R4至R11通常由被调用函数负责保存,不应直接按入口参数判断。
(5)R14也叫LR,用于保存函数返回地址。
检查AArch32函数参数时,可以按照下面的步骤操作。
①定位目标函数的一个调用位置。
②查看BL或BLX前对R0、R1、R2和R3的赋值。
③检查调用前是否还有PUSH、STR或调整SP的指令。
④进入被调用函数,确认R0至R3和栈参数分别在哪里首次使用。
⑤函数返回后,检查调用者如何使用R0和R1。
2、AArch64参数寄存器
(1)X0至X7用于传递前八个整数、地址或普通参数。
(2)32位参数使用对应的W0至W7。
(3)超出八个的参数通常通过栈传递。
(4)普通整数或指针返回值一般位于X0。
(5)浮点和向量参数通常使用V0至V7。
(6)较大的结构体返回值可能通过X8传入结果保存地址。
检查AArch64参数时,可以按照下面的步骤操作。
①找到BL或BLR调用指令。
②向上检查X0至X7或W0至W7的最后一次赋值。
③记录调用前对SP附近内存的写入,确认是否存在额外参数。
④进入被调用函数,查看入口位置首先读取了哪些参数寄存器。
⑤函数返回后检查X0、W0或V0如何被使用。
三、IDA Pro识别的参数不正确怎么办
IDA Pro可能把临时寄存器误认为参数,也可能漏掉对象指针、结构体返回地址或浮点参数。此时应根据调用位置重新设置函数原型。
1、重新设置函数类型
①进入参数识别错误的函数。
②按F5打开【伪代码】窗口。
③将光标放在第一行函数声明上。
④按Y键打开【设置类型】窗口。
⑤根据调用位置补充返回类型、参数数量和参数类型。
⑥确认修改后返回调用者,再按F5刷新伪代码。
IDA Pro允许在修改函数原型时增加或删除参数、调整返回类型并更改调用约定。
2、检查容易被忽略的隐藏参数
(1)C++成员函数的对象地址通常位于R0或X0。
(2)JNI函数前两个参数通常是JNIEnv*和jobject或jclass。
(3)较大结构体返回时,编译器可能增加隐藏的结果地址参数。
(4)浮点参数可能位于S、D或V寄存器中,没有出现在通用寄存器内。
(5)尾调用可能直接跳转到下一个函数,无法按照普通调用指令判断参数。
3、处理非标准寄存器传参
手写汇编、固件函数或经过特殊优化的代码,可能不遵循标准AAPCS规则。这类函数需要明确记录每个参数所在的寄存器。
①检查至少两个调用位置,确认相同参数是否始终进入同一个寄存器。
②记录返回值实际使用的寄存器。
③将光标放在函数声明上,按Y键打开【设置类型】。
④使用IDA Pro的__usercall方式指定参数和返回值位置。
⑤确认后重新生成伪代码,并检查多个调用位置。
__usercall可以显式指定参数与返回值所在的寄存器,不受平台默认调用约定限制。
总结
处理“IDA Pro怎么判断ARM架构的调用约定IDA Pro分析ARM参数传递时要看哪些寄存器”时,AArch32应重点检查R0至R3和栈参数,AArch64应重点检查X0至X7、V0至V7以及栈空间。参数识别异常时,还要检查对象指针、结构体返回地址、浮点参数和自定义寄存器传参。完成函数原型修改后,应返回多个调用位置验证参数顺序和返回值类型。希望本文对大家了解IDA Pro中的ARM调用约定和参数寄存器有所帮助。
展开阅读全文
︾