前段时间一位朋友介绍一个公司的产品核心程序是国外开发的,没有提供源码支持,现在产品需要更新增加新的功能,因此很想把芯片里的程序逆向出来,公司准备了二套方案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位址中
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-10-15 18:01
被sabason编辑
,原因: 图片找不到了