1. 程式人生 > >逆向分析技術

逆向分析技術

是不是 動態 兩種 hand 編譯器 startup xxx 環境 .data

1.啟動函數
功能:檢索新進程命令指針,環境指針,全局變量初始化,內存堆棧初始化

比如:
GetCommandLineA 命令指針
GetStartupInfoA 啟動信息
GetModuleHandleA 執行文件基地址

編譯器自動加入的代碼:

00401020 >/$  55            push    ebp
00401021  |.  8BEC          mov     ebp, esp
00401023  |.  6A FF         push    -1
00401025  |.  68 A0504000   push    004050A0
0040102A  |.  68 7C1C4000   push    00401C7C                         ;  SE 處理程序安裝
0040102F  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
00401035  |.  50            push    eax
00401036  |.  64:8925 00000>mov     dword ptr fs:[0], esp
0040103D  |.  83EC 10       sub     esp, 10
00401040  |.  53            push    ebx
00401041  |.  56            push    esi

2.函數及其參數

反編譯分析時,將註意力集中在函數的識別以及參數的傳遞上
函數多以call(保存函數返回信息)地址為跳轉 也有動態計算或者寄存器傳地址

函數的參數傳遞方式有三種:

堆棧方式

寄存器方式

全局變量

3.函數的返回值

1. return操作符返回值

技術分享圖片
od遇到了一個bug 就是不是每個指令都會下到int3斷點 從而debug時F8單步有一些代碼是一起執行的。(這讓想起了原子操作)

一般的返回值時存放在eax寄存器中,如果超過了容量則會放到edx寄存器中。

2.通過參數按照傳引用的方式返回

註意ds和ss的區別 然後一般通過引用來傳值需要使用變量的地址,在調用某個函數時再把變量的地址傳給函數。

技術分享圖片

3.通過全局變量返回

4.數據結構

逆向算法和數據結構

1.局部變量

1.堆棧分配局部變量
在堆棧中進行分配,分配完在釋放。或者直接存放在寄存器中。
分配[ebp-xxx]
訪問[ebp+xxx]

初始化局部變量的兩種方法:
mov [ebp-xxx],5

push 5

2.利用寄存器存放局部變量

堆棧占用兩個寄存器,編譯器會利用剩下的6個通用寄存器盡可能的有效存放局部變量。寄存器不夠時才會使用堆棧,且局部變量的生命周期比較短,需要確定時那個寄存器存放的那個變量。

2.全局變量

全局變量存放在內存區,靜態pe的.data的可讀寫區域的固定地址上。訪問時即訪問硬編碼的特定地址即可。
(靜態變量 static 作用範圍有限)

如果是常量 則在只可讀區域內。

3.數組

逆向分析技術