前言
前段时间一位朋友介绍一个公司的产品核心程序是国外开发的,没有提供源码支持,现在产品需要更新增加新的功能,因此很想把芯片里的程序逆向出来,公司准备了二套方案1.做正向开发,2.找逆向人员做逆向开发。因考虑到产品稳定性与开发周期的问题,公司决定还是用第二个方案了。朋友找到了我,我之前一直是有做PC端x86架构的逆向的,51芯片与stm32芯片也比较熟做过一些产品,PIC芯片确实不熟,之前也没有做过相关研究,但朋友的信任又不好推辞,只好说我试试吧。
程序分析
拿到公司提供的hex文件以及相关电路原理图,通过IDA软件打开其hex文件,选择如下
还好,IDA处理器里支持PIC芯片的静态分析,不然需要自己来写hex2asm那就工作量太大了
还好,产品用的芯片型号也支持。
用一下F5不支持,看来只能纯手工翻译了。
网上找到pic芯片的开发IDE安装MPLAB IDE v8.80,安装其编译工具mcc18,找了一个样例工程编译后,生成hex文件然后与现有工程对比,发现上面的 b loc_seg001_1F73C就是程序入口,通过C018I.c文件编后的汇编与现工程对比,终于有了头绪。
因为之前没有接触过PIC的指令,需要先学习一下PIC芯片的指令,网上搜
找了一几个PIC汇编指令的资料,熟悉一下指令,还好指令不多,全部学习了一遍慢慢非常喜欢这个芯片了,这芯片虽然只是8位的芯片,但确有三方做了浮点支持库,哈佛结构的,从两个独立的存储空间分别取指令和存取操作数,数据处理能力大大增加,相应的功耗也很低,做出来的产品稳定性很好。
指令理解做些总结
1.PIC指令与x86及51之类的冯-纽曼结构的不一样,他的指movff byte_RAM_3EE, POSTINC1如这样,第一个关键字movff是操作指令,后面的操作数或是寄存器表达式还是有些类似但,但指令处理操作数顺序不一样,比如上面的byte_RAM_3EE, POSTINC1是把RAM中3EE地址的数据给POSTINC1这个寄存器,这个POSTINC1有些特殊,用了后会对地址自动加1,有些象C语言里的指针,也就可以直接理解成指针寄存器吧。
2.理解f,w,ACCESS,BANKED之类的意思。
好多指令后面会带ACCESS,或是f,或是BANKED
#define f 1 //表示用文件寄存器
#define w 0 //表示工作寄存器
#define ACCESS 0 //目前RAM的位址中
#define BANKED 1 //BSR暫存器所指定的RAM位址中
上面这些宏定义,主要是可以写测试,就是可以把IDA中的汇编代码用_asm ... _endasm包起来后,在IDE工具就进行调试,通过观查相关寄存器的情况,从而可以更好的理解PIC的指令。
3.理解软堆栈,函数进出堆栈的保护
比如下面代码
seg001:00018048 D9 CF E6 FF movff FSR2L, POSTINC1 相当于x86架构的 push ebp
seg001:0001804C E1 CF D9 FF movff FSR1L, FSR2L 相当于
x86架构的 mov ebp,esp
seg001:00018050 04 0E movlw 4
seg001:00018052 E1 26 addwf FSR1L, f, ACCESS
相当于x86架构的
add esp,4
对比x86的指令相信可以很好的理解了,可以看出这个函数的局部变量用了4个字节
3.几个需要注单的地址,因为IDA对汇编指令解析错误的原因
bsf byte_RAM_7E, 3, ACCESS ; 这里注意了没有用到bank所以不能翻译成byte_RAM_7E,而应翻译成F7的地址也就是
BAUDCON1
也就是 这样指令实际为 BSF BAUDCON1, 0x3, ACCESS
另外几个特殊指令理解这个图比较清淅
逆向的方法
用到的方法,主要是用IDE编译其样例程序,然后对比是指令序列,做对应的C语言转换,这个方法当然也可以用在其它一些单片机的逆向中,没有什么技术含量,主要是体力活,我通过此方法把206KB的hex成功全部工程逆向了出来,然后用MPLAB IDE v8.80编译生成的hex文件与原芯片中的hex指令对比是一样的,烧入芯片后测试产品,产品功能性能及稳定性完全一样。终于完美完成全工程的逆向,没有让朋友失望。我在这里也就不多详细讲其中一些细节了。最主要的是提供一个解决问题的思路而已,如果有朋友在逆向PIC芯片时遇到什么问题
或是遇到难点,可以加我QQ:19699100一起交流。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2019-10-15 18:01
被sabason编辑
,原因: 图片找不到了