前言 

          反汇编 ,一般情况大家用的不多。但在一些行业确实比较常见。比如 破解加密算法,获得加密密钥,或者自己无法写出完全一致的程序又要修改一些地方的时候反汇编就是必不可少的。反汇编是比较枯燥,又有一定挑战性的东西下面我给大家讲解如何 从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显示的 就是每个机器码对应的汇编语言。

python 自动反汇编模块 pic反汇编_寄存器

             4,去掉LINE(行号) 去掉OpCode(机器码) 只留下Address(地址)和Disassemly(汇编)这两列。右击最上边的一栏就可以去掉 相应列的勾选。

python 自动反汇编模块 pic反汇编_反汇编_02

             5,右击文本框 点击Output To File (输出文件)。这样我们就得到了。反汇编之后的文本文件了。

python 自动反汇编模块 pic反汇编_python 自动反汇编模块_03

             6,然后用以上类似的方法输出 EEPROM中的数据

           第四步 建立工程

           1,将上一步得到的文件,将扩展名由 .TEXT 改为 .asm.我们就建立新的工程将改汇编文件添加进去。

第五步 最苦逼的阶段看懂汇编加注释。

       1,这个阶段最重要的你本身必须懂汇编。

            这一步最累了 就是吧 对应的 特殊功能寄存器,从机器码改为由意义的名称。

             如  BSF 0x3.0 修改为 BSF STATUS,RP0

            值得必须注意的是你一定要知道你所修改的的寄存器 是在那个页面的。

             如同样是CLRF 0x5,

             在BANK0 代表CLRF GPIO,在BANK1 代表 CLRF TRISIO(具体代表什么你要查看对应型号的数据手册)

python 自动反汇编模块 pic反汇编_数据_04

         2,区分那些数代表  数值  那些数 代表 寄存器 那些数 代表 程序地址。这个一定要注意。

             如 :MOVLW 0x3 代表数值0x3

                    MOVWF 0x3 代表寄存器STATUS

                    GOTO  0x3   代表程序地址0x3

           3,反汇编的难点和重点,就是看懂原作者 写的程序是什么意思。在这里我只是说分享一下我的做法。

               1,一般大概猜测 对应 寄存器是什么意思 我多会将其取个有意义的名字。如计数器我就取CONTER。然后查找替换

                2,大概猜测到 子程序是什么意思 也同样给他去个有意义的名字。

               3,另外建立个文本。作为一种笔记。对于你猜测的 子程序 或者 寄存器的作用做一个记录。

               4,然后就是耐心的死磕了。

               最后变成下面的 这样子。当然要想能编译还要把前面多余的 地址列按ctrl+alt 选择去掉。

      

python 自动反汇编模块 pic反汇编_数据_05

            第六步    汇编转C

       到这一步必须事先对汇编的意思几乎都看懂了才行你就将你所理解的汇编直接改写成C就行了。

           汇编与C之间有许多明显的对应关系下来举个例子。

       

6.1 const 数组
             如 :
             汇编
                        ADDWF PCL,F
                         RETLW  0x00
RETLW  0x01
 RETLW  0x02
                         RETLW  0x03
 const   unsigned char Tab[4]={0x00,0x01,0x02,0x03} 
              
             汇编  赋值语句
                MOVLW 0x1
                MOVWF  BUF
赋值语句
                BUF = 0x1;

             汇编 与
              MOVLW  0X0F
              ANDWF  BUF
 与
              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
              {
                    ..........................
              }

     等等等 这里就不在赘述了。