下面以一段dis檔案中**來簡單理解一下反彙編的讀法(為了方便,部分說明已經解除安裝**塊雙斜槓後面)
led.elf: file format elf32-littlearm //表明這是由led.elf檔案反彙編得到的dis檔案
//檔案格式是elf32位的,且是小端模式存放
disassembly of section .text: //說明反彙編檔案是.text
00000000 <_start>: //標號位址、標號名字
0: e59f0050 ldr r0, [pc, #80] ; 58 4: e59f1050 ldr r1, [pc, #80] ; 5c 8: e5810000 str r0, [r1]
指令位址 :號前面的數值
指令機器碼 e59f0050這一列
指令機器碼反彙編到的指令 ldr r0, [pc, #80] ; 58
/*與上面反彙編**對應的彙編***/
_start:
ldr r0, =0x11111111 // 從後面的=可以看出用的是ldr偽指令,因為需要編譯器來判斷這個數
ldr r1, =0xe0200240 // 是合法立即數還是非法立即數。一般寫**都用ldr偽指令
str r0, [r1] // 暫存器間接定址。功能是把r0中的數寫入到r1中的數為位址的記憶體中去
在反彙編中的這一句ldr r0, [pc, #80] 其實就是組合語言中的ldr r0, =0x11111111
解讀 0: e59f0050 ldr r0, [pc, #80] ; 58
首先上圖(arm中有兩級流水線),pc指向正被取指的指令,而非正在執行的指令(也就是說pc的位址值是正在執行**的位址值加上8)。故pc的位址值應該是此時的指令位址值0+8,而[pc, #80]表示0+8+80=88
,但是這是十進位制的,十進位制的88轉換為十六進製制為58,也就是我們後面可以看到的58。檢視反彙編中的指令位址為0x58所對應的指令機器碼如下圖,可以看到0x58所對應指令機器碼是11111111。到此為止可以看出反彙編檔案中的0: e59f0050 ldr r0, [pc, #80] ; 58
與彙編檔案中的ldr r0, =0x11111111的關係了吧?
直接方法解讀 0: e59f0050 ldr r0, [pc, #80] ; 58
這句**後面的注釋58 ,注釋中的58,這其實就是執行ldr r0, [pc, #80]後的指令位址值
反彙編windows的exe檔案
使用 peid 0.95 右擊複製rva位址 斷點f4執行到選定處 彙編偽指令db,dw,dd db定義位元組型別變數,乙個位元組資料佔1個位元組單元,讀完乙個,偏移量加1 dw定義字型別變數,乙個字資料佔2個位元組單元,讀完乙個,偏移量加2 dd定義雙字型別變數,乙個雙字資料佔4個位元組單元,讀完...
ARM的BIN檔案反彙編方法
最近在除錯uboot的 時,用的新版本的uboot,lowlevel init函式裡是空的,而且在鏈結檔案中也沒有發現對lowlevel init.o的鏈結。在bl lowlevel init 之前和之中加了兩個電燈,發現在bl之後的部分並沒有被執行,所以想看看具體程式有沒有執行這個函式。在網上找反...
Python位元組碼的反匯程式設計序 dis模組
該dis模組通過反彙編支援cpython 位元組碼的分析。該模組作為輸入的cpython位元組碼在檔案中定義,include opcode.h並由編譯器和直譯器使用。cpython實現細節 bytecode是cpython直譯器的實現細節。不保證不會在python版本之間新增,刪除或更改位元組碼。不...