精品成人一区二区三区,欧美激情精品久久久久久蜜臀 ,西瓜成人精品人成网站http://www.shnenglu.com/sonilics/category/6298.htmlGame! Game! Game!zh-cnSun, 09 Jan 2011 20:45:55 GMTSun, 09 Jan 2011 20:45:55 GMT60崩潰分析用到的一些匯編語言技巧http://www.shnenglu.com/sonilics/articles/138133.htmlsonilicssonilicsFri, 07 Jan 2011 12:19:00 GMThttp://www.shnenglu.com/sonilics/articles/138133.htmlhttp://www.shnenglu.com/sonilics/comments/138133.htmlhttp://www.shnenglu.com/sonilics/articles/138133.html#Feedback0http://www.shnenglu.com/sonilics/comments/commentRss/138133.htmlhttp://www.shnenglu.com/sonilics/services/trackbacks/138133.html常用寄存器

寄存器
名稱
常見用途(未完)
eax
累加器(Accumulator) 函數(shù)返回值
ebx 基址寄存器(Base) 可作為存儲(chǔ)指針來使用
ecx
計(jì)數(shù)器(Counter)
在循環(huán)和字符串操作時(shí),用來控制循環(huán)次數(shù)
__thiscall中傳遞this指針
edx
數(shù)據(jù)寄存器(Data)

esp
堆棧指針寄存器(Stack)

ebp
基地址指針寄存器(Base)

esi
源地址寄存器(Source Index)

edi
目的地址寄存器(Destination)


常用匯編指令

push 把一個(gè)32位的操作數(shù)壓入堆棧,這個(gè)操作會(huì)導(dǎo)致esp減4.
pop 與push相反,esp加4,一個(gè)數(shù)據(jù)出棧
call 調(diào)用函數(shù)。將下一條指令的地址壓棧,然后跳轉(zhuǎn)到所調(diào)用函數(shù)的開始處,本質(zhì)相當(dāng)于push+jump
ret 與call相對(duì)應(yīng),跳轉(zhuǎn)到棧頂數(shù)據(jù)所指的地址,本質(zhì)相當(dāng)于pop+jump。對(duì)于_cdecl 調(diào)用的函數(shù),通常會(huì)在ret之后進(jìn)行exp-[n],用于清理調(diào)用參數(shù)堆棧
xor 異或,常用于清零操作,例如: xor eax eax
lea 取得地址(第二個(gè)參數(shù))后放入前面的寄存器中。
stosw 將eax中的數(shù)據(jù)傳送給edi,之后edi+4。常與rep一起使用,用于初始化內(nèi)存段
rep 當(dāng)eax>0時(shí),重復(fù)后面的指令
jp,jl,jge 根據(jù)eax中值與0的關(guān)系跳轉(zhuǎn)
cmp 比較指令,將結(jié)果放入eax中,往往是jp,jl,jge之類跳轉(zhuǎn)指令的執(zhí)行條件


函數(shù)調(diào)用規(guī)則

調(diào)用方式
簡(jiǎn)要說明
堆棧清理 參數(shù)傳遞規(guī)則
_cdecl C 編譯器的默認(rèn)調(diào)用規(guī)則 Caller
從右到左
_stdcall 又稱為WINAPI Callee
從右到左
__thiscall C++成員函數(shù)調(diào)用方式
Callee  this放入ecx,其他從右到左
__fastcall

Callee
前兩個(gè)等于或者小于DWORD大小的參數(shù)放入ecx和edx,其他參數(shù)從右到左

 _cdecl調(diào)用通常的asm代碼:

被調(diào)用方:
1.保存ebp。ebp總是用來保存這個(gè)函數(shù)執(zhí)行之前的esp值。執(zhí)行完畢之后,我們用ebp回復(fù)esp;同時(shí),調(diào)用此函數(shù)的上層函數(shù)也用ebp做同樣的事情。
2.保存esp到ebp中。

;保存ebp,并把esp放入ebp中,此時(shí)ebp與esp都為這次函數(shù)調(diào)用的棧頂
push ebp
mov  ebp,esp


