反彙編檔案( dis檔案)的理解

2021-08-28 07:41:30 字數 1591 閱讀 5762

下面以一段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版本之間新增,刪除或更改位元組碼。不...