当8051固件被导入IDA Pro以后,代码里通常看不到清楚的main函数提示,想理清程序的整体逻辑,就不得不先把复位入口、中断向量和寄存器的具体用途逐一标出来。从低地址区域开始排查,再顺着跳转关系往下追,通常就能找到真正的中断服务程序。
一、IDA Pro反汇编51时中断入口怎么找
标准8051的中断入口都在固定地址上,即使芯片厂商后来又扩展了新的外设中断,这些基础向量也足够搭起最初的分析框架。
1、先跳到复位地址
在IDA Pro里用跳转功能进入0000H,这个位置一般会放一条LJMP或AJMP,顺着它就能跟到启动代码,再往下就是堆栈初始化、RAM清理、外设配置和主循环入口。
2、逐个检查基础向量
接着依次查看0003H、000BH、0013H、001BH、0023H这几个固定地址,它们分别对应外部中断0、定时器0、外部中断1、定时器1和串口中断。Intel 8051的手册里也明确写着,中断服务入口就是分配到这些位置的。
3、跟踪跳转目标
向量地址本身能放的代码非常短,实际项目几乎都会在这里写一条LJMP,再跳到真正的中断处理函数。进入目标地址后,往下找有没有PUSH、POP、清除标志位这些操作,以及末尾的RETI指令,只要看到RETI,基本就可以认定这一段属于中断服务程序。
4、及时修改名称
确认好每个入口之后,顺手把默认标签改成isr_timer0、isr_uart、isr_ext0这类可读的名字,再通过交叉引用去查看哪些代码路径会通向这里,IDA正好可以维护代码和数据之间的引用关系,方便顺着调用链继续往下分析。
二、IDA Pro反汇编51里寄存器作用怎么区分
8051的寄存器数量不算多,但用法相当灵活,同一个R0在这里可能只是个普通变量,换到另一处又被当成地址指针,所以必须结合具体的指令来判断。
1、先看A和B
累加器A主要负责加减、逻辑、比较和数据搬运这类操作,而B则经常配合A做乘法和除法,偶尔也被程序当作临时变量来用。一旦碰到MUL AB或DIV AB这样的指令,就要把A和B合在一起理解。
2、区分R0到R7
R0到R7属于工作寄存器,实际用到哪一组,要去看PSW里的寄存器组选择位。其中R0和R1还支持间接寻址,如果指令里出现了 R0或 R1,就说明程序正在拿这个寄存器当指针,去访问内部RAM中的某个位置,而不是直接去读寄存器里存的那个数值。
3、重点看DPTR
DPTR是一个16位的数据指针,主要用来查表和访问外部数据。看到MOVC A, A+DPTR时,一般表示从代码区取表格数据;而MOVX A, DPTR或者MOVX DPTR,A这类指令,则通常在访问外部RAM或者映射到外部地址的外设。8051的指令资料里,也明确把MOVC和MOVX的访问对象区分开了。
4、结合PSW和SP判断现场
PSW里保存着进位、溢出、奇偶校验和当前选用的寄存器组,SP则是堆栈指针。进入中断后如果看到一串连续的PUSH,退出前又跟着一串对应的POP,那基本就是在保存和恢复现场;要是这两组指令的顺序没对齐,中断返回后就很容易把寄存器的内容弄乱。
三、IDA Pro分析51程序时还要检查什么
中断入口和基本寄存器的用途标清楚之后,还需要继续盯住那些特殊功能寄存器和位操作,因为很多外设逻辑只改动一个位,并不会出现完整的字节赋值。
1、标出常见SFR
像P0、P1、P2、P3、TMOD、TCON、SCON、IE、IP这些特殊功能寄存器,都需要对照芯片手册重新命名。它们在代码里通过直接寻址被访问,所以每当看到一个固定地址在做读写,就要先判断它是不是某个外设的控制或状态寄存器。
2、注意位操作
SETB、CLR、JB、JNB、JBC这类指令,经常被用来控制端口电平、查询中断标志或者判断外设状态,虽然看上去只有短短几条指令,但可能已经完成了一次完整的外设控制,不能轻易跳过。
3、扩展芯片继续查手册
很多在标准8051基础上扩展的芯片,会额外增加定时器、ADC、CAN、USB等外设中断。基础向量查完以后,还必须对照具体芯片的手册把那些扩展的中断入口也补齐,不能把标准向量表当成中断资源的全集。
总结
用IDA Pro分析8051固件时,一般先从复位地址0000H切入,再依次检查0003H、000BH、0013H、001BH、0023H这几个基础中断向量,沿着LJMP和AJMP找到真正的服务函数。区分寄存器作用时,可以把A和B放在运算和搬运这条主线上,留意R0和R1在间接寻址时变成指针的情形,再看DPTR是去了代码区还是外部数据空间,最后用PSW和SP来判断寄存器组的切换和中断现场的保护。把中断向量、特殊功能寄存器和位操作都标清以后,固件的整体逻辑就会好懂很多。
