逆向分析細節總結

2021-07-10 02:40:34 字數 1538 閱讀 4680

1、函式識別及引數傳遞

call指令 == 跳轉指令+返回位址

call指令跳轉的位址即被呼叫函式的起始位址

函式引數傳遞方式:

1)堆疊傳遞引數

2)暫存器傳遞引數(__fastcall、thiscall(暫存器傳遞this指標))

引數入棧順序,平衡堆疊:

1)c/c++和mfc程式預設使用__cdecl呼叫約定,引數從右到左入棧,由呼叫者平衡堆疊;

2) win32 api函式使用stdcall呼叫約定,引數從右到左入棧,由被呼叫者平衡堆疊(引數個數固定,函式知道傳入的引數個數,因此被呼叫函式可在返回前用一條「retn」指令直接清理傳遞引數的堆疊);vc++預設使用。

2、函式返回值

返回方式:return返回、引用返回、全域性變數返回。

函式返回值一般放在eax中返回,若超出容量,高32位放入edx中;

在除錯程式時,不要見call就跟進,在call之前所做的所有push動作以及對暫存器的操作都可能是在給函式傳遞引數,而函式的返回值一般都放在eax裡面,當然這個值可能是乙個指標,指向乙個資料結構。從彙編角度來看,主要有如下形式:

1)通過暫存器返回函式值;

2)通過引數按引用方式返回函式值;

3)通過全域性變數返回函式值;

4)通過處理器標誌返回函式值;

一般情況下,由retrun操作符返回的值放在eax暫存器之中,如果結果超過這個暫存器的位容量,那麼該結果的高32位會載入到edx暫存器中。 如果返回乙個含有幾百個位元組的結構或者乙個近似大小的物件,編譯器會在不告訴程式的情況下,給函式傳遞乙個隱式引數,這個指標指向儲存的返回結果。

3、資料結構

區域性變數:sub esp,8 ;分配空間

push reg;分配4個位元組空間

[ebp-***];定址呼叫變數

[ebp+***];定址呼叫引數,優化模式時,通過esp暫存器對區域性變數與引數定址;

初始化:mov指令,push指令直接將值壓入堆疊;

暫存器存放:編譯器盡量使用暫存器存放區域性變數,不夠則使用堆疊;

注:區域性變數生命周期短,必須及時確定當前暫存器存放的是哪個變數;

程式執行(除錯)過程中,我們可以得到指定**段的虛擬位址(va),減去其載入基址,即為其相對虛擬位址(rva),此時可得到該**段在pe檔案的哪個區段,轉換公式為:

檔案偏移 =  rva - 節偏移 (由儲存單位差異引起的節基址差稱為節偏移)

4、啟動函式

首先我們明確,windows程式的執行並不是從winmain函式開始,首先被執行的是啟動函式相關**,這段**是編譯器生成的。這段啟動**作用是初始化程序,然後呼叫winmain( )函式。即start( ) ->winmain( )

在winmain( )函式原型中,引數hinstance(例項控制代碼)一般通過getmodulehandlea函式進行獲取,這對識別winmain函式會有些幫助。

對winmain的呼叫通常放在啟動函式**結尾部分,後面通常跟著諸如exit或xcptfilter之內的兩、三個函式。

另一標誌:___security_cookie

逆向分析技術總結

好久沒寫過文件了,今天把之前的關於逆向 分析的一些心得總結一下,反正閒著也是閒著 本文不包含什麼新的 技術,只是將 於各方的知識加上自己的心得進行總結而已,高手就不用看了 我認為軟體安全攻防其本質是分析與抗分析之間的鬥爭。因為無論安全技術做的多麼先進,一旦其 意圖被分析者掌握,就不在有安全性可言。想...

逆向分析入門

軟體病毒行為特徵的分析,通過分析病毒的特徵資訊,更好地進行反病毒軟體的編寫。閉源軟體內部演算法的理解分析,進行軟體行為的模擬,優秀演算法設計思路學習和借鑑。各類軟體的破解,去除各類軟體的限制 屌絲能用各種高大上的商業軟體 解密軟體加密演算法,解密各類加密檔案。分析其遊戲軟體的演算法設計,進行各類遊戲...

逆向分析底紋

工作需要會被要求還原某個證書底紋,一般解決的思路是到網上找,如果找到了就直接用,如果找不到了相同的就找近似的湊合用,如果連近似的底紋都沒有那我們是不是就沒有辦法了呢?有的,我們可以直接逆向分析出它最基本的單元,然後用photshop的填充功能生成即可。既然用的是逆向分析,那麼我們應該知道正向是怎麼回...