中国av一区,欧美日韩喷水,国产一区二区三区av电影 http://m.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://m.shnenglu.com/sonilics/articles/138133.htmlsonilicssonilicsFri, 07 Jan 2011 12:19:00 GMThttp://m.shnenglu.com/sonilics/articles/138133.htmlhttp://m.shnenglu.com/sonilics/comments/138133.htmlhttp://m.shnenglu.com/sonilics/articles/138133.html#Feedback0http://m.shnenglu.com/sonilics/comments/commentRss/138133.htmlhttp://m.shnenglu.com/sonilics/services/trackbacks/138133.html常用寄存器

寄存器
名稱
常見用途(未完)
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,其他參數從右到左

 _cdecl調用通常的asm代碼:

被調用方:
1.保存ebp。ebp總是用來保存這個函數執行之前的esp值。執行完畢之后,我們用ebp回復esp;同時,調用此函數的上層函數也用ebp做同樣的事情。
2.保存esp到ebp中。

;保存ebp,并把esp放入ebp中,此時ebp與esp都為這次函數調用的棧頂
push ebp
mov  ebp,esp


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

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


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

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


6.然后執行函數的具體邏輯。傳入參數的獲取為:ebp+4為函數的返回地址;ebp+8為第一個參數,ebp+12為第二個參數,以此類推。

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

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


調用方:

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

 

常見的基礎代碼結構

for循環

    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) 

可以看到主循環主要由這么幾條指令來實現:mov進行初始化;jmp跳過修改循環變量的代碼;cmp實現跳轉判斷;jge根據條件跳轉。用jmp回到修改循環變量的代碼進行下一次循環。大體結構如下:
    mov  <循環變量>,<初始值>     ;給循環變量賦值
    jmp  A                     ;跳到第一次循環處
A:     (改動循環變量)            ;修改循環變量
    
B:  cmp  
<循環變量>,<限制變量>   ;檢查循環變量
    jge  跳出循環
    (循環體)
    
    jmp  A                     ;跳回修改循環變量


do循環

    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循環就是用一個簡單的條件比較指令跳轉回去:
cmp  <循環變量><限制變量>
jl   
<循環開始>


while循環

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要復雜一些,因為wile除了開始的時候判斷循環條件之外,后面還要有一條無條件跳轉指令:
A:  cmp  <循環變量>,<限制變量>
    jge  B
    (循環體)
    
    jmp  A 
B:  (跳出循環)


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加上條件跳轉指令。
cmp <條件>
jle 
<下一個分支>
所以開始的反匯編為:
    if ( i < 10 )
0040B94C  cmp         dword ptr [i],0Ah     ;判斷點
0040B950  jge         wmain
+3Bh (40B95Bh)     ;跳轉到下一個else if
else if和else的特點是,在開始的地方都有一條無條件跳轉指令,跳轉到判斷結束處,阻止前面的分支執行結束后,直接進入這個分支的可能,這個分支執行的唯一條件為前面的判斷不滿足。
else則在jmp之后直接執行操作,而else if則開始重復if之后的操作,用cmp比較,然后用條件質量進行跳轉。
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 
    }


switch-case 判斷分支

switch的特點是有多個判斷。因為switch顯然不會判斷大于小于,所以都是je,分別跳轉到每個case處,最有一個是無條件跳轉,直接跳到default處。
對于break,會增加一個無條件跳轉語句,跳轉至結尾

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)         ;跳轉到default
    
