1. 程式人生 > >PC逆向之程式碼還原技術,第三講彙編中加法的程式碼還原

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下我們上面的程式碼會直接優化,沒有產生任何彙編程式碼.
原因是: 常量傳播 窺孔優化 常量摺疊. 因為上面程式碼我們並沒有用. 無意義的程式碼.所以不斷進行優化就會優化沒有.
可以參考本人編寫的詳細部落格: 部落格連結