3.在堆棧中預(yù)留一個(gè)區(qū)域用于保存局部變量。方法是將esp減少一個(gè)數(shù)值,這樣就等于壓入了一堆變量。要恢復(fù)的時(shí)候直接把esp回復(fù)成ebp保存的數(shù)據(jù)就可以了。
4.保存ebx、esi、edi到堆棧中,函數(shù)調(diào)用完成后恢復(fù)。

;把esp往下移動(dòng)一個(gè)范圍,等于在堆棧中預(yù)留一片新的空間來保存局部變量
sub  esp,010h
push ebx
push esi
push edi


5.(debug版)把局部變量全部初始化為0xcccccccch.

;將保存局部變量的區(qū)域全部初始化為0xcccccccch
lea  edi,[ebp
-010h]
mov  ecx,33h
mov  eax,0xcccccccch
rep  stos dword ptr [edi]


6.然后執(zhí)行函數(shù)的具體邏輯。傳入?yún)?shù)的獲取為:ebp+4為函數(shù)的返回地址;ebp+8為第一個(gè)參數(shù),ebp+12為第二個(gè)參數(shù),以此類推。

7.回復(fù)ebx、esi、edi、esp、ebp,最后返回。如果有返回值,在返回之前將保存在eax中,供調(diào)用方式用。

pop  edi ;恢復(fù)edi、esi、ebx
pop  esi
pop  ebx
mov  esp, ebp ;恢復(fù)原來的ebp和esp
pop  ebp
ret


調(diào)用方:

mov  eax,dword ptr [b]
push eax
move ecx,dword ptr [a]
push ecx
call myfunction
add  esp,
8              ;回復(fù)堆棧

 

常見的基礎(chǔ)代碼結(jié)構(gòu)

for循環(huán)

    for(int i = 0; i < 20++i )
0040B93E  mov         dword ptr [i],
0 
0040B945  jmp         wmain
+30h (40B950h) 
0040B947  mov         eax,dword ptr [i] 
0040B94A  add         eax,
1 
0040B94D  mov         dword ptr [i],eax 
0040B950  cmp         dword ptr [i],14h 
0040B954  jge         wmain
+38h (40B958h) 
    {

    }
0040B956  jmp         wmain
+27h (40B947h) 

可以看到主循環(huán)主要由這么幾條指令來實(shí)現(xiàn):mov進(jìn)行初始化;jmp跳過修改循環(huán)變量的代碼;cmp實(shí)現(xiàn)跳轉(zhuǎn)判斷;jge根據(jù)條件跳轉(zhuǎn)。用jmp回到修改循環(huán)變量的代碼進(jìn)行下一次循環(huán)。大體結(jié)構(gòu)如下:
    mov  <循環(huán)變量>,<初始值>     ;給循環(huán)變量賦值
    jmp  A                     ;跳到第一次循環(huán)處
A:     (改動(dòng)循環(huán)變量)            ;修改循環(huán)變量
    
B:  cmp  
<循環(huán)變量>,<限制變量>   ;檢查循環(huán)變量
    jge  跳出循環(huán)
    (循環(huán)體)
    
    jmp  A                     ;跳回修改循環(huán)變量


do循環(huán)

    int i = 0;
0040B93E  mov         dword ptr [i],
0 
    
do 
    {
        
++i;
0040B945  mov         eax,dword ptr [i] 
0040B948  add         eax,
1 
0040B94B  mov         dword ptr [i],eax 
    } 
while (i<10);
0040B94E  cmp         dword ptr [i],0Ah 
0040B952  jl          wmain
+25h (40B945h) 

上面的do循環(huán)就是用一個(gè)簡(jiǎn)單的條件比較指令跳轉(zhuǎn)回去:
cmp  <循環(huán)變量><限制變量>
jl   
<循環(huán)開始>


while循環(huán)

int i = 0;
0040B93E  mov         dword ptr [i],
0 
    
while (i<10)
0040B945  cmp         dword ptr [i],0Ah 
0040B949  jge         wmain
+36h (40B956h) 
    {
        
++i;
0040B94B  mov         eax,dword ptr [i] 
0040B94E  add         eax,
1 
0040B951  mov         dword ptr [i],eax 
    }
