本人所写的博客都为开发之中遇到问题记录的随笔,主要是给自己积累些问题。免日后无印象,如有不当之处敬请指正(欢迎进扣群 24849632 探讨问题);
写在专栏前面https://blog.csdn.net/Junping1982/article/details/129955766
INFINONE XC164单片机逆向记录(1)资料准备https://blog.csdn.net/Junping1982/article/details/129945022
特别声明:未经授权,请勿转载
---- 文接上章 -------------------------------
手册内找到的FLASH逻辑地址为0xC00000 ~ 0xC1FFFF共128K,实际上SAK-XC164CS-32F0BB的存储空间有256K,从客户读取的数据及后面介绍的开发环境中可以看得出来,这里推理一下FLASH逻辑地址为0xC00000 ~ 0xC3FFFF共256KB的存储空间。
根据以上信息,打开IDA,配置数据如下
一路OK,YES并选择芯片型号为XC164CS
IDA没有进行任何型式的反汇编工作,弹出的提示为找不到入口点,这里要说明一下,IDA是非线性反汇编工具,它是基于递规模式设计的反汇编工具,当前我自己设计的几款反汇编工具全部都是采用线性反汇编的,读了<<IDA Pro权威指南(第2版) (美)伊格尔(Chris Eagle ) 著;石华耀,段桂菊 译>>一书,书中对线性与递归反汇编的优缺点做了比较,总的来说递归反汇编对单片机程序的反汇编来说十分友好。后面有时间,有其它机会我会将目前的程序的框架改为递归反汇编的。言归正传,咱们接着上面的话题开始反编译,使用HEX View快速定位程序到C00000处,
重新选中反汇编窗口(IDA view),
选中位置C00000, 并按'C‘键,手工开启汇编
这样便将复位处的代码完成的反汇编工作,依次将中断向量处非0的地址都做下反汇编,经过整理,BOOTLOAD处启用的中断向量有
- 00H, RESET
- 10H, STKOF
- 18H, STKUF
- 28H, PRTFLT
- B2H, SSC0
- F1H, TIMER7
- 10CH, PLL/OWD
- 150H, CAN0
与客户需求有关的是RESET, SSC0, TIMER7三处中断,这里涉及主程序以及LIN线的数据中断及时隙控制,将反编译后的内容导出到ASM文件,并用记事本打开。
将SSC0的中断处用反C后得到如下代码
由代码或见,中断处使用了如下全局变量
BYTE RXD_BUFFER[10]; 0C078H
BYTE RXD_POOL[10]; 0C082H
BYTE TXD_BUFFER[10]; 0C08CH
BYTE RXD_POS; byte_C094
USHORT* word_C096 = TXD_BUFFER;
USHORT* word_C098 = RXD_BUFFER;
这样通过如此这样查找,线索更多了。