反匯編 ,一般情況大家用的不多。但在一些行業確實比較常見。比如 破解加密算法,獲得加密密鑰,或者自己無法寫出完全一致的程序又要修改一些地方的時候反匯編就是必不可少的。反匯編是比較枯燥,又有一定挑戰性的東西下面我給大家講解如何 從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語言constunsigned 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
{
..........................
}