0040B954  jmp         wmain
+25h (40B945h) 

while要復(fù)雜一些,因?yàn)閣ile除了開始的時(shí)候判斷循環(huán)條件之外,后面還要有一條無條件跳轉(zhuǎn)指令:
A:  cmp  <循環(huán)變量>,<限制變量>
    jge  B
    (循環(huán)體)
    
    jmp  A 
B:  (跳出循環(huán))


if-else判斷分支

int i = 0;
0040B93E  mov         dword ptr [i],
0 
    
int j = 0;
0040B945  mov         dword ptr [j],
0 
    
if ( i < 10 )
0040B94C  cmp         dword ptr [i],0Ah 
0040B950  jge         wmain
+3Bh (40B95Bh) 
    {
        j 
= 10;
0040B952  mov         dword ptr [j],0Ah 
0040B959  jmp         wmain
+51h (40B971h) 
    }
    
else if (i < 20 )
0040B95B  cmp         dword ptr [i],14h 
0040B95F  jge         wmain
+4Ah (40B96Ah) 
    {
        j 
= 20;
0040B961  mov         dword ptr [j],14h 
    }
    
else
0040B968  jmp         wmain
+51h (40B971h) 
    {
        j 
= 30;
0040B96A  mov         dword ptr [j],1Eh 
    }
    
return 0;
0040B971  xor         eax,eax 
if 判斷都是使用cmp加上條件跳轉(zhuǎn)指令。
cmp <條件>
jle 
<下一個(gè)分支>
所以開始的反匯編為:
    if ( i < 10 )
0040B94C  cmp         dword ptr [i],0Ah     ;判斷點(diǎn)
0040B950  jge         wmain
+3Bh (40B95Bh)     ;跳轉(zhuǎn)到下一個(gè)else if
else if和else的特點(diǎn)是,在開始的地方都有一條無條件跳轉(zhuǎn)指令,跳轉(zhuǎn)到判斷結(jié)束處,阻止前面的分支執(zhí)行結(jié)束后,直接進(jìn)入這個(gè)分支的可能,這個(gè)分支執(zhí)行的唯一條件為前面的判斷不滿足。
else則在jmp之后直接執(zhí)行操作,而else if則開始重復(fù)if之后的操作,用cmp比較,然后用條件質(zhì)量進(jìn)行跳轉(zhuǎn)。
0040B959  jmp         wmain+51h (40B971h)     ;跳轉(zhuǎn)到判斷塊外
    }
    
else if (i < 20 )
0040B95B  cmp         dword ptr [i],14h     
0040B95F  jge         wmain
+4Ah (40B96Ah)     ;比較,條件跳轉(zhuǎn),目標(biāo)為下一個(gè)分支
    {
        j 
= 20;
0040B961  mov         dword ptr [j],14h 
    }


switch-case 判斷分支

switch的特點(diǎn)是有多個(gè)判斷。因?yàn)閟witch顯然不會(huì)判斷大于小于,所以都是je,分別跳轉(zhuǎn)到每個(gè)case處,最有一個(gè)是無條件跳轉(zhuǎn),直接跳到default處。
對(duì)于break,會(huì)增加一個(gè)無條件跳轉(zhuǎn)語句,跳轉(zhuǎn)至結(jié)尾

int i = 0;
0040B93E  mov         dword ptr [i],
0 
    
int j = 0;
0040B945  mov         dword ptr [j],
0 
    
switch (i)
0040B94C  mov         eax,dword ptr [i] 
0040B94F  mov         dword ptr [ebp
-0DCh],eax 
0040B955  cmp         dword ptr [ebp
-0DCh],0     
0040B95C  je          wmain
+49h (40B969h)         ;判斷case 1
0040B95E  cmp         dword ptr [ebp
-0DCh],1 
0040B965  je          wmain
+52h (40B972h)         ;判斷case 2
0040B967  jmp         wmain
+59h (40B979h)         ;跳轉(zhuǎn)到default
    
