![IDA反匯編學(xué)習(xí)心得_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/6b34e20e-7a44-4cec-91b7-a99749b970d7/6b34e20e-7a44-4cec-91b7-a99749b970d71.gif)
![IDA反匯編學(xué)習(xí)心得_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/6b34e20e-7a44-4cec-91b7-a99749b970d7/6b34e20e-7a44-4cec-91b7-a99749b970d72.gif)
![IDA反匯編學(xué)習(xí)心得_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/11/6b34e20e-7a44-4cec-91b7-a99749b970d7/6b34e20e-7a44-4cec-91b7-a99749b970d73.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、用IDA反匯編動(dòng)態(tài)庫(kù)最近,一直在學(xué)習(xí)如何利用IDA來反匯編動(dòng)態(tài)庫(kù),這里把我的學(xué)習(xí)心得寫下來。為簡(jiǎn)單起見,這里就自己所寫的一個(gè)動(dòng)態(tài)庫(kù)里的一個(gè)簡(jiǎn)單函數(shù)進(jìn)行一下反匯編,給出如何寫出其C代碼的詳細(xì)過程,希望對(duì)新手有點(diǎn)幫助。廢話少說,先給出其動(dòng)態(tài)連接庫(kù)的C代碼如下_declspec(dllexport) int add(char a, int b, int c2)int d = a + b + c0 + c1; return d;待會(huì)在反匯編時(shí)進(jìn)行說明。下面給出其詳細(xì)的反匯編過至于為什么要設(shè)置這樣的參數(shù), 程,并補(bǔ)充相關(guān)的經(jīng)驗(yàn)總結(jié)。第一步、裝載動(dòng)態(tài)庫(kù)文件 first .dll ,裝載之后得到下面的截圖:
2、通過在Functions 欄中雙擊add函數(shù),我們來到 add()函數(shù)的地方(同上圖),我們看到 text:10001010 add proc n ear ; CODE XREF: add(char,i nt,i nt * con st) j"這樣一欄顯示了 add函數(shù)的參數(shù),雖然有點(diǎn)出入,但大體正確??赡苁且?yàn)閍dd函數(shù)本身比擬簡(jiǎn)單,所以IDA 很容易就識(shí)別出了其參數(shù),一般地,IDA是識(shí)別不出來的,網(wǎng)上有一個(gè)插件 為Flair.v5.20 據(jù)說可以局部地解決函數(shù)的參數(shù)識(shí)別問題,但這個(gè)軟件我沒有下載到,就不 說這個(gè)了 。第二步、我們看到.text:10001010這些欄有很多標(biāo)示,
3、在下面的匯編語(yǔ)句中會(huì)用到。我們看接下來的三行代碼 :text:10001010pushebptext:10001011movebp, esptext:10001013subesp, 44h這三行代碼模式根本上是固定的,至少我遇到的都是這樣首先是保存ebp,然后用ebp來保存 esp 的原始指向,再將 esp 的指向向上移動(dòng) 44h 個(gè)字節(jié),當(dāng)然這里 44h 不是固定的 為什么會(huì)有這樣固定的代碼呢?就代碼sub esp 44h"而言,在原esp的根底上向上移動(dòng) 44h的字節(jié)空間,而 esp esp-44h 這個(gè) 44h 的空間是為了存放一般變量的。其他兩行相信讀者很容易理解其理由。第三
4、步、看下面三行代碼 .text:10001016pushebx.text:10001017pushesi.text:10001018pushedi當(dāng)我們?cè)诤瘮?shù)的開頭看到這樣的代碼時(shí),而后面又沒有緊跟著 call + function 時(shí),我們大可不用理解,因?yàn)檫@些 push 語(yǔ)句目的都是為了不破壞原始 ebx,esi,edi 的值而將他們保存起 來,并且這里我們可以看到,是保存在 esp-44h 之上的。也就是說,如果我們看到函數(shù)的開 頭出現(xiàn)將存放器 push進(jìn)esp-x之上的空間我們將"esp-x至 esp"的堆??臻g成為"一般 變量??臻g,這里就是指 push
5、進(jìn)esp-44h之上的堆??臻g,我們不用去關(guān)心,在函數(shù)末 尾肯定會(huì)有相應(yīng)的代碼將他們復(fù)原的。 待會(huì)我們會(huì)看到第四步、繼續(xù)向下看,進(jìn)入關(guān)鍵代碼段。 在做進(jìn)一步解釋之前我先畫一幅堆棧圖。ediexebxesp-44h之上的空間(esp-44h)指向,為(0x0013ff80-44h)般 變 量 堆 棧 空 間ebp = esp (假設(shè)這里是最先的 esp ,且值為 0x0013ff80,“100010代碼)canlcan2can3ebp+arg_0ebp+arg_4ebp+arg_8好了,有了上一幅圖,說明起來會(huì)容易些??唇酉聛淼乃臈l代碼.text:10001019leaedi, ebp+var_
6、44.text:1000101Cmovecx, 11htext:10001021moveax, 0CCCCCCCChtext:10001026repstosd這四條代碼和上面的三條代碼一樣, 其模式一般是固定不變的。其作用就是實(shí)現(xiàn)了 “一般變 量棧空間的初始化。這里將圖中所示的“一般變量??臻g“初始化為OxCCCCCCCC.其具體的代碼解釋如下 :leaedi, ebp+var_44 : edi = ebp + vat_44movecx, 11h : ecx = 0x11hmov eax, 0CCCCCCCCh : eax = 0xCCCCCCCC; rep stosd : for(int i
7、1=0; i1<ecx; i1+)edii1 = eax;這里因?yàn)閑cx=0x11(44h/4),所以將整個(gè)“一般變量棧空間 全部初始化為eax=OxCCCCCCCC; 這下就清楚了為什么上面的四條代碼一般模式是固定的, 原因就是對(duì)將要用到的 “一般變量 棧空間進(jìn)行初始化。第五步、進(jìn)入核心代碼段text:10001028movsxeax, ebp+arg_0text:1000102Caddeax, ebp+arg_4text:1000102Fmovecx, ebp+arg_8text:10001032addeax, ecxtext:10001034movedx, ebp+arg_8tex
8、t:10001037addeax, edx+4text:1000103Amovebp+var_4, eaxtext:1000103Dmoveax, ebp+var_4從圖上我們可以知道 arg_0,arg_4,arg_8分別是0x8,0xc,0x10。(要是從圖上看不清,請(qǐng)參考文件"first.txt )代碼 movsx eax, ebp+arg_O'表示將ebp+arg_O的值進(jìn)行有符號(hào)擴(kuò)展后傳給 eax。但是這里的ebp+arg_0究竟是什么呢?我們假設(shè)ebp+arg_0=can1,如圖,那么 movsxeax, ebp+arg_0就表示"eax = (char
9、)can1 。因?yàn)槲覀冇性创a,我們知道函數(shù)add()的參數(shù)為 int add(char a, int b, int c2),這樣我們有理由疑心(char)can1 就是 char a,即 add 的第一個(gè)參數(shù)。我們接著看下一條代碼: add eax, ebp+arg_4 ,有了上面的猜測(cè),我們不無 理由認(rèn)為ebp+arg_4就是 can2,這樣就實(shí)現(xiàn)了eax = can1+can2;再看代碼 mov ecx,ebp+arg_8和' add eax, ecx,我們可以猜測(cè)得到ebp+arg_8其實(shí)是一個(gè)地址,因?yàn)?后面有"addeax, ecx這樣的代碼,表示為將ecx所指向
10、的地址的值傳給eax。所以肯定這 就是 can3, 即 一 個(gè) int 型的 地 址參 數(shù) 。 addeax, ecx 之后, eax =can1+can2+can30 。接下來的兩行代碼 mov edx, ebp+arg_8 和 add eax, edx+4 與上面的相似,實(shí)現(xiàn)了 eax = can1+can2+can30+can31 。再看剩下的兩行代碼, mov ebp+var_4, eax,moveax, ebp+var_4,這兩行代碼是先將 eax 的值賦給ebp+var_4,再將其值給eax。第一行代碼其實(shí)是將結(jié)果儲(chǔ)存在ebp+var_4,第二行代碼是將返回值給eax。(一般地,函
11、數(shù)的返回值要是是int型的話,都會(huì)將返回值賦給exa,這也可以看成是一種固定的模式 。到這里,函數(shù)根本上完成了,這里可以看出為什么將 add 函 數(shù)的參數(shù)設(shè)置成 char, int 和 int* 了,目的就是為了認(rèn)清楚原來的參數(shù)是放在堆棧中具體什 么地方就目前可見,函數(shù)的第 i 個(gè)參數(shù)放在 esp+4+i*4 所指的堆棧中 i 從 1 開始, esp 是指 最先的棧頂指針,后來傳給了ebp般第一個(gè)參數(shù)都是從ebp+arg_O開始,而arg_O 般為 8,其他的參數(shù)依次放置 。同時(shí)我們也看到了參數(shù)返回的值會(huì)存放在存放器 eax 中。這 些到底是不是固定的,由于自己剛?cè)腴T,不敢隨便肯定。第六步、接
12、下來的代碼根本上就是復(fù)原先前存儲(chǔ)的存放器,就不做詳細(xì)解釋了。.text:10001040popedi.text:10001041popesi.text:10001042popebx.text:10001043movesp, ebp.text:10001045popebp.text:10001046retn.text:10001046 addendp好了,到這里,我們對(duì)用 IDA 反匯編動(dòng)態(tài)庫(kù)文件有了一定的認(rèn)識(shí)和經(jīng)驗(yàn)積累。但是這 樣反匯編成C語(yǔ)言似乎太慢了,對(duì)于這個(gè)簡(jiǎn)單的add函數(shù)還好,遇到難一點(diǎn)的函數(shù)那就說不定了。好在我們有hexray這個(gè)將匯編代碼轉(zhuǎn)成 C語(yǔ)言代碼的插件,下面我們就用試著用
13、這個(gè)插件來寫 C 代碼。加載first.dll文件后,同樣在"Functions一欄雙擊函數(shù) add,來到view的add函數(shù)區(qū)。 按 F5 鍵,得到如下的截圖int _cdecl add(char a1, int a2, int a3)char v4; / sp+Ch bp-44h1 memset (&v4, -858993460, 0x44u);return *(_DWORD *)(a3 + 4) + *(_DWORD *)a3 + a2 + a1;這里很明顯Hexray在做轉(zhuǎn)換時(shí),第三個(gè)參數(shù)沒有分清是地址還是值,沒關(guān)系,在下面的代碼中我們看到 *(_DWORD *)(a
14、3 + 4)這樣的代碼,其實(shí)就是a34/4 = a31,后面的*(_DWORD *)a3就是a30 了。很多時(shí)候,都會(huì)出現(xiàn)上面的強(qiáng)制轉(zhuǎn)換問題,比方遇到代碼*(_DWORD *)(str + 4*i)那么一般地,str就是一個(gè)地址,代碼本身就表示是stri(要對(duì)這些常見的轉(zhuǎn)換做出很快的反響以節(jié)省時(shí)間)。這樣,Hexray就直接幫我們轉(zhuǎn)換得到了源代碼。當(dāng)然,有時(shí)候 Hexray的轉(zhuǎn)換是不可信的,這時(shí)我們就要寫程序進(jìn)行檢測(cè)了。接續(xù)看上面的代碼,char v4;和后面緊跟著的 memset(&v4,-858993460, 0x44u)其實(shí)就是將“一般變量??臻g初始化為-858993460=0x
15、cccccccc,這兩行代碼一般是固定模式的,其作用都是將“一般變量棧空間初始化,一般不用管,接下來的才是真正的代碼區(qū)。既然這里我們說到了 Hexray的轉(zhuǎn)換問題,這里我們不妨將所見到的幾個(gè)常見轉(zhuǎn)換問題規(guī)整出來,以便以后我們更快地根據(jù)DLL得到C源代碼。1、如果函數(shù)的參數(shù)中出現(xiàn) int*這樣整型指針,Hexray 般會(huì)視為int型進(jìn)行轉(zhuǎn)換,(原因就 是因?yàn)榈刂穒nt*其實(shí)也是一個(gè)整形,只不過是表示一個(gè)地址而已)。怎樣看出這樣的轉(zhuǎn)換 問題呢,很簡(jiǎn)單,一般出現(xiàn)這樣的轉(zhuǎn)換問題,在轉(zhuǎn)換的C代碼中都有像“*(_DWORD*)(par + 4*i)'這樣的代碼,(其中par是函數(shù)中的一個(gè)整型參數(shù))
16、,這時(shí)一般地,我們能肯定轉(zhuǎn)化除了問題,直接將“*(_DWORD *)( par + 4*i) 改成pari就可以了。更簡(jiǎn)單的改Hexray轉(zhuǎn)換得到的最初 C代碼如圖:三IDA View- 閱 Hew VieA 出 Emporia Import: N Names:為Finctions 歡 Struclure En Enums l-'udocade<寫,就是直接利用hexray的改寫功能進(jìn)行改寫,如上面的那個(gè)Dll文件中的add()函數(shù),nr _cipr 1 pn(i(uriRF ai , 1 nr a7, Inrchdr 皿 "spChnw?nset(&ji ,
17、-89003469, Sxii4u);return «(_DbJ(lRD+ M) + *(_DW0RD+ a2 +;在add函數(shù)上點(diǎn)擊右鍵,選擇Set item type Y,如圖:return *( DMOftD4) *町胡 * a1;點(diǎn)擊之后得到將int a3修改成int *strnum,點(diǎn)ok保存,我們發(fā)現(xiàn) Hexray轉(zhuǎn)換的C代碼也發(fā)上了改變,如圖:國(guó)1期幽劇協(xié)HeiYle#4-A醛 InfjorsN NarmesVll FunctionsA StiuctuseSMji LininiE WLnt cdecl addfchar # int a2f int M5lDi-riijn
18、i)rLcriar u4; z/ isp+unj LtJp-'Munjsireturn strpnum + 1) + *<trnun + 2 + a1 ;卜到這里我們不得不佩服Hexray的智能化。同樣地,和上面出現(xiàn)的轉(zhuǎn)換問題相似,hexray在轉(zhuǎn)換過程中要是函數(shù)有參數(shù)char *str型,那么hexray 一般也會(huì)將參數(shù)識(shí)為int型,其原因不再羅嗦了。那么怎樣發(fā)現(xiàn)這樣的轉(zhuǎn)換問題呢?和上面的原理一樣,在C代碼中一般會(huì)有如下的代碼出現(xiàn):*(_BYTE *)(str + i)(注意:這里已經(jīng)不是 4*i 了,為什么,因?yàn)橐粋€(gè) int型占4個(gè)字節(jié),而一個(gè) char型只占1個(gè)字節(jié),所以是
19、i而不是4*i 了,類似地我們可以推測(cè),參數(shù)要是是short *str,那么C代碼中一般就會(huì)出現(xiàn)*(_WORD *)(str + 2*i),究竟是不是這樣,可以寫個(gè) Dll 函數(shù)嘗試一些)看到這樣的代碼,我們一般敢肯定 Hexray將char *str轉(zhuǎn)換成了一個(gè)整型。出現(xiàn)了轉(zhuǎn)換 問題,我們用上面的方法將他們修改正來就行了。要是不是參數(shù),而是在函數(shù)體內(nèi)部我們定義了一個(gè)int *str類型或者char *str類型的數(shù)組,那么這時(shí)Hexray會(huì)不會(huì)將他們轉(zhuǎn)換成int型呢?未必,Hexray有的時(shí)候能認(rèn)出來, 有的時(shí)候又分不出來,但我們?cè)趺床拍芸闯鰜砟?。第一、看代碼中也沒有如上所說強(qiáng)制轉(zhuǎn)換問題,要
20、是有的話我們照葫蘆畫瓢就可以了。第二、也有看不出來的,比方我們?cè)诖a中定義了 int *str100。但是我們只用到其中的前3個(gè)數(shù)字,那么hexray 一般不會(huì)出現(xiàn)強(qiáng)制轉(zhuǎn)換,直接就在一般變量??臻g的一塊連續(xù)地址空間存放了要用的前三個(gè)數(shù) 字,這可能是Hexray的一種優(yōu)化吧。(注意:可以從轉(zhuǎn)換得到的C代碼后面的注釋看出是不是連續(xù)的,如:in t v6 sp+5Ch bp-188h1 , in t v7; / sp+58h bp-18Ch1 , int v8; / sp+54h bp-190h1 就能很明顯地根據(jù)后面的注釋看出是一個(gè)連續(xù)空間。)2、總結(jié)起來,要確定在轉(zhuǎn)換中是否出現(xiàn)了轉(zhuǎn)換問題,最主要
21、的是看代碼中是不是有強(qiáng)制轉(zhuǎn)換的代碼,如:*(_DWORD *)(str + 4*i) ,*(_BYTE *)(str + i)等。要是有。我們可以認(rèn)為出現(xiàn)了轉(zhuǎn)換問題,沒有那更好了。說明:上面所說的一切都不是絕對(duì)的,只是我的一個(gè)經(jīng)驗(yàn)總結(jié)。畢竟插件是人家的,并不清楚插件中的代碼是如何處理,所以具體的情況我們還需具體對(duì)待。int v6/ sp+5Ch bp-188h1int v7; / sp+58h bp-18Ch1int v8; / sp+54h bp-190h1利用上面的一些經(jīng)驗(yàn),我們來看下面的一個(gè) dll 文件 second.dll ,同樣我們也對(duì)里面的一個(gè) 函數(shù) char* initstr(
22、int n, char *str, int len) 進(jìn)行跟蹤得到 C 代碼。同樣先給出真正的 C 代碼如 下:_declspec(dllexport) char* initstr(int n, char *str, int len)if(len < n) return NULL;for(int i1 = 0; i1 < n; i1 +)stri1 = i1+1;return str;盡管我們用 Hexray 能很容易地得到上面的 C 代碼,但是我們這里還是一 步步先來看一下匯 編代碼,一是看看我們上面所獲取的經(jīng)驗(yàn)是不是可以用上,二是我們進(jìn)一步熟悉匯編代碼。好了,在加載 secon
23、d.dll 文件之后,我們得到如下的截圖ViF -nuord-w-tMcdaoiH !=tluordPtrEstrictm»廿二» ilw-d內(nèi)Char崛 B-duordptfPHlEctriBW.tnti:iwniiai呻H.i=rKt:1lilU»1 illHAUbf>P5F.ttKt:iMin bids«btsp.麻.t»Kt = 1IWDr1 BITpifflEllEi.trict :1MiH I1SPH3-I1rdu;riWE XREF : iBitE.trt j litstr Epr>c »i? jrU4F 幘
24、9tnt;iaaari gib.trictziMiH I1B.tMtxiwriiBi* H iIfe H 彈 | H 1v*| +苕mn F hi U 1 J 0亡曲呈#* < 1 V滬A |證詛窗/ - - H x j_sy * - S M it w;條箜 口叫匹蚩4蘭蘭導(dǎo)|呷嗎昌 f f f*1 fjLi1 041 J'jPt hifi上 Vi 弊1'aCCi 巾tmn *mil-wS XdjiIDAEifint-iTMt: Ml Njtik p Furnar e 取 STjeLrse.ii»k,tKt;iaODd Bffi .text :1 MIK 旳 盤
25、吐醉.tflRjct:iaa»i iffi> .trictH whites* ,te9Lt;1BQ»1BaA.tlFKClMDrlBliB七 rict;1liiu»1i1 tewMiMI tit1 Bill 1 11*inTtraXiqn 1 Gti;Attributes : bp - bdiexJ 盧尸刨陀I'vi M TUW -d gMiu1 rt e *-卅n申E Ji呻ritfiui出呦呻"r駅吋1illsLj仔岀事,J> UiriD具體的代碼可以參考文件“second.txt這個(gè)代碼比上面的代碼稍微復(fù)雜些。沒事,看代碼:te
26、xt:1OOO1O1Opushebptext:1OOO1O11movebp,esptext:10001013subesp,44htext:10001016pushebxtext:10001017pushesitext:10001018pusheditext:10001019leaedi, ebp+var_44text:1OOO1O1Cmovecx, 11htext:10001021moveax, 0CCCCCCCChrep stosdtext:10001026上面列出的代碼我們?cè)偈煜げ贿^了,都是些固定的模塊, 不用去細(xì)看了。接下來看下面的代text:10001028moveax, ebp+ar
27、g_8text:1000102Bcmpeax, ebp+arg_0text:1000102Ejgeshort loc_10001034.text:10001032jmpshort loc_10001061根據(jù)上面的經(jīng)驗(yàn),我們知道ebp+arg_0 里面放的就是第一個(gè)參數(shù)。代碼意思大體如下.text:10001028 :將參數(shù)3 傳給 eax.text:1000102B: eax 與參數(shù) 1 比擬,即第三個(gè)參數(shù)與第一個(gè)參數(shù)比擬.text:10001030xoreax, eax.text:1000102E : if(eax>=ebp+arg_0) goto loc_10001034;else
28、 do nothing.text:10001030 : eax = 0;。.text:10001032 : goto loc_10001061 繼續(xù)看接下來的代碼 :.text:10001034 loc_10001034:; CODE XREF: initstr_0+1E.text:10001034mov ebp+var_4, 0.text:1000103Bjmp short loc_10001046( 以上的代碼其實(shí)就是 for(i = 0;)的模式)面的代碼沒什么好說的,我們繼續(xù)往下看.text:1000103D loc_1000103D:; CODE XREF: initstr_0+4C
29、.text:1000103Dmovecx, ebp+var_4.text:10001040addecx, 1.text:10001043movebp+var_4, ecx面的代碼相當(dāng)于 ebp+var_4+; for(i=0; i?; i +)繼續(xù)向下:.text:10001046 loc_10001046:; CODE XREF: initstr_0+2B.text:10001046movedx, ebp+var_4.text:10001049cmpedx, ebp+arg_0.text:1000104Cjgeshort loc_1000105E(for(i=0;i<can1; i +
30、).text:1000104Emoveax, ebp+var_4.text:10001051addeax, 1.text:10001054movecx, ebp+arg_4.text:10001057addecx, ebp+var_4.text:1000105Amovecx, al.text:1000105Cjmpshort loc_1000103D.text:1000105E loc_1000105E:; CODE XREF: initstr_0+3C j.text:1000105Emoveax, ebp+arg_4.text:10001061.text:10001061 loc_10001
31、061:; CODE XREF: initstr_0+22 j.text:10001061popedi.text:10001062popesi.text:10001063popebx.text:10001064movesp, ebp.text:10001066popebp.text:10001067retn.text:10001067 initstr_0endp.text:10001032jmp short loc_10001061跳轉(zhuǎn)到 loc_10001061: 就意味著函數(shù)體的結(jié)束,我們看到在代碼中,就直接跳轉(zhuǎn)到結(jié)束處,即 if(can3<can1) 就直接結(jié)束了,此時(shí)的 exa=
32、0;所以有 if(can3<can1) return 0; 面的代碼構(gòu)成了一個(gè)循環(huán),.text:1000103D loc_1000103D:; CODE XREF: initstr_0+4C j.text:1000105Cjmpshort loc_1000103D從夾在中的代碼.text:10001049cmpedx, ebp+arg_0.text:1000104Cjgeshort loc_1000105E從這段循環(huán)代碼我們看到 IDA是怎樣反匯編一個(gè) for 循環(huán)的1、 出現(xiàn)如下的代碼模塊 (對(duì)計(jì)數(shù)器 i 的初始化).text:1000103D loc_1000103D: ; CODE
33、 XREF:initstr_0+4C j.text:1000103Dmovecx, ebp+var_4.text:10001040addecx, 1.text:10001043movebp+var_4, ecx這就相當(dāng)于for(i=0;)2、接下倆的代碼模塊相當(dāng)于實(shí)現(xiàn)for(i=0;i?; i +)中的i+功能。.text:1000103D loc_1000103D:; CODE XREF: initstr_0+4C j.text:1000103Dmovecx, ebp+var_4.text:10001040addecx, 1.text:10001043movebp+var_4, ecx3、
34、接下來的模塊就實(shí)現(xiàn)了for(i=0;i<can1;i+)中的 i<can1 功能??梢姡?IDA 在實(shí)現(xiàn)一個(gè) for 循環(huán)時(shí),首先初始化 i=num; 然后 i+=n; 最后是 for 循環(huán)中間判 定功能的實(shí)現(xiàn)。剩下的代碼就說其中幾條吧.text:1000105Emov eax, ebp+arg_4這條代碼實(shí)際上是將返回的 char 的指針放在了 eax 里面當(dāng)做返回。這和我們上面的經(jīng)驗(yàn)猜 想符合。從代碼.text:10001057addecx, ebp+var_4.text:1000105Amovecx, al我們很容易看出 ebp+var_4是一個(gè)指針因?yàn)橛衑cx ,而且很可能還是一個(gè) char 型的指針 因?yàn)閭鹘o ecx 的是一個(gè)字節(jié) al其他的代碼這里就
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年公司年會(huì)領(lǐng)導(dǎo)發(fā)言稿范文(17篇)
- 2024-2025學(xué)年廣東省梅州市平遠(yuǎn)縣實(shí)驗(yàn)中學(xué)高三上學(xué)期9月月考?xì)v史試卷
- 2024-2025學(xué)年第17課挽救民族危亡的斗爭(zhēng)-勤徑學(xué)升高中歷史必修上同步練測(cè)(統(tǒng)編版2019)
- 2025年以車抵押還款協(xié)議書范本
- 2025年個(gè)人項(xiàng)目委托合同
- 2025年臨時(shí)展覽館場(chǎng)地租賃合同范文
- 2025年涂料助劑:流平劑項(xiàng)目申請(qǐng)報(bào)告模范
- 2025年企業(yè)會(huì)議設(shè)備租賃合同范本
- 2025年個(gè)人與團(tuán)隊(duì)共同成長(zhǎng)策劃協(xié)議
- 2025年全場(chǎng)景住宅交易居間合同模板
- 陳鶴琴傳記和生平課件
- 小學(xué)運(yùn)動(dòng)傷害事故應(yīng)急預(yù)案
- 深度配煤摻燒方案
- 中藥?kù)F化吸入操作評(píng)分標(biāo)準(zhǔn)
- 安全評(píng)價(jià)工作程序框圖流程圖
- 空間生產(chǎn)理論
- 網(wǎng)絡(luò)營(yíng)銷教案完整版講義
- 學(xué)生個(gè)人成長(zhǎng)檔案實(shí)用模板
- 三一電氣產(chǎn)品外觀通用檢驗(yàn)標(biāo)準(zhǔn)
- 五線譜打印用(共4頁(yè))
- 10kV環(huán)網(wǎng)柜改造工程施工組織設(shè)計(jì)方案
評(píng)論
0/150
提交評(píng)論