PC逆向之程式碼還原技術,第三講彙編中加法的程式碼還原
目錄
PC逆向之程式碼還原技術,第三講彙編中加法的程式碼還原
一丶彙編簡介
在講解加法的程式碼還原之前.我們首先要知道. 加法在彙編中對應的指令是什麼.
Add 彙編指令. Add x,y 將x的值 加上y 並且重新賦值給x
二丶高階程式碼對應彙編觀看.
觀看如下程式碼
int main(int argc, char* argv[]) { 1 + 2; int nValue = 10 + 2; //常量 + 常量 int nVar = nValue + 10; //變數 + 常量 int nVar3 = nValue + nVar; //變數 + 變數 return 0; }
有四種方式
第一種 直接 空語句 1 + 2 ;
第二種 常量 + 常量
第三種 變數 + 常量
第四種 變數 + 變數
1.程式碼還原解析:
程式碼還原解析需要了解的知識:
reg: 代表任意通用暫存器
imm: 立即數,可以看做常量
? : 代表任意數值.可以 [ebp -?]可以確定那個變數,變數是在棧中存放的.
第一種方式
此語句並不會產生作用.所以不會產生對應的彙編程式碼.- 第二種方式
常量 + 常量 會在編譯的時候直接進行優化. 如上面程式碼 10 + 2 產生的對應彙編程式碼為
mov [ebp - ?],0xC
- 第三種方式:
第三種方式是變數+ 常量. 在彙編中.變數 + 常量並不能直接操作.需要交給暫存器進行中轉
所以會產生如下表達式
mov reg,[ebp - ?]
add reg,imm
mov [ebp - ?],reg
上面程式碼對應:
.text:0040126F mov eax, [ebp+ - 4]
.text:00401272 add eax, 0Ah
.text:00401275 mov [ebp - 4], eax
- 第四種方式
第四種方式 變數+變數
變數 + 變數 不用想,肯定是交給暫存器中轉.
產生程式碼定式:
mov reg,[ebp - ?] add reg,[ebp - ?] mov [ebp - ?],reg
上面程式碼產生的彙編程式碼.IDA中檢視.
.text:00401278 mov ecx, [ebp+var_4]
.text:0040127B add ecx, [ebp+var_8]
.text:0040127E mov [ebp+var_C], ecx
三丶根據上圖完整彙編程式碼進行還原總結
text:00401250 _main_0 proc near ; CODE XREF: _main↑j
.text:00401250
.text:00401250 var_4C = byte ptr -4Ch
.text:00401250 var_C = dword ptr -0Ch
.text:00401250 var_8 = dword ptr -8
.text:00401250 var_4 = dword ptr -4
.text:00401268 mov [ebp+var_4], 0Ch 常量賦值給變數
.text:0040126F mov eax, [ebp+var_4] 三句程式碼可以看成一句
.text:00401272 add eax, 0Ah 變數 + 常量
.text:00401275 mov [ebp+var_8], eax
.text:00401278 mov ecx, [ebp+var_4] 三句程式碼可以看成一句
.text:0040127B add ecx, [ebp+var_8] 變數 + 變數 結果給變數
.text:0040127E mov [ebp+var_C], ecx
.text:00401289 _main_0 endp
.text:00401289
總結
根據上面加法的程式碼以及彙編對應的程式碼.我們可以產生程式碼定式
常量 + 常量 常量直接進行優化.不會產生彙編程式碼.如果賦值給變數則產生彙編程式碼
mov [ebp - ?],imm
常量 + 變數 賦值給變數 會產生彙編程式碼.此時我們心中要知道.如果操作變數相加.則肯定需要暫存器
中轉.所以會產生彙編程式碼
mov reg,[ebp - ?]
add reg,imm
mov [ebp - ?] reg
變數 + 變數 賦值給變數 操作了變數.那麼心中自然知道.會操作暫存器. 而彙編允許暫存器+棧中的值
所以可以產生程式碼定式
mov reg,[ebp - 4] 變數1
add reg,[ebp - 8] 變數2
mov [ebp - c],reg 變數3
三個程式碼可以看成 變數 + 變數 賦值給了變數
注意:上面為Debug版本下產生的程式碼定式. 在Releas下會進行優化.
在Releas下我們上面的程式碼會直接優化,沒有產生任何彙編程式碼.
原因是: 常量傳播 窺孔優化 常量摺疊. 因為上面程式碼我們並沒有用. 無意義的程式碼.所以不斷進行優化就會優化沒有.
可以參考本人編寫的詳細部落格: 部落格連結