{
    
case 0:
        j 
= 0;
0040B969  mov         dword ptr [j],
0 
        
break;                                    ;跳轉(zhuǎn)到結(jié)束
0040B970  jmp         wmain
+60h (40B980h) 
    
case 1:
        j 
= 1;
0040B972  mov         dword ptr [j],
1 
    
default:
        j 
= 3;
0040B979  mov         dword ptr [j],
3 
    }


    
return 0;
0040B980  xor         eax,eax 
所以如果看到有多個(gè)連續(xù)的
cmp
je

標(biāo)志著可能是swith語句


訪問結(jié)構(gòu)體數(shù)組成員

對(duì)于以下代碼:

struct A 
{
    
int a;
    
int b;
    
int c;
}
;

int wmain(int argc, wchar_t* argv[])
{
    A    ar[
3];
    
for (int i=0;i<3;++i)
    
{
        ar[i].a    
= 0;
        ar[i].b    
= 0;
        ar[i].c    
= 0;
    }


    
return 0;
}

for循環(huán)中所對(duì)應(yīng)的匯編為

  ar[i].a = 0;
0040B956  mov      eax,dword ptr [i]  ;訪問第i個(gè)數(shù)據(jù)
0040B959  imul     eax,eax,0Ch    ;0ch為結(jié)構(gòu)體的大小,這里得到訪問第i個(gè)機(jī)構(gòu)體的地址偏移
0040B95C  mov      dword ptr ar[eax],0  ;取得第i個(gè)結(jié)構(gòu)體的第一個(gè)元素地址
  ar[i].b = 0;
0040B964  mov      eax,dword ptr [i]
0040B967  imul     eax,eax,0Ch
0040B96A  mov      dword ptr [ebp+eax-24h],0
  ar[i].c = 0;
0040B972  mov      eax,dword ptr [i]
0040B975  imul     eax,eax,0Ch
0040B978  mov      dword ptr [ebp+eax-20h],0

對(duì)于結(jié)構(gòu)體數(shù)組的訪問有個(gè)很明顯的特征:使用imul取得某個(gè)數(shù)組元素的地址偏移,然后在加上所要訪問結(jié)構(gòu)體成員的地址偏移。同時(shí),大多數(shù)情況下結(jié)構(gòu)的的大小都是在編譯期決定的,imul的最后一個(gè)參數(shù)會(huì)是個(gè)常量。


閱讀匯編代碼的一些技巧

1.將指令分類:

    首先F(function)類指令:是函數(shù)調(diào)用相關(guān)代碼,這些代碼用于函數(shù)或者作為一個(gè)函數(shù)數(shù)被調(diào)用。幾乎凡是堆棧操作(備份集陳啟或者壓入?yún)?shù))可全部歸入此類。此外還有call指令、堆棧恢復(fù)。
    然后C(control)類指令    :設(shè)計(jì)判斷和跳轉(zhuǎn)指令,以及對(duì)循環(huán)變量操作的指令。這些代碼用于循環(huán)、判斷語句。
    剩余D(data)類指令:數(shù)據(jù)處理指令,應(yīng)該不包含函數(shù)調(diào)用,多半不含有堆操作,也不會(huì)含有跳轉(zhuǎn)。
2.翻譯D類指令。
3.表達(dá)式的合并與控制流程的結(jié)合。


Reference:

學(xué) Win32 匯編[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等

《天書夜讀-從匯編語言到Windows內(nèi)核編程》

 

 

 




sonilics 2011-01-07 20:19 發(fā)表評(píng)論
]]>
架設(shè)符號(hào)服務(wù)器http://www.shnenglu.com/sonilics/articles/99750.htmlsonilicssonilicsThu, 29 Oct 2009 08:25:00 GMThttp://www.shnenglu.com/sonilics/articles/99750.htmlhttp://www.shnenglu.com/sonilics/comments/99750.htmlhttp://www.shnenglu.com/sonilics/articles/99750.html#Feedback0http://www.shnenglu.com/sonilics/comments/commentRss/99750.htmlhttp://www.shnenglu.com/sonilics/services/trackbacks/99750.html