{
    
case 0:
        j 
= 0;
0040B969  mov         dword ptr [j],
0 
        
break;                                    ;跳轉到結束
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 
所以如果看到有多個連續的
cmp
je

標志著可能是swith語句


訪問結構體數組成員

對于以下代碼:

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循環中所對應的匯編為

  ar[i].a = 0;
0040B956  mov      eax,dword ptr [i]  ;訪問第i個數據
0040B959  imul     eax,eax,0Ch    ;0ch為結構體的大小,這里得到訪問第i個機構體的地址偏移
0040B95C  mov      dword ptr ar[eax],0  ;取得第i個結構體的第一個元素地址
  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

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


閱讀匯編代碼的一些技巧

1.將指令分類:

    首先F(function)類指令:是函數調用相關代碼,這些代碼用于函數或者作為一個函數數被調用。幾乎凡是堆棧操作(備份集陳啟或者壓入參數)可全部歸入此類。此外還有call指令、堆?;謴?。
    然后C(control)類指令    :設計判斷和跳轉指令,以及對循環變量操作的指令。這些代碼用于循環、判斷語句。
    剩余D(data)類指令:數據處理指令,應該不包含函數調用,多半不含有堆操作,也不會含有跳轉。
2.翻譯D類指令。
3.表達式的合并與控制流程的結合。


Reference:

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

《天書夜讀-從匯編語言到Windows內核編程》

 

 

 




sonilics 2011-01-07 20:19 發表評論
]]>
架設符號服務器http://m.shnenglu.com/sonilics/articles/99750.htmlsonilicssonilicsThu, 29 Oct 2009 08:25:00 GMThttp://m.shnenglu.com/sonilics/articles/99750.htmlhttp://m.shnenglu.com/sonilics/comments/99750.htmlhttp://m.shnenglu.com/sonilics/articles/99750.html#Feedback0http://m.shnenglu.com/sonilics/comments/commentRss/99750.htmlhttp://m.shnenglu.com/sonilics/services/trackbacks/99750.html

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




