PIC单片机之反汇编

2019-04-15 11:40发布

          前言            反汇编 ,一般情况大家用的不多。但在一些行业确实比较常见。比如 破解加密算法,获得加密密钥,或者自己无法写出完全一致的程序又要修改一些地方的时候反汇编就是必不可少的。反汇编是比较枯燥,又有一定挑战性的东西下面我给大家讲解如何 从BIN文件->HEX文件->汇编->C语言的全部过程。               第一步破解芯片             这个作为一般是要找专业破解芯片的公司,帮我们把芯片内的  flash 和EEPROM 中的数据读出来,从而得到BIN文件或者HEX。这一步唯一的困难点就是你要花钱。。。              第二步BIN转HEX             因为PIC的老的MPLAB 或者MPLAB X IDE。都不支持读取BIN文件。所以你必须事先将BIN文件转为HEX文件。当然你如果已经有了HEX文件这一步可以忽略。 我个人是比较喜欢用QL-2006这款单片机烧器的烧写软件将BIN转成HEX。              第三步将HEX转成汇编         1,打开 MPLAB IDE  Configure->Select Chip 选择芯片型号。              2, 点击菜单栏File->Import 导入HEX文件。              3,查看程序存储空间点击菜单栏 View ->Progarm Memory 跳出Progarm Memory 窗口选择点击选择Machine,Machine显示的 就是每个机器码对应的汇编语言。
             4,去掉LINE(行号) 去掉OpCode(机器码) 只留下Address(地址)和Disassemly(汇编)这两列。右击最上边的一栏就可以去掉 相应列的勾选。
             5,右击文本框 点击Output To File (输出文件)。这样我们就得到了。反汇编之后的文本文件了。
             6,然后用以上类似的方法输出 EEPROM中的数据            第四步 建立工程            1,将上一步得到的文件,将扩展名由 .TEXT 改为 .asm.我们就建立新的工程将改汇编文件添加进去。           第五步 最苦逼的阶段看懂汇编加注释。        1,这个阶段最重要的你本身必须懂汇编。             这一步最累了 就是吧 对应的 特殊功能寄存器,从机器码改为由意义的名称。              如  BSF 0x3.0 修改为 BSF STATUS,RP0             值得必须注意的是你一定要知道你所修改的的寄存器 是在那个页面的。              如同样是CLRF 0x5,              在BANK0 代表CLRF GPIO,在BANK1 代表 CLRF TRISIO(具体代表什么你要查看对应型号的数据手册)
         2,区分那些数代表  数值  那些数 代表 寄存器 那些数 代表 程序地址。这个一定要注意。              如 :MOVLW 0x3 代表数值0x3                     MOVWF 0x3 代表寄存器STATUS                     GOTO  0x3   代表程序地址0x3            3,反汇编的难点和重点,就是看懂原作者 写的程序是什么意思。在这里我只是说分享一下我的做法。                1,一般大概猜测 对应 寄存器是什么意思 我多会将其取个有意义的名字。如计数器我就取CONTER。然后查找替换                 2,大概猜测到 子程序是什么意思 也同样给他去个有意义的名字。                3,另外建立个文本。作为一种笔记。对于你猜测的 子程序 或者 寄存器的作用做一个记录。                4,然后就是耐心的死磕了。                最后变成下面的 这样子。当然要想能编译还要把前面多余的 地址列按ctrl+alt 选择去掉。                    第六步    汇编转C        到这一步必须事先对汇编的意思几乎都看懂了才行你就将你所理解的汇编直接改写成C就行了。            汇编与C之间有许多明显的对应关系下来举个例子。             6.1 const 数组              如 :              汇编                         ADDWF PCL,F                          RETLW  0x00                          RETLW  0x01                          RETLW  0x02                          RETLW  0x03
               对应C语言 const   unsigned char Tab[4]={0x00,0x01,0x02,0x03}                              汇编  赋值语句                 MOVLW 0x1                 MOVWF  BUF              C语言 赋值语句                 BUF = 0x1;
             汇编 与               MOVLW  0X0F               ANDWF  BUF               C语言  与               BUF  &= 0x0F                              汇编  左移             MOVLW 0x4             MOVWF  COUTER;                BCF  STATUS,C RLF_LOOP
              RLF   BUF              DECFSZ  COUTER,F              GOTO     RLF_LOOP              C语言 左移              BUF <<=4;
           汇编   数据指针             MOVLW   TEMP              MOVWF  pBUF              MOVFW  FSR              MOVLW   0x2              ADDWF  INDF.F              C语言  数据指针               unsigned char * pBUF;               pBUF = &TEMP;               *pBUF +=2;                             汇编 判断相等               MOVFW  A               XORWF B,W               BTFSS STATUS,Z               GOTO    ELSE               .............................. ELSE
           ...............................              C语言  判断相等              if(A==B)              {                   ...........................              }              else               {                     ..........................               }
     等等等 这里就不在赘述了。