1.下載并安裝最新的Debugging Tools for Windows。
2.在系統(tǒng)Path環(huán)境變量中添加Debugging Tools for Windows的安裝路徑。
3.在系統(tǒng)環(huán)境變量中創(chuàng)建_NT_SYMBOL_PATH項(xiàng)并設(shè)置為SRV*E:\SymbolServer \OSSymbols*http://msdl.microsoft.com/download/symbols;E:\SymbolServer\MySymbols;C:\WINNT\Symbsols
其中,SRV是告訴調(diào)試器加載symsrv.dll并將后面的執(zhí)作為參數(shù),E:\SymbolServer\OSSymbols是我為操作系統(tǒng)符號(hào)設(shè)置的 目錄,http://msdl.microsoft.com/download/symbols告訴調(diào)試器如果沒有找到所需的符號(hào)就到這個(gè)地址去下 載,E:\SymbolServer\MySymbols是我自己程序的符號(hào)目錄,C:\WINNT\Symbsols中有net2005的C- RunTime Library和MFC的PDB文件.

我是使用得本機(jī)作為符號(hào)服務(wù)器,當(dāng)然也可以使用專門架設(shè)一臺(tái)服務(wù)器作為符號(hào)服務(wù)器,只要將_NT_SYMBOL_PATH中的路徑設(shè)置為遠(yuǎn)程路徑就可以.注意你要對(duì)符號(hào)服務(wù)器有讀寫權(quán)限. 

See also:
Debugging Tools and Symbols: Getting Started
MSDN2001中關(guān)于symbol文件的相關(guān)介紹和MSDN中Matt Pietrek的文章------最好還是下載DDK
使用 Minidumps 和 Visual Studio .NET 進(jìn)行崩潰后調(diào)試
Debug Tips at codeproject
簡(jiǎn)單建立自己的符號(hào)服務(wù)器(symstore使用說明)
MS DLL Help Database




