寄存器 |
名稱 |
常見用途(未完) |
eax |
累加器(Accumulator) | 函數返回值
|
ebx | 基址寄存器(Base) | 可作為存儲指針來使用
|
ecx |
計數器(Counter) |
在循環和字符串操作時,用來控制循環次數 __thiscall中傳遞this指針 |
edx |
數據寄存器(Data) |
|
esp |
堆棧指針寄存器(Stack) |
|
ebp |
基地址指針寄存器(Base) |
|
esi |
源地址寄存器(Source Index) |
|
edi |
目的地址寄存器(Destination) |
push | 把一個32位的操作數壓入堆棧,這個操作會導致esp減4. |
pop | 與push相反,esp加4,一個數據出棧 |
call | 調用函數。將下一條指令的地址壓棧,然后跳轉到所調用函數的開始處,本質相當于push+jump |
ret | 與call相對應,跳轉到棧頂數據所指的地址,本質相當于pop+jump。對于_cdecl 調用的函數,通常會在ret之后進行exp-[n],用于清理調用參數堆棧 |
xor | 異或,常用于清零操作,例如: xor eax eax |
lea | 取得地址(第二個參數)后放入前面的寄存器中。 |
stosw | 將eax中的數據傳送給edi,之后edi+4。常與rep一起使用,用于初始化內存段 |
rep | 當eax>0時,重復后面的指令 |
jp,jl,jge | 根據eax中值與0的關系跳轉 |
cmp | 比較指令,將結果放入eax中,往往是jp,jl,jge之類跳轉指令的執行條件 |
調用方式 |
簡要說明 |
堆棧清理 | 參數傳遞規則 |
_cdecl | C 編譯器的默認調用規則 | Caller |
從右到左 |
_stdcall | 又稱為WINAPI | Callee |
從右到左 |
__thiscall | C++成員函數調用方式 |
Callee | this放入ecx,其他從右到左 |
__fastcall |
Callee |
前兩個等于或者小于DWORD大小的參數放入ecx和edx,其他參數從右到左 |
3.在堆棧中預留一個區域用于保存局部變量。方法是將esp減少一個數值,這樣就等于壓入了一堆變量。要恢復的時候直接把esp回復成ebp保存的數據就可以了。
4.保存ebx、esi、edi到堆棧中,函數調用完成后恢復。
5.(debug版)把局部變量全部初始化為0xcccccccch.
6.然后執行函數的具體邏輯。傳入參數的獲取為:ebp+4為函數的返回地址;ebp+8為第一個參數,ebp+12為第二個參數,以此類推。
7.回復ebx、esi、edi、esp、ebp,最后返回。如果有返回值,在返回之前將保存在eax中,供調用方式用。
調用方:
switch的特點是有多個判斷。因為switch顯然不會判斷大于小于,所以都是je,分別跳轉到每個case處,最有一個是無條件跳轉,直接跳到default處。
對于break,會增加一個無條件跳轉語句,跳轉至結尾
標志著可能是swith語句
對于以下代碼:
for循環中所對應的匯編為
對于結構體數組的訪問有個很明顯的特征:使用imul取得某個數組元素的地址偏移,然后在加上所要訪問結構體成員的地址偏移。同時,大多數情況下結構的的大小都是在編譯期決定的,imul的最后一個參數會是個常量。
首先F(function)類指令:是函數調用相關代碼,這些代碼用于函數或者作為一個函數數被調用。幾乎凡是堆棧操作(備份集陳啟或者壓入參數)可全部歸入此類。此外還有call指令、堆棧恢復。
然后C(control)類指令 :設計判斷和跳轉指令,以及對循環變量操作的指令。這些代碼用于循環、判斷語句。
剩余D(data)類指令:數據處理指令,應該不包含函數調用,多半不含有堆操作,也不會含有跳轉。
2.翻譯D類指令。
3.表達式的合并與控制流程的結合。
Reference:
學 Win32 匯編[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等
《天書夜讀-從匯編語言到Windows內核編程》
1.下載并安裝最新的Debugging
Tools for Windows。
2.在系統Path環境變量中添加Debugging
Tools for Windows的安裝路徑。
3.在系統環境變量中創建_NT_SYMBOL_PATH項并設置為SRV*E:\SymbolServer
\OSSymbols*http://msdl.microsoft.com/download/symbols;E:\SymbolServer\MySymbols;C:\WINNT\Symbsols
其中,SRV是告訴調試器加載symsrv.dll并將后面的執作為參數,E:\SymbolServer\OSSymbols是我為操作系統符號設置的 目錄,http://msdl.microsoft.com/download/symbols告訴調試器如果沒有找到所需的符號就到這個地址去下 載,E:\SymbolServer\MySymbols是我自己程序的符號目錄,C:\WINNT\Symbsols中有net2005的C- RunTime
Library和MFC的PDB文件.
我是使用得本機作為符號服務器,當然也可以使用專門架設一臺服務器作為符號服務器,只要將_NT_SYMBOL_PATH中的路徑設置為遠程路徑就可以.注意你要對符號服務器有讀寫權限.
See also:
Debugging
Tools and Symbols: Getting Started
MSDN2001中關于symbol文件的相關介紹和MSDN中Matt
Pietrek的文章------最好還是下載DDK
使用
Minidumps 和
Visual Studio .NET 進行崩潰后調試
Debug Tips at
codeproject
簡單建立自己的符號服務器(symstore使用說明)
MS DLL Help Database