首页
社区
课程
招聘
[原创]关于PIC芯片逆向一些思路
2018-10-24 16:59 6190

[原创]关于PIC芯片逆向一些思路

2018-10-24 16:59
6190

前言

      前段时间一位朋友介绍一个公司的产品核心程序是国外开发的,没有提供源码支持,现在产品需要更新增加新的功能,因此很想把芯片里的程序逆向出来,公司准备了二套方案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编辑 ,原因: 图片找不到了
收藏
点赞1
打赏
分享
最新回复 (4)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luskyc 2018-10-24 18:15
2
0
51不是哈佛结构吗?
雪    币: 1412
活跃值: (4278)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2018-10-25 09:49
3
0
206K反编译出来有蛮多的吧。内容。反编译多久啊
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2018-11-2 17:24
4
0
PIC 的8位指令并不多,只要花一些时间,可以全部反编译出来,也可以自己写个小调试器。用IDA会容易很多。只要对个别代码进行调整 就可以了。只是代码量太大的话,全读明白会挺累。但如果只是转成类C的代码,还是可以的。
雪    币: 9389
活跃值: (3331)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Lightal 2 2019-2-28 16:33
5
0
大佬,第一张图挂了,能补一下吗
手头有个pic16的要逆,用MPlab读memory的时候是有代码的,但是读出来的hex放到IDA里什么都分析不出来,c也c不了,很尴尬
游客
登录 | 注册 方可回帖
返回