sonilics 2009-10-29 16:25 發(fā)表評(píng)論
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩天堂在线视频| 夜夜嗨av一区二区三区| 国产精品日韩一区二区| 亚洲国内精品在线| 国内久久婷婷综合| 亚洲一区高清| 亚洲一级特黄| 欧美激情亚洲一区| 欧美国产1区2区| 黄色亚洲精品| 欧美中文字幕| 久久精品国产免费| 国产欧美日韩在线观看| 亚洲一区二区三区免费在线观看| 亚洲免费观看高清完整版在线观看| 久久精品国产亚洲5555| 久久国产福利国产秒拍| 国产精品一卡二卡| 亚洲一区二区三区四区五区黄 | 精品动漫3d一区二区三区免费 | 亚洲精选视频在线| 亚洲美女视频在线免费观看| 老巨人导航500精品| 免费一级欧美片在线播放| 国产婷婷色一区二区三区四区| 亚洲免费在线视频| 欧美一区二区三区视频在线| 国产精品午夜在线观看| 亚洲欧美电影在线观看| 午夜在线观看免费一区| 国产欧美日本一区二区三区| 亚洲欧美日本国产有色| 欧美一区二区黄色| 韩日视频一区| 美女爽到呻吟久久久久| 亚洲国内精品| 亚洲一区三区视频在线观看| 国产精品久久久久影院亚瑟| 亚洲一区网站| 两个人的视频www国产精品| 亚洲第一天堂无码专区| 欧美精品国产精品日韩精品| 亚洲精品一区二区三区四区高清 | 免费看精品久久片| 亚洲精品乱码久久久久久按摩观| 亚洲午夜精品久久| 国产日韩亚洲欧美精品| 蜜臀va亚洲va欧美va天堂| 亚洲韩日在线| 午夜精品久久久久久久男人的天堂 | 欧美成人综合一区| 艳女tv在线观看国产一区| 久久av老司机精品网站导航| 狠狠色狠狠色综合日日tαg | 黑人操亚洲美女惩罚| 久久中文欧美| 在线视频日韩| 另类专区欧美制服同性| 99在线热播精品免费| 国产精品一二三四区| 可以看av的网站久久看| 在线中文字幕不卡| 麻豆精品在线播放| 亚洲女同在线| 在线日韩日本国产亚洲| 国产精品国内视频| 久久综合久久综合这里只有精品 | 欧美国产第一页| 新67194成人永久网站| 亚洲福利一区| 欧美专区在线观看| 一本到12不卡视频在线dvd| 国产亚洲精品久久飘花| 欧美日本不卡| 久久伊人一区二区| 午夜精品免费在线| 99热免费精品在线观看| 欧美大片一区二区三区| 欧美一区二区三区四区在线观看| 亚洲精品视频免费观看| 国产一区二区三区视频在线观看| 欧美日韩在线免费视频| 欧美~级网站不卡| 久久黄色网页| 香蕉乱码成人久久天堂爱免费| 91久久久久久久久久久久久| 麻豆成人在线观看| 久久av二区| 午夜欧美理论片| 在线亚洲欧美专区二区| 亚洲三级网站| 最新日韩av| 亚洲成人在线免费| 一区二区三区在线视频播放| 国产精品日韩一区| 国产精品人人做人人爽| 国产精品v欧美精品v日本精品动漫| 欧美成人小视频| 女人色偷偷aa久久天堂| 美日韩精品免费| 久久综合色天天久久综合图片| 久久国产精品久久久久久电车| 亚洲综合色丁香婷婷六月图片| 一区二区激情| 亚洲网站啪啪| 亚洲在线成人| 午夜精品久久久久影视 | 欧美日韩一区二区欧美激情| 欧美激情精品久久久六区热门| 美玉足脚交一区二区三区图片| 久久在线免费视频| 欧美/亚洲一区| 欧美人成在线| 欧美午夜激情视频| 国产老肥熟一区二区三区| 国产精品专区h在线观看| 国产欧美日韩视频在线观看| 国产一区欧美| 亚洲国产婷婷| 一区二区三区四区五区视频| 亚洲欧美高清| 久久久综合免费视频| 欧美福利电影网| 亚洲精品乱码久久久久久| 一区二区免费在线播放| 香蕉久久夜色精品| 久久婷婷丁香| 欧美日韩国产首页| 国产美女精品| 樱桃国产成人精品视频| 亚洲久久成人| 久久大逼视频| 欧美成在线观看| 一本大道久久a久久综合婷婷| 亚洲欧美大片| 欧美成人免费在线视频| 国产精品久久久久永久免费观看 | 亚洲一区影音先锋| 久久国产精品一区二区三区四区| 久久亚洲免费| 国产精品久久久久久久久久ktv| 国产婷婷色一区二区三区| 亚洲激情视频在线观看| 亚洲欧美视频一区| 美女任你摸久久| 一区二区三区四区五区在线| 久久精品人人做人人爽| 欧美精品www| 国内精品视频在线播放| 在线视频你懂得一区| 久久午夜色播影院免费高清| 亚洲免费观看在线视频| 久久免费高清| 国产精品免费网站| 亚洲精品久久| 久久夜色精品国产欧美乱极品| 亚洲伦理自拍| 久久尤物电影视频在线观看| 国产精品久久综合| 日韩写真视频在线观看| 久久影院亚洲| 亚洲欧美激情四射在线日 | 国产精品伦一区| 亚洲精品一区二区三区在线观看| 欧美一区国产二区| 99视频日韩| 欧美承认网站| 亚洲高清视频在线观看| 久久久av水蜜桃| 亚洲男人第一av网站| 欧美日韩福利视频| 亚洲人体偷拍| 欧美激情精品久久久久久蜜臀 | 亚洲第一毛片| 久久九九免费视频| 国产伦精品一区二区三区免费迷| 一区二区三区日韩在线观看| 欧美激情 亚洲a∨综合| 久久精品一区二区国产| 国产午夜精品在线观看| 性做久久久久久久久| 一区二区三区欧美亚洲| 欧美韩国日本综合| 亚洲免费精彩视频| 亚洲欧洲精品成人久久奇米网| 久久综合综合久久综合| 亚洲大片精品永久免费| 免费永久网站黄欧美| 久久视频免费观看| 尤物精品国产第一福利三区| 久久国产天堂福利天堂| 性色av一区二区三区红粉影视| 国产精品午夜在线观看| 久久精品视频99| 久久xxxx精品视频| 在线观看av一区| 欧美成人蜜桃| 欧美—级高清免费播放| 一区二区久久| 亚洲免费一在线|