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

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

2018-10-24 16:59
7132

      前段时间一位朋友介绍一个公司的产品核心程序是国外开发的,没有提供源码支持,现在产品需要更新增加新的功能,因此很想把芯片里的程序逆向出来,公司准备了二套方案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

前言

      前段时间一位朋友介绍一个公司的产品核心程序是国外开发的,没有提供源码支持,现在产品需要更新增加新的功能,因此很想把芯片里的程序逆向出来,公司准备了二套方案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位址中
     #define  f  1     //表示用文件寄存器
     #define  w  0     //表示工作寄存器
     #define ACCESS  0   //目前RAM的位址中
     #define BANKED  1   //BSR暫存器所指定的RAM位址中

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-10-15 18:01 被sabason编辑 ,原因: 图片找不到了
收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
51不是哈佛结构吗?
2018-10-24 18:15
0
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
3
206K反编译出来有蛮多的吧。内容。反编译多久啊
2018-10-25 09:49
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
PIC 的8位指令并不多,只要花一些时间,可以全部反编译出来,也可以自己写个小调试器。用IDA会容易很多。只要对个别代码进行调整 就可以了。只是代码量太大的话,全读明白会挺累。但如果只是转成类C的代码,还是可以的。
2018-11-2 17:24
0
雪    币: 6893
活跃值: (3851)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
大佬,第一张图挂了,能补一下吗
手头有个pic16的要逆,用MPlab读memory的时候是有代码的,但是读出来的hex放到IDA里什么都分析不出来,c也c不了,很尴尬
2019-2-28 16:33
0
游客
登录 | 注册 方可回帖
返回
//