逆向分析技術
阿新 • • 發佈:2018-07-26
是不是 動態 兩種 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.數組
逆向分析技術