sonilics 2009-10-29 16:25 發表評論
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 午夜老司机精品| 久久久久久网| 欧美裸体一区二区三区| 国产精品大片| 尤物yw午夜国产精品视频| 亚洲人成在线观看| 亚洲砖区区免费| 美女亚洲精品| 中国成人在线视频| 六月丁香综合| 国产精品日韩久久久| 亚洲福利视频在线| 亚洲欧美国产精品桃花| 欧美国产91| 亚洲欧美日韩一区在线| 欧美aⅴ一区二区三区视频| 国产精品视频免费| 亚洲精品在线观| 欧美伊人久久大香线蕉综合69| 美女尤物久久精品| 亚洲午夜国产一区99re久久| 久久精品亚洲精品| 国产精品久在线观看| 亚洲三级影院| 久久久久国产精品一区二区| 99视频日韩| 米奇777超碰欧美日韩亚洲| 国产精品中文在线| 亚洲少妇诱惑| 亚洲日本黄色| 久久亚洲综合色| 国产欧美一区二区在线观看| 亚洲私人影院在线观看| 亚洲国产日韩欧美一区二区三区| 欧美专区在线播放| 国产婷婷成人久久av免费高清| 在线视频精品一区| 亚洲黄色天堂| 老鸭窝毛片一区二区三区| 国产精品一区久久| 亚洲免费在线观看| 99伊人成综合| 欧美日韩三级在线| 日韩视频三区| 亚洲人体偷拍| 欧美日韩国产免费观看| 一区二区三区高清视频在线观看| 亚洲黄色一区二区三区| 欧美激情视频在线播放 | 黑人巨大精品欧美一区二区小视频| 亚洲私人影院| 在线亚洲免费| 国产精品久久久久久妇女6080 | 欧美永久精品| 国产精品网站在线观看| 亚洲永久在线观看| 亚洲在线1234| 国内伊人久久久久久网站视频 | 亚洲视频碰碰| 国产日本欧美一区二区三区| 午夜亚洲福利| 久久精品91| 亚洲高清自拍| 亚洲美女在线视频| 国产精品一区二区久久国产| 欧美一区二区视频在线观看2020| 亚洲专区一二三| 黄色在线一区| 亚洲激情av在线| 国产精品进线69影院| 欧美一级在线播放| 久久国产精品一区二区三区四区| 在线观看欧美成人| 99re在线精品| 国内外成人在线视频| 亚洲国产清纯| 国产日韩欧美在线| 亚洲福利国产精品| 国产精品欧美经典| 欧美成年网站| 国产精品美女在线| 另类天堂av| 国产精品成人一区二区网站软件 | 免费中文字幕日韩欧美| 亚洲在线观看| 久久亚洲精品一区二区| 亚洲特级毛片| 另类人畜视频在线| 亚洲欧美精品在线| 蜜桃av久久久亚洲精品| 午夜天堂精品久久久久| 免费观看国产成人| 久久国产99| 欧美日韩在线观看一区二区| 久热国产精品| 国产伦精品一区二区三区照片91| 亚洲第一精品在线| 国产亚洲成人一区| 日韩亚洲精品在线| 亚洲电影激情视频网站| 亚洲图片欧美午夜| 日韩西西人体444www| 久久人体大胆视频| 久久久精品一区二区三区| 国产精品jizz在线观看美国| 亚洲国产免费看| 亚洲激情成人在线| 亚洲乱码久久| 免费一区视频| 国产精品中文在线| 一区二区三区不卡视频在线观看| 亚洲电影免费在线观看| 欧美一区二区三区四区在线观看地址 | 一道本一区二区| 亚洲精品在线三区| 久久夜色精品国产亚洲aⅴ| 久久超碰97中文字幕| 国产精品综合久久久| 亚洲小视频在线| 亚洲欧美另类综合偷拍| 欧美三日本三级少妇三2023| 亚洲福利在线看| 亚洲精品免费在线播放| 欧美a一区二区| 欧美高清视频一二三区| 亚洲国产91| 欧美aⅴ99久久黑人专区| 欧美黄色一区| 亚洲另类视频| 欧美视频网址| 亚洲免费一在线| 久久久久青草大香线综合精品| 国产午夜精品美女视频明星a级| 亚洲欧美另类久久久精品2019| 欧美一区二区在线视频| 国产偷自视频区视频一区二区| 欧美一区二区在线看| 久久综合色天天久久综合图片| 精品不卡视频| 欧美激情一二区| 一区二区三区日韩精品| 久久aⅴ国产紧身牛仔裤| 加勒比av一区二区| 欧美激情欧美狂野欧美精品| 日韩午夜在线播放| 久久精品一二三| 亚洲国产精品高清久久久| 欧美日韩1区2区| 午夜精品成人在线| 免费成人av在线| 这里是久久伊人| 国产一区二区三区久久精品| 欧美.日韩.国产.一区.二区| 一区二区三区国产精品| 久久综合电影一区| 在线一区二区日韩| 国产亚洲制服色| 欧美日韩精品免费观看视频完整| 亚洲午夜三级在线| 欧美大片免费看| 午夜精品久久久久久久99樱桃| 激情欧美一区二区三区在线观看 | 欧美欧美午夜aⅴ在线观看| 亚洲在线一区二区三区| 欧美11—12娇小xxxx| 亚洲欧美制服另类日韩| 亚洲国产日韩一区| 国产视频在线一区二区| 欧美日韩情趣电影| 裸体一区二区| 欧美一级免费视频| 亚洲精品国产精品乱码不99| 久久久亚洲国产美女国产盗摄| 一本久久a久久精品亚洲| 精品999久久久| av成人动漫| 亚洲国产一区二区三区在线播| 欧美少妇一区| 欧美va亚洲va香蕉在线| 久久福利影视| 亚洲视频图片小说| 91久久夜色精品国产九色| 老鸭窝毛片一区二区三区| 午夜欧美不卡精品aaaaa| 亚洲婷婷综合色高清在线| 91久久久久久| 在线播放精品| 国产一区在线免费观看| 国产精品一区二区在线观看不卡| 欧美精品v日韩精品v国产精品| 久久久夜精品| 久久久久久国产精品mv|