零、前置知識
1、數據類型修飾符
名稱 | 解釋 |
---|---|
byte | 一個字節,8bit |
word | 單字,占2個字節,16bit |
dword | 雙字,占4個字節,32bit |
qword | 四字,占8個字節,64bit |
2、關鍵詞解釋
ptr
:它代表 pointer(指針)的縮寫。這個關鍵字在匯編代碼中的作用是用來臨時指定或轉換操作數的類型。這可以類比于C語言中的強制類型轉換。
一、控制流指令
1、JMP
無條件內存地址跳轉
jmp 0x00007FF97543C47C
//直接跳轉到內存地址00007FF97543C47C
2、CALL
3、RET
4、JZ /JE
通過
ZF
標志位是否跳轉,當執行到JZ
或者JE
指令時,如果ZF=1
則跳轉,如果ZF=0
,不跳轉.
二、邏輯運算指令
1、AND
2、OR
3、NOT
4、XOR
三、算術運算指令
1、ADD
加法運算:6進制的減法和十進制類似,只不過向上進是逢16進一。
語法格式:add
被加數 加數
add rsp 38
//rsp是寄存器,假定rsp內值為58,則以上式子等同于rsp=rsp+28.
2、SUB
減法運算:16進制的減法和十進制類似,只不過向上借位借的是16。
語法格式:sub
被減數 減數
sub rsp 28
//rsp是寄存器,假定rsp內值為58,則以上式子等同于rsp=rsp-28.
3、MUL/IMUL
4、DIV/IDIV
5、MOD
6、CMP
用于比較兩個操作數的大小的指令,內置一個減法運算,CMP指令的結果會影響處理器的標志位,這些標志位隨后可以用于條件跳轉指令
JE或者JZ
,從而實現類似于高級語言中的if語句的邏輯結構。
語法格式:cmp
目的操作數 源操作數 (被減數 減數)
標記位:ZF零標志位,CF進位標志位,SF符號標志位,OF溢出標志位。
解釋:
ZF
:當 cmp 指令執行減法運算后結果為 0 時,ZF 標志位會被置為 1;若結果不為 0,則 ZF 置為 0。
CF
:cmp 指令執行減法運算后,如果被減數小于減數,就會產生借位,此時 CF 標志位置為 1;若沒有借位,CF 置為 0。
SF
:當 cmp 指令執行減法運算后結果為負數時,SF 置為 1;結果為正數或 0 時,SF 置為 0。
OF
:對于減法運算,如果運算結果超出了其類型所能表示的范圍,就會發生溢出,此時 OF 標志位置為 1;若沒有溢出,OF 置為 0。
四、數據傳輸指令
1、MOV
把源操作數的值傳遞給目的操作數
語法格式:mov
目的操作數 源操作數
目的操作數可以是寄存器REG
,存儲器MEN
和段寄存器SEG
。
同時注意以下mov
的使用范圍和規范。
對于無法直接傳送的,可以考慮采用AX進行橋梁傳遞數據。
mov rax, qword ptr ds:[0x0000000000405560]
//DS是段寄存器,DS:0x0000000000405560代表段:偏移,指向某一個具體的內存地址
五、特殊指令
總結:
匯編語言是逆向工程的基礎,本篇主要記錄在逆向工程過程中遇到的不懂的匯編語法和語句,對其進行相應的記錄和分析。