版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
電子科技大學(xué)實 驗 報 告學(xué)生姓名:郭小明 學(xué)號:試驗室名稱:主樓A2-412二、試驗工程名稱:軟件開發(fā)環(huán)境試驗-----Huffman編碼試驗三、試驗原理:分割函數(shù)的三項原則分割函數(shù)的三項原則包括:與其寫注釋,不如寫函數(shù);重復(fù)就是罪惡;函數(shù)不要超過5070行。PPT贅述。Huffman編碼的根本原理本試驗要求使用Huffman編碼算法,實現(xiàn)對文件的壓縮和解壓。因此,我們首先介紹huffman的編碼算法。DavidHuffman使用次數(shù)少的代碼則可以使用較長的編碼,并且保持編碼的唯一可解性。指導(dǎo)書試驗原理局部較多,在這里就不做粘貼復(fù)制了。四、試驗?zāi)康模篽uffman生把握并敏捷運(yùn)用分割函數(shù)的三項原則。五、試驗內(nèi)容:exe程序。這個程序依據(jù)huffman編碼方式,同時包含了壓縮功能和解壓功能。用戶通過以下命令進(jìn)展壓縮:C:\>test.exe–cuncompress_filenamecompress_filename上述命令中,test.exe是程序名,-c表示要進(jìn)展壓縮。uncompress_filename是要壓縮的文是壓縮之后的文件名,同樣可以包含路徑信息。用戶可以通過如下命令進(jìn)展解壓:C:\>test.exe–ucompress_filenameuncompress_filename上述命令中,-u表示要執(zhí)行解壓命令。compress_filename是要解壓的文件名,可以包含路徑信息;uncompress_filename就是解壓后所得到的文件,同樣可以包含路徑信息。huffman樹或者編碼表或者詞頻表等等。test.exeCC++版本的。對這兩個版本的要求如下:及它們的文字說明等內(nèi)容;20%;C++版本的程序,需要給出類關(guān)系圖。試驗報告是否標(biāo)準(zhǔn)試驗報告內(nèi)容是否詳實試驗報告中是否包含了函數(shù)調(diào)用圖、流程圖、類圖以及它們的文字說明試驗報告中的代碼注釋是否到達(dá)要求程序是否正確無誤程序是否嚴(yán)格依據(jù)分函數(shù)的原則編寫C++版本的程序類關(guān)系的耦合度如何程序?qū)崿F(xiàn)是否考慮了大文件狀況六、試驗器材〔設(shè)備、元器件〕:PC機(jī),vs2023軟件平臺。七、試驗數(shù)據(jù)及結(jié)果分析:代碼見附件。huffmanForC文件中函數(shù)列表如下:///統(tǒng)計詞頻時用于查找是否已經(jīng)記錄過,0intisInNode(intvalue)//NodehuffmanNode[260]的節(jié)點(diǎn)數(shù)組當(dāng)中void calWeight(char*file)/*得到待壓縮文件的總字節(jié)數(shù),權(quán)值為幾就代表著有多少個字節(jié)*/intgetSumBytes//獵取壓縮后文件的總bit數(shù)intgetSumBits//huffman樹依據(jù)huffman樹的特性,nhuffman2n-1個節(jié)點(diǎn)//n值由全局變量count值來確定,該函數(shù)主要用來初始化Huffman樹的全部節(jié)點(diǎn)信息void createHufmanTree(Node*huffmanTree)/*字符編碼,從構(gòu)建好的Huffman樹當(dāng)中讀取每個葉子節(jié)點(diǎn)的huffman編碼, 并將葉子節(jié)點(diǎn)的信息放入到code[]中*/HCode*getHuffmanCode(Node*huffmanTree,HCode*HC,intcode[])/*將編碼表寫入默認(rèn)文件當(dāng)中,并在結(jié)尾存入葉子節(jié)點(diǎn)數(shù)〔count〕與壓縮后文件的總bit數(shù)1111000 27......................#sum_bit##count#*/voidfreToFile(intcode[],HCode*HC)//由于詞頻表是依據(jù)字符串方式存儲的葉子節(jié)點(diǎn)信息,int值再使用intpowmy(inta,intb)/*從編碼表文件讀取相應(yīng)信息以用來解壓文件,讀取信息包括編碼和葉子信息*/HCode*freFromFile(intcode[],HCode*HC)/*壓縮文件*/voidcompress_file(char*file1,char*file2)/*ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù)*/int swap(intdata)/*進(jìn)展文件的解壓*/voiduncompress_file(char*file1,char*file2)//主函數(shù)intmain(intargc,char**argv)函數(shù)關(guān)系調(diào)用圖:輸入-cargv[2argv[3]輸入-c命令獵取argv[2]文件中的詞頻信息calWeight(argv[2])
isInNode依據(jù)詞頻信息建立Huffan樹createHufmanTree編碼getHuffmanCode getSumBytes
getSumBitscompress_file將編碼信息寫入編碼表文件,以備解壓使用freToFile輸入-uargv[2argv[3]輸入-u命令從詞頻表當(dāng)中讀取編碼信息freFromFile
powmyswapuncompress_file代碼見附件。dic.txt),然后實現(xiàn)了解壓縮功能。試驗文件列表:file.txt為源文件,out.txt為壓縮文件,out1.txt為解壓出來的文件下面是dic.txt的局部信息,存放的依次是Huffman編碼,對應(yīng)的ASCII碼壓縮后產(chǎn)生的文件,確實是亂碼解壓后的文件,與壓縮前的文件,大小內(nèi)容完全全都。C++Controll類classControll//:publicHuffmanTree{public:voidcompress_file(constchar*,constchar*,constchar*);voiduncompress_file(constchar*,constchar*,constchar*);voidfreFromFile(constchar*,char**,char*,int*);intpowmy(int,int);};HuffmanNode類classHuffmanNode{public:charinfo; //結(jié)點(diǎn)信息doubleweight; //結(jié)點(diǎn)權(quán)值intparent,lchild,rchild;//父親結(jié)點(diǎn),左右孩子結(jié)點(diǎn)HuffmanNode{parent=lchild=rchild=-1;}HuffmanNode(constchar&data,constdouble&wt,constint&pa=-1,constint&lch=-1,constint&rch=-1){info=data;weight=wt;parent=pa;lchild=lch;rchild=rch;}};//classHuffmanNodeendCode類/*controlll類當(dāng)中使用這個類*/classCode{public:Code:length(10){ptr=newchar[length];}~Code{delete[]ptr;}char*ptr;constintlength;};HuffmanTree類classHuffmanTree{public:HuffmanTree(constint&s=100){maxSize=(s>100s:100);arrayTree=newHuffmanNode[maxSize];currentSize=0;codeArray=0;}~HuffmanTree{delete[]arrayTree;if(codeArray!=0)delete[]codeArray;}voidrun(constchar*,constchar*);intgetSumBytes;//bytes數(shù)intcurrentSize;//當(dāng)前數(shù)組大小HuffmanNode*arrayTree;//哈夫曼結(jié)點(diǎn)數(shù)組Code*codeArray;//數(shù)組大小為currentSizeintsum_bits;//bit數(shù)private:intmaxSize;//數(shù)組最大值//intsum_bytes;voidinsert(constchar&,constdouble&);//插入結(jié)點(diǎn)voidcreateHuffmanTree;//創(chuàng)立哈夫曼樹voidcreateHuffmanCode;//創(chuàng)立哈夫曼編碼voidwriteCodeToFile(constchar*);//Huffman編碼寫入到詞頻表文件當(dāng)中intfindPosition(constchar&)const;//arrayTree[]中的位置intisEqual(constchar*s)const;//s是否存在于編碼系統(tǒng)中,假設(shè)存在則返回s在編碼系統(tǒng)中的位置,否則返回-1voidreverse(chararr[]);};//classHuffmanTreeend類關(guān)系圖HuffmanTree類
Code類HuffmanNode類Control類C++版本的試驗過程總體類似C語言的試驗過程,截圖類似上面。壓縮文件命令:(1)首先讀取待壓縮文件,建立詞頻信息的存儲。Huffman樹。Huffman樹,生成編碼表信息。依據(jù)編碼表信息再次逐字節(jié)的的讀取帶壓縮文件并且壓縮文件。解壓命令從編碼表存儲文件當(dāng)中讀出編碼信息。兩份源代碼打包一并交到了系統(tǒng)里面,以備教師查看!電子科技大學(xué)實 驗 報 告學(xué)生姓名:郭小明 學(xué)號:稱:主樓A2-412二、試驗工程名稱:軟件開發(fā)環(huán)境試驗二:流程掌握語句反匯編三、試驗原理:VS2023的反匯編調(diào)試和反匯編代碼規(guī)律。VisualStudio2023ifif/elsedo/while/for等類型語句的反匯編代碼,以到達(dá)把握流程掌握語句識別的目的。五、試驗器材〔設(shè)備、元器件〕:PC機(jī),VS2023反匯編編碼調(diào)試軟件六、試驗步驟:if語句的反匯編在試驗報告中需要給出代碼清單2的解釋。2int_tmain(intargc,_TCHAR*argv[]){inti=3;if(i>3){i=4;}return0;}反匯編代碼inti=3;00DD138E mov dwordptr[ebp-8],3if(i>3)00DD1395 cmp dwordptr[ebp-8],300DD1399{jle00DD13A2i=4;00DD139Bmovdwordptr[ebp-8],4}return0;00DD13A2 xor eax,eax反匯編代碼清單2,下面進(jìn)展解釋:inti=3;00DD138E mov dwordptr[ebp-8],3EBP尋址的函數(shù)中,ebp-偏移量就是局部變量的地址。inti=3。int_tmain(intargc,_TCHAR*argv[]){00DD1370 push ebp00DD1371 mov ebp,espebp壓棧,然后將現(xiàn)在的棧頂指針esp賦值給〔由于棧是由高到低的挨次生長的,所以此時n就可以表示p后面n字節(jié)的地址了,然后我們再定義ti=;剛好壓棧后存儲在p為了防止溢出攻擊,在p后面空出4個字節(jié),然后再安排四個字節(jié)存放i變量,于是iebp-8int4個字節(jié),所以就在[ebp8]dwordptr用來指明數(shù)據(jù)的字節(jié)數(shù)00DD1395 cmp dwordptr[ebp-8],3同上dwordptr[ebp8]是指明數(shù)據(jù)字節(jié)數(shù),獵取i數(shù)據(jù)值,cmp是將i值與3進(jìn)展比較,其實就是執(zhí)行i-3,然后在標(biāo)志存放器〔PSW----ProgramStatusWord〕的各位反響比較的結(jié)果。00DD1399 jle 00DD13A2jle〔jle,jumpiflightorequal〕的含義是第一個操作數(shù)小于或等于其次個操作數(shù)時跳(固然此時就是通過標(biāo)志存放器〔PSW----ProgramStatusWord〕中的數(shù)值來推斷)。然后我們觀看跳轉(zhuǎn)地址00DD13A2 其實就是 00DD13A2 xor eax,eax 最終一句return0的代碼。i=4;00DD139B mov dwordptr[ebp-8],4這是if條件語句里面的代碼,將i值賦值為4,同理,dwordptr[ebp-8]是通過ebp-8找尋到i的地址單元,然后dr賦給這個地址〔的存放地址;return0;00DD13A2 xor eax,eax程序返回0eax清零代碼清單3int_tmain(intargc,_TCHAR*argv[]){inti=3;if(i<3){i=4;}return0;}下面是代碼清單3的反匯編代碼和解釋。inti=3;0122138E mov dwordptr[ebp-8],3if(i<3)01221395 cmp dwordptr[ebp-8],301221399 jge 012213A2{i=4;0122139B mov dwordptr[ebp-8],4}return0;012213A2 xor eax,eaxinti=3;0122138E mov dwordptr[ebp-8],3定義一個int型的變量i,賦值為3,[ebp-8] ebp-8是i變量地址,[ebp-8]是i變量,dwordptr是指明該地址數(shù)據(jù)由4字節(jié)構(gòu)成,然后通過mov指令將3賦值給i。if(i<3)01221395 cmp dwordptr[ebp-8],3dr-數(shù)據(jù)值-8是變量的地址-]是變量是將值與3進(jìn)展比較,其實就是執(zhí)行i-3,然后在標(biāo)志存放器〔PSW----ProgramStatusWord〕的各位反響比較的結(jié)果。01221399 jge 012213A2通過與代碼清單2的比較我們可以得出,jge〔jge,jumpifgreaterorequal〕是當(dāng)?shù)谝粋€操作數(shù)大于或者等于其次個操作數(shù)的時候進(jìn)展跳轉(zhuǎn)。且跳轉(zhuǎn)地址就是return0代碼的地址。i=4;0122139B mov dwordptr[ebp-8],4這是if條件語句里面的代碼,將i值賦值為4,同理,dwordptr[ebp-8]是通過ebp-8找尋到i的地址單元,然后dr賦給這個地址〔的存放地址;012213A2 xor eax,eax程序返回0eax清零代碼清單4int_tmain(intargc,_TCHAR*argv[]){inti=3;if(i==3){i=4;}return0;}下面是代碼清單4的反匯編代碼及解釋inti=3;002B138E mov dwordptr[ebp-8],3if(i==3)002B1395002B1399{cmpjnedwordptr[ebp-8],3002B13A2i=4;002B139Bmovdwordptr[ebp-8],4}return0;002B13A2 xor eax,eax}inti=3;002B138E mov dwordptr[ebp-8],3定義一個int型的變量i,賦值為3,[ebp-8] ebp-8是i變量地址,[ebp-8]是i變量,dwordptr是指明該地址數(shù)據(jù)由4字節(jié)構(gòu)成,然后通過mov指令將3賦值給i。if(i==3)002B1395 cmp dwordptr[ebp-8],3dr-數(shù)據(jù)值-8是變量的地址-]是變量是將值與3進(jìn)展比較,其實就是執(zhí)行i-3,然后在標(biāo)志存放器〔PSWProgramStatusWord〕的各位反響比較的結(jié)果。002B1399 jne 002B13A2通過與代碼清單2的比較我們可以得出,jne〔jne,jumpifnotequal〕是當(dāng)?shù)谝粋€操作數(shù)不等于其次個操作數(shù)的時候進(jìn)展跳轉(zhuǎn)。且跳轉(zhuǎn)地址就是return0代碼的地址。i=4;002B139B mov dwordptr[ebp-8],4這是if條件語句里面的代碼,將i值賦值為4,同理,dwordptr[ebp-8]是通過ebp-8找尋到i的地址單元,然后dr賦給這個地址〔的存放地址;002B13A2 xor eax,eax程序返回0eax清零試驗有要求:另外,還可以自行試驗<=、>=時的狀況。在試驗報告中,給出這些狀況的反匯編代碼及解釋。最終,在試驗報告中,總結(jié)出條件推斷語句的反匯編代碼規(guī)章。下面是在>=狀況下的反匯編代碼:inti=3;00CF138E mov dwordptr[ebp-8],3//if(i==3)if(i>=3)00CF1395 cmp dwordptr[ebp-8],300CF1399 jl 00CF13A2{i=4;00CF139B mov dwordptr[ebp-8],4}return0;00CF13A2 xor eax,eax*********************************************下面只是解釋這句不同的代碼:00CF1399 jl 00CF13A2通過與代碼清單2的比較我們可以得出,jl〔jne,jumpifless〕是當(dāng)?shù)谝粋€操作數(shù)小于其次個操作數(shù)的時候進(jìn)展跳轉(zhuǎn)。且跳轉(zhuǎn)地址就是return0代碼的地址。下面是<=代碼的反匯編代碼:inti=3;008C138E mov dwordptr[ebp-8],3//if(i==3)if(i<=3)008C1395008C1399{cmpjgdwordptr[ebp-8],3008C13A2i=4;008C139Bmovdwordptr[ebp-8],4}return0;008C13A2 xor eax,eax008C1399 jg 008C13A2通過與代碼清單2的比較我們可以得出,jg〔jne,jumpifgreater〕是當(dāng)?shù)谝粋€操作數(shù)大于其次個操作數(shù)的時候進(jìn)展跳轉(zhuǎn)。且跳轉(zhuǎn)地址就是return0代碼的地址。條件推斷語句的反匯編代碼規(guī)章:由兩條匯編指令構(gòu)成:cmp操作數(shù)1 操作數(shù)2和jXX 地址cmp用于條件推斷比較Jxx用于在不符合推斷的狀況下跳轉(zhuǎn)到后面的代碼處jg〔jne,jumpifgreater〕jl〔jne,jumpifless〕jne〔jne,jumpifnotequal〕jge〔jge,jumpifgreaterorequal〕jle〔jle,jumpiflightorequal〕if/else語句的反匯編5int_tmain(intargc,_TCHAR*argv[]){inti=3;if(i<3){i=4;}else{i=5;}return0;}代碼清單5的反匯編結(jié)果代碼清單6:inti=3;00F9138E mov dwordptr[ebp-8],3if(i<3)00F91395 cmp dwordptr[ebp-8],300F91399 jge 00F913A4{i=4;00F9139B mov dwordptr[ebp-8],4}else00F913A2 jmp 00F913AB{i=5;00F913A4 mov dwordptr[ebp-8],5}return0;00F913AB xor eax,eax}由于一些相類似的反匯編指令已經(jīng)在前面做了詳盡的解釋,下面重點(diǎn)對if else 代碼的反匯編進(jìn)展解釋:if(i<3)00F91395cmp dwordptr[ebp-8],3將i與3進(jìn)展比較,轉(zhuǎn)變相應(yīng)的標(biāo)志存放器位。00F91399jge 00F913A4假設(shè)第一個操作數(shù)大于或者等于其次個操作數(shù)就跳轉(zhuǎn)到00F913A4這個位置去執(zhí)行指令代碼,這個位置{i=5;00F913A4 mov dwordptr[ebp-8],5}是else 里面的內(nèi)容,執(zhí)行完畢之后就return0;00F913AB xor eax,eax返回0,eax清零假設(shè)沒有進(jìn)展跳轉(zhuǎn)的話〔第一個操作數(shù)大于其次個操作數(shù)〕挨次執(zhí)行下面的代碼:{i=4;00F9139B mov dwordptr[ebp-8],4}else00F913A2 jmp 00F913AB執(zhí)行到else下面的代碼之后就跳轉(zhuǎn)到了 00F913AB 這個位置,而這個地址的指令代碼是return0;00F913AB xor eax,eax返回0,eax清零。以上反匯編指令剛好和我們的規(guī)律是一樣的。if-else構(gòu)成的多分支流程的反匯編代碼的規(guī)律:cmp操作數(shù)1 操作數(shù)2jxx else里面的反匯編代碼地址 ;假設(shè)不符合條件則跳轉(zhuǎn){If條件語句里的反匯編代碼}elsejmp 下面一個大括號后的反匯編代碼地址{else條件語句里面的反匯編代碼}7int_tmain(intargc,_TCHAR*argv[]){inti=3;if(i>30){i=4;}elseif(i>=20){i=5;}elseif(i<=5){i=6;}elseif(i<10){i=7;}elseif(i==12){i=8;}else{i=9;}return0;}代碼清單7的反匯編結(jié)果:inti=3;00E9138E mov dwordptr[ebp-8],3 //定義變量i=3if(i>30)00E91395 cmp dwordptr[ebp-8],1Eh //對i和30這個兩個操作數(shù)進(jìn)展比較00E91399 jle 00E913A4 //假設(shè)操作數(shù)1小于等于操作數(shù)2,跳轉(zhuǎn),//且地址為大括號后面指令代碼地址{i=4;00E9139Bmovdwordptr[ebp-8],4//假設(shè)符合if條件,執(zhí)行賦值語句00E913A2}jmp00E913E7//執(zhí)行完畢后直接跳到返回語句處elseif(i>=20)00E913A4 cmp dwordptr[ebp-8],14h //假設(shè)前一個條件推斷為假,則跳至此處//與20再推斷00E913A8 jl 00E913B3{i=5;
//假設(shè)不符合此處的if條件語句則跳轉(zhuǎn)//到下一個if條件處00E913AA mov dwordptr[ebp-8],5 //假設(shè)符合前一個if條件,執(zhí)行賦值語句00E913B1 jmp 00E913E7 //執(zhí)行完畢后直接跳到返回語句處}elseif(i<=5)00E913B3 cmp dwordptr[ebp-8],5 //假設(shè)前一個條件推斷為假,則跳至此處//與5再比較推斷00E913B7 jg 00E913C2 //假設(shè)不符合此處的if條件則跳轉(zhuǎn)到//下一個if條件處 以下類似,不做//重復(fù)解釋{i=6;00E913B9 mov dwordptr[ebp-8],600E913C0 jmp 00E913E7}elseif(i<10)00E913C2 cmp dwordptr[ebp-8],0Ah00E913C6 jge 00E913D1{i=7;00E913C8movdwordptr[ebp-8],700E913CFjmp00E913E7}elseif(i==12) //此時到達(dá)了最終一個if條件判//斷處,依據(jù)上面if-else的匯編//解釋執(zhí)行00E913D1 cmp dwordptr[ebp-8],0Ch00E913D5 jne 00E913E0{i=8;00E913D7 mov dwordptr[ebp-8],8}else00E913DE jmp 00E913E7{i=9;00E913E0 mov dwordptr[ebp-8],9}return0;00E913E7 xor eax,eax}if-else構(gòu)成的多分支流程的反匯編代碼的規(guī)律。:代碼形式為if( )cmp12jxx 地址〔ifif條件處再進(jìn)展比較〕{................................jmp 整個多分支流程語句后的指令地址}elseif( )cmp12jxx 地址〔ifif條件處再進(jìn)展比較〕{................................jmp 整個多分支流程語句后的指令地址}elseif( )cmp12jxx 地址〔ifif條件處再進(jìn)展比較〕{................................jmp 整個多分支流程語句后的指令地址}elseif( )cmp12jxx 地址〔ifelse條件處再進(jìn)展比較〕{.................................}elsejmp 整個多分支流程語句后的指令地址{..................................}循環(huán)的反匯編通過試驗指導(dǎo)書當(dāng)中給出的代碼清單9的反匯編結(jié)果和分析,給出for循環(huán)反匯編代碼的規(guī)律如下:for(inti=0;i<10;i++){定義i變量,并進(jìn)展初始化指令代碼jmpxxxA處執(zhí)行B:執(zhí)行計數(shù)變量遞增操作將變量i mov到eax處eax1eaxmovi的變量里A:cmp12與循環(huán)完畢條件做比較指令代碼jxx xxx 假設(shè)照舊滿足條件,向下執(zhí)行;否則跳轉(zhuǎn)到C處向下執(zhí)行循環(huán)體指令代碼..........................................jmpxxxB處執(zhí)行}C:代碼清單10while循環(huán)的代碼例如:int_tmain(intargc,_TCHAR*argv[]){inti=0;intj=0;while(i<10){j++;i++;}return0;}代碼清單10的反匯編結(jié)果:inti=0;0025138E mov dwordptr[ebp-8],0intj=0;00251395 mov dwordptr[ebp-14h],0while(i<10)0025139C002513A0{cmpjgedwordptr[ebp-8],0Ah002513B6j++;002513A2moveax,dwordptr[ebp-14h]002513A5addeax,1002513A8movi++;dwordptr[ebp-14h],eax002513ABmoveax,dwordptr[ebp-8]002513AEaddeax,1002513B1movdwordptr[ebp-8],eax}002513B4 jmp 0025139Creturn0;002513B6 xor eax,eax在代碼清單10當(dāng)中,在地址0025138E處mov dwordptr[ebp-8],0將[ebp-8]設(shè)置為0,馬上i設(shè)置為0;同理在地址00251395處mov dwordptr[ebp-14h],0 將[ebp-14]設(shè)置為0,馬上j設(shè)置為0;在地址0025139C處cmp dwordptr[ebp-8],0Ah,將i的值與10做比較,在地址002513A0 處e 6 假設(shè)小于0則跳轉(zhuǎn)到6處執(zhí)行〔即返回語句,假設(shè)連續(xù)向下執(zhí)行,則002513A2002513A5002513A8三地址處的指令對j進(jìn)展加一操作,002513AB002513AE002513B1對i進(jìn)展加一操作;在002513B4jmp 0025139C 跳轉(zhuǎn)回cmp的指令處連續(xù)執(zhí)行。通過代碼清單10while語句的反匯編代碼規(guī)律whileA :cmp操作數(shù)1操作數(shù)2 while循環(huán)完畢條件做比較jxx B{
假設(shè)不符合條件則,跳轉(zhuǎn)到B處連續(xù)執(zhí)行,假設(shè)符合,則挨次執(zhí)行循環(huán)體循環(huán)體指令............................................................................................................}jmp A A處連續(xù)執(zhí)行B:....................................代碼清單11int_tmain(intargc,_TCHAR*argv[]){intj=0;inti=0;do{j++;i++;}while(i<10);return0;}代碼清單11的反匯編結(jié)果:intj=0;0019138E mov dwordptr[ebp-8],0inti=0;00191395do{movdwordptr[ebp-14h],0j++;0019139Cmoveax,dwordptr[ebp-8]0019139Faddeax,1001913A2movi++;dwordptr[ebp-8],eax001913A5moveax,dwordptr[ebp-14h]001913A8addeax,1001913ABmovdwordptr[ebp-14h],eax}while(i<10);001913AE cmp dwordptr[ebp-14h],0Ah001913B2 jl 0019139Creturn0;001913B4 xor eax,eax}在代碼清單11當(dāng)中,在地址0019138E處將[ebp-8]設(shè)置為0,馬上j設(shè)置為0,在地址00191395處,將00191395設(shè)置為0,馬上i設(shè)置為0.在地址0019139C0019139F001913A2三個地址處執(zhí)行j增1的操作,在001913A5001913A8001913AB三個地址處執(zhí)行i增1的操作。在地址001913AE處執(zhí)行循環(huán)條件比較指令cmp dwordptr[ebp-14h],0Ah在接下來的001913B2 jl 0019139C這條指令當(dāng)中,假設(shè)操作數(shù)1即i小于操作數(shù)2即10,就跳轉(zhuǎn)到0019139C地址處連續(xù)執(zhí)行,否則向下連續(xù)執(zhí)行。do-while循環(huán)的反匯編代碼規(guī)律:do{ 循環(huán)體指令代碼A:........................................................................................................................................................................}while( );cmp操作數(shù)1 操作數(shù)2 do------while循環(huán)條件推斷語句jxxA假設(shè)符合條件的話,就跳轉(zhuǎn)到A處的循環(huán)體局部開頭執(zhí)行,否則連續(xù)向下執(zhí)行電子科技大學(xué)實 驗 報 告學(xué)生姓名:郭小明 學(xué)號:試驗室名稱:主樓A2-412二、試驗工程名稱:軟件開發(fā)環(huán)境試驗三:函數(shù)調(diào)用棧幀布局三、試驗原理:保存函數(shù)返回地址。另外,局部變量也通常位于棧上。VisualStudio2023為了防止棧上局部數(shù)組溢出,又實行了特別的保護(hù)措施。本試驗就需要通過觀看VisualStudio2023。四、試驗?zāi)康模罕驹囼灴傮w目的是,通過使用VisualStudio2023查看函數(shù)調(diào)用時參數(shù)、局部變量等在棧上的分布狀況,以到達(dá)把握函數(shù)調(diào)用時棧幀布局的目的。六、試驗器材〔設(shè)備、元器件:PC機(jī),VS2023軟件平臺。七、試驗步驟:在源文件中,編寫如下代碼。voidf{}intmain{f;return0;}得到反匯編代碼如下:voidf{008D13A0 push ebp008D13A1movebp,esp008D13A3subesp,0C0h008D13A9pushebx008D13AApushesi008D13ABpushedi008D13ACleaedi,[ebp-0c0h]008D13B2movecx,30h008D13B7moveax,0CCCCCCCCh008D13BCrepstosdwordptres:[edi]}008D13BEpopedi008D13BFpopesi008D13C0popebx008D13C1movesp,ebp008D13C3popebp008D13C4ret2stos指令的含義是:將eax的值放在[edi]中,之后在這里將edi4。repstosstos,直到ecx0ecx1。2,以及內(nèi)存映像〔調(diào)式->窗口->內(nèi)存〕2。返回地址ebp
ebp的值..0xcccccccc..原ebx的值原esi的值原edi的值
0xc0個0xcc0x30個0xcccccccc20xc0個字節(jié)的0xcc是否有溢出而寫的。代碼清單2的解釋:在008D13A0地址處將ebp的值壓入堆棧,并在008D13A1地址處將現(xiàn)在棧頂esp的值賦給ebp,然后再008D13A3處將esp的值減去0C0h,此時棧又向下面生長了0C0h個單位。然后在008D13A9008D13AA008D13AB三個地址處依次將ebx,esi,edi008D13ACleaedi,[ebp-0C0h]008D13AC地址處,將ebp0C0h這個地址值賦給edi。008D13B2movecx,30h將ecx的值賦為30h,在008D13B7mov eax,0CCCCCCCCh處將eax的值賦值為0CCCCCCCCh,stoseax[edi]edi的值4。repstosstosecx0,每次循環(huán)ecx都會1edi,esi,ebxebp中的esp的值esp,在將ebp出棧,就復(fù)原了現(xiàn)場。在源文件中,編寫如下代碼:#include“stdafx.h“voidf{inti=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}4:voidf{002513A0pushebp002513A1movebp,esp002513A3subesp,0CCh002513A9pushebx002513AApushesi002513ABpushedi002513ACleaedi,[ebp-0CCh]002513B2movecx,33h002513B7moveax,0CCCCCCCCh002513BCrepstosdwordptres:[edi]inti=0;002513BEmovdwordptr[i],0}002513C5popedi002513C6popesi002513C7popebx002513C8movesp,ebp002513CApopebp002513CBret在試驗報告中,需要給出代碼清單4中反匯編代碼的解釋。4,以及內(nèi)存映像〔調(diào)式->窗口->內(nèi)存〕3。返回地址ebpebp-4ebp-8ebp-0x0c
前幀ebp的值0xcccccccci0xcccccccc..0xcccccccc..原ebx的值原esi的值原edi的值
0xcc
共有0xcc個字節(jié)3只有一個整型局部變量時的布局inti120x0ci4i40xcccccccc。代碼清單4的解釋:002B13AC 代碼清單4的實現(xiàn)步驟總體類似于代碼清單2,也是首先將ebp壓棧,然后將esp保存進(jìn)ebp,有所變化的就是這次是將esp的值減去0CCh,比上一次無局部變量的時候多了0Ch,然后照舊是壓ebx,esi,edi002B13AC 是將ebp與ebx之間的堆棧字節(jié)通通賦值為0xcc。在之后將i的值賦值為0,然后同樣是出棧和恢復(fù)地址。char類型局部變量、只有一個short類型局部變量,以及只有一個double類型局部變量時棧幀的布局。即代碼清單5、代碼清單6、代碼清單7中f函數(shù)所對應(yīng)的棧幀布局。下面是chari=0;的反匯編代碼清單5:(留意右鍵顯示符號名)voidf{00AE13A0 push ebp00AE13A1movebp,esp00AE13A3subesp,0CCh00AE13A9pushebx00AE13AApushesi00AE13ABpushedi00AE13ACleaedi,[ebp-0CCh]00AE13B2movecx,33h00AE13B7moveax,0CCCCCCCCh00AE13BCrepstosdwordptres:[edi]chari=0;00AE13BEmovbyteptr[i],0}00AE13C2popedi00AE13C3popesi00AE13C4popebx00AE13C5movesp,ebp00AE13C7popebp00AE13C8ret返回地址前幀ebp的值ebp0xccccccccccebp-4iebp-5
0xcccccccccccccc
0xcc個字節(jié)ebp-0x0Ch 0xcccccccc0xC0oxcch原esi的值原edi的值下面是shorti0;的反匯編代碼清單6:voidf{012313A0 push ebp012313A1movebp,esp012313A3subesp,0CCh012313A9pushebx012313AApushesi012313ABpushedi012313ACleaedi,[ebp+FFFFFF34h]012313B2movecx,33h012313B7moveax,0CCCCCCCCh012313BCrepstosdwordptres:[edi]shorti=0;012313BE012313C0}xormov012313BE012313C0}xormoveax,eaxwordptr[ebp-10h],ax012313C4popedi012313C5popesi012313C6popebx012313C7movesp,ebp012313C9popebp012313CAret返回地址前幀ebp的值ebp0xcccccccc0xccccccccebp-8iebp-100xccccebp-0x0Ch0xcccccccc0xC0oxcch原esi的值原edi的值下面是doublei0;的反匯編代碼清單7:voidf{013C13A0 push ebp013C13A1movebp,esp013C13A3subesp,0CCh013C13A9pushebx013C13AApushesi013C13ABpushedi013C13ACleaedi,[ebp+FFFFFF34h]013C13B2movecx,33h013C13B7moveax,0CCCCCCCCh013C13BCrepstosdwordptres:[edi]doublei=0;013C13BE fldz013C13C0 fstp qwordptr[ebp-1Ch]}013C13C3popedi013C13C4popesi013C13C5popebx013C13C6movesp,ebp013C13C8popebp013C13C9ret返回地址前幀ebp的值ebp
0xccccccccccebp-4 0xC0oxcchi0xcc個字節(jié)ebp-0x0Ch
0xcccccccc原esi的值原edi的值在源文件中,編寫代碼清單8:voidf{chari=0;intj=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}并進(jìn)展反匯編得到代碼清單9:voidf{00D813A0 push ebp00D813A1movebp,esp00D813A3subesp,0D8h00D813A9pushebx00D813AApushesi00D813ABpushedi00D813ACleaedi,[ebp+FFFFFF28h]00D813B2movecx,36h00D813B7moveax,0CCCCCCCCh00D813BCrepstosdwordptres:[edi]chari=0;00D813BE mov byteptr[ebp-5],0intj=0;00D813C2}movdwordptr[ebp-14h],000D813C9popedi00D813CApopesi00D813CBpopebx00D813CCmovesp,ebp00D813CEpopebp00D813CFret在試驗報告中,需要給出代碼清單9中反匯編代碼的解釋。9,以及內(nèi)存映像〔調(diào)式->窗口->內(nèi)存〕4。49對應(yīng)的棧幀布局4可以看出,當(dāng)增加一個局部變量時,這個局部變量的上方和下方都會填充假設(shè)干個0xcc字節(jié)。在試驗報告中,完成下面幾種情形的棧幀布局分析,并寫出棧幀布局的規(guī)律。9的解釋:首先將p壓棧,然后將現(xiàn)在〔棧頂指針〕的值賦給〔保存原始現(xiàn)場,然后將p-hi-的地址值賦給edi,再將ecx36h,然后將eax賦值為0CCCCCCCCh,之后執(zhí)行stos指令,將這一段未被初始化的棧全部賦值為0xCCh.,chari=0〔ebp-5〕,inti=0賦值(ebp-14h),在之后,將edi,esi,ebx出棧,并且將esp復(fù)原為原來的ebp的值〔即復(fù)原現(xiàn)場。voidf{chari=0;shortj=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}下面是代碼清單10的反匯編代碼:voidf{00F613A0 push ebp00F613A1 mov ebp,esp00F613A3subesp,0D8h00F613A9pushebx00F613AApushesi00F613ABpushedi00F613ACleaedi,[ebp+FFFFFF28h]00F613B2movecx,36h00F613B7moveax,0CCCCCCCCh00F613BCrepstosdwordptres:[edi]chari=0;00F613BE mov byteptr[ebp-5],0shortj=0;00F613C200F613C4}xormoveax,eaxwordptr[ebp-14h],ax00F613C8popedi00F613C9popesi00F613CApopebx00F613CBmovesp,ebp00F613CDpopebp00F613CE ret返回地址ebp的值0xcccccccci〔1個字節(jié)〕0xcc0xcc0xccj〔2個字節(jié)〕0xcccccccc0xcccccccc〔共計有ebx的值esi的值edi的值voidf{chari=0;charj=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}11的反匯編代碼:voidf{000213A0 push ebp000213A1movebp,esp000213A3subesp,0D8h000213A9pushebx000213AApushesi000213ABpushedi000213ACleaedi,[ebp+FFFFFF28h]000213B2movecx,36h000213B7moveax,0CCCCCCCCh000213BCrepstosdwordptres:[edi]chari=0;000213BE mov byteptr[ebp-5],0charj=0;000213C2}movbyteptr[ebp-11h],0000213C6popedi000213C7popesi000213C8popebx000213C9movesp,ebp000213CBpopebp000213CCret返回地址ebp的值0xcccccccci0xcc0xcc0xcc0xcccccccc0xccccccccj0xcc0xcc0xcc0xcccccccc0xcccccccc〔0xc0個0xcc〕ebx的值esi的值edi的值下面是代碼清單12;voidf{chari=0;intj=0;shortk=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}下面是代碼清單12的反匯編代碼voidf{00A313A0 push ebp00A313A1movebp,esp00A313A3subesp,0E4h //將esp的值減去0E4h個單位00A313A9pushebx00A313AApushesi00A313ABpushedi00A313ACleaedi,[ebp+FFFFFF1Ch]00A313B2movecx,39h00A313B7moveax,0CCCCCCCCh00A313BCrepstosdwordptres:[edi]chari=0;00A313BE mov byteptr[ebp-5],0 值i賦值為0intj0;00A313C2 mov dwordptr[ebp-14h],0 0shortk0;00A313C900A313CB}xormoveax,eaxwordptr[ebp-20h],ax00A313CFpopedi //出棧00A313D0popesi00A313D1popebx00A313D2movesp,ebp ///恢復(fù)現(xiàn)場00A313D4popebp00A313D5ret代碼清單12的棧幀布局:返回地址0xcccccccci〔1個字節(jié)〕0xcc0xcc0xcc0xcccccccc0xccccccccj〔4個字節(jié)〕0xcccccccc0xcccccccc0xcc0xcck〔2個字節(jié)〕0xcccccccc0xcccccccc〔共計有0xc0的值的值棧幀布局的規(guī)律總結(jié):壓棧保存。pushebp;存放器。movebpesp;安排棧大小棧大小=0xc0+變量個數(shù)* 0x0csubesp棧大??;的值壓棧ebp-edileaedi[ebp-棧大小]stos指令初始化棧char int short三種類型局部變量的棧安排方式不同每個變量都是占了12字節(jié)的棧,其中12字節(jié)分為三局部,第一局部440xcccccccc其次局部4個字節(jié)存放變量,其中int型完全占用其次局部4個字節(jié),char型占0xccshort占用其次局部后兩個字節(jié),剩下兩個字節(jié)填入0xccduoble型變量的狀況下,124個字節(jié)存放8個字節(jié)存放變量ebp,恢復(fù)調(diào)用函數(shù)前的現(xiàn)場。3.315可以看出,在 數(shù)中,將ecx的值同513的棧幀布局 security_cookie進(jìn)展了比較。正常狀況下,這兩者應(yīng)當(dāng)是相等的。假設(shè)有越界寫的行為,可能會造成x的值同 e不全都。當(dāng)不相等時e,tl,即不相等時跳轉(zhuǎn),跳轉(zhuǎn)到failure處。1315ecx和 security_cookie的值不全都。試驗報告中需要給出添加的代碼及解釋,以及程序的運(yùn)行結(jié)果截圖。ebpebp-4ebp-8ebp-9ebp-0x0cebp-0x10ebp-0x14
返回地址前幀ebp的值安全cookie的異或運(yùn)算結(jié)果0xcccccccci0xcc0xcc0xcc0xcccccccc0xcccccccc
共有0xec個字節(jié)ebp-0x28
chara[20]ebp-0x2c 0xcccccccc..0xcccccccc..原ebx的值原esi的值原edi的值
共有0xc0個0xcc513的棧幀布局。添加代碼之后的程序:#include“stdafx.h“voidf{chari=0;chara[20];a[0]=0;a[36]=100;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}通過棧幀的布圖可以看出,我們通過 a[36]就可以訪問到我們的 ,通過更改 security_cookie的值,我們就可以造成ecx的值同 security_cookie不全都,從而導(dǎo)致我們 從而報錯。下面是程序的調(diào)試截圖:試驗程序:下面是反匯編調(diào)試后的代碼,逐步調(diào)試,按F11鍵進(jìn)入 security_check_cookie函數(shù),我們查看執(zhí)行過程我們看到確實是執(zhí)行了failure后面的程序,然后連續(xù)運(yùn)行直至報錯。#include“stdafx.h“voidf{chara[1];a[0]=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}代碼清單16的反匯編代碼:voidf{01211A40 push ebp01211A41movebp,esp01211A43subesp,0CCh01211A49pushebx01211A4Apushesi01211A4Bpushedi01211A4Cleaedi,[ebp-0CCh]01211A52movecx,33h01211A57moveax,0CCCCCCCCh01211A5Crepstosdwordptres:[edi]chara[1];a[0]=0;01211A5E mov byteptr[ebp-5h],0}01211A62 push edx01211A63movecx,ebp01211A65pusheax01211A66leaedx,[(1211A7Ch)]01211A6Ccall(121108Ch)01211A71popeax01211A72popedx01211A73popedi01211A74popesi01211A75popebx01211A76movesp,ebp01211A78popebp01211A79ret返回地址前幀ebp的值0xccccccccchar a[1]〔一字節(jié)〕0xcc0xcc0xcc0xcccccccc0xcccccccc(共計0xc0個0xcc)原ebx的值原dsi的值原edi的值#include“stdafx.h“voidf{chara[3];a[0]=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}17的反匯編代碼voidf{004113A0 push ebp004113A1movebp,esp004113A3subesp,0CCh004113A9pushebx004113AApushesi004113ABpushedi004113ACleaedi,[ebp+FFFFFF34h]004113B2movecx,33h004113B7moveax,0CCCCCCCCh004113BCrepstosdwordptres:[edi]chara[3];a[0]=0;004113BE mov byteptr[ebp-10h],0}004113C2pushedx004113C3movecx,ebp004113C5pusheax004113C6leaedx,ds:[004113DCh]004113CCcall0041108C004113D1popeax004113D2popedx004113D3popedi004113D4popesi004113D5popebx004113D6movesp,ebp004113D8popebp004113D9ret返回地址ebp的值0xcccccccc(共計有0x0D 個0xcc)0xCC個字節(jié)
chara[3]〔3個字節(jié)〕0xcc)的值的值
ebp-10h#include“stdafx.h“voidf{chara[5];a[0]=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}18的反匯編代碼:voidf{00281A40 push ebp00281A41movebp,esp00281A43subesp,0D4h00281A49pushebx00281A4Apushesi00281A4Bpushedi00281A4Cleaedi,[ebp-0D4h]00281A52movecx,35h00281A57moveax,0CCCCCCCCh00281A5Crepstosdwordptres:[edi]00281A5Emoveax,dwordptr[ security_cookie(28702Ch)]00281A63xoreax,ebp00281A65movdwordptr[ebp-4],eaxchara[5];a[0]=0;00281A68 mov byteptr[ebp-1Ch],0}00281A6C push edx00281A6D mov ecx,ebp00281A6F push eax00281A70leaedx,[(281A90h)]00281A76call@ILT+135(@_RTC_CheckStackVars@8)(28108Ch)00281A7Bpopeax00281A7Cpopedx00281A7Dpopedi00281A7Epopesi00281A7Fpopebx00281A80movecx,dwordptr[ebp-4]00281A83xorecx,ebp00281A85call@ILT+25(@ security_check_cookie@4)(28101Eh)00281A8Amovesp,ebp00281A8Cpopebp00281A8Dret返回地址ebp的值cookie的異或運(yùn)算結(jié)果ch個〕chara[5](5個字節(jié))0xcc個字節(jié)ebp-1Ch0xcc)ebx的值esi的值#include“stdafx.h“voidf{chari[5];charj[7];i[0]=0;j[0]=0;}int_tmain(intargc,_TCHAR*argv[]){f;return0;}說明何種狀況下,才會有 security_cookie的安全性檢查?答:經(jīng)過試驗覺察,在數(shù)組長度大于或者等于5個的狀況下就會消滅 security_cookie的安全性檢查。在前面已經(jīng)得出的棧幀布局規(guī)律根底之上,把局部數(shù)組的狀況考慮進(jìn)去,在試驗報告中寫出的布局規(guī)律。答:在前面的棧幀布局規(guī)律的根底上加上局部數(shù)組之后,消滅了如下變化:假設(shè)數(shù)組長度大于等于5的話,在前幀ebp之后會存儲4個字節(jié)的安全cookie異或運(yùn)算結(jié)果,用于檢查緩沖區(qū)溢出。在存放局部數(shù)組的時候,與一般局部變量的存放狀況不同,是單獨(dú)開拓一塊空間存放數(shù)組,且依據(jù)數(shù)組下標(biāo)大小依據(jù)小下標(biāo)對應(yīng)小地址,大下標(biāo)對應(yīng)大地址的方式存儲,并
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)農(nóng)耕體驗教育課程方案
- 中醫(yī)院抗震加固施工方案
- 鋼結(jié)構(gòu)工程安全隱患排查方案
- 網(wǎng)絡(luò)通信設(shè)備維護(hù)手冊
- 2026貴州惠水縣引進(jìn)體育人才備考題庫含答案詳解
- 2026福建福州市馬尾海關(guān)單證資料管理崗位輔助人員招聘1人備考題庫及答案詳解參考
- 健身服務(wù)行業(yè)操作規(guī)范手冊
- 中國精準(zhǔn)醫(yī)療行業(yè)標(biāo)準(zhǔn)制定市場教育及投資回報周期評估報告
- 中國民用航空飛行學(xué)院《中國特色社會主義理論體系》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國空氣動力學(xué)粒度儀(APS)行業(yè)政策紅利與投資機(jī)會評估報告
- 2026年甘肅省公信科技有限公司面向社會招聘80人(第一批)筆試模擬試題及答案解析
- 文獻(xiàn)檢索與論文寫作 課件 12.1人工智能在文獻(xiàn)檢索中應(yīng)用
- 艾滋病母嬰傳播培訓(xùn)課件
- 公司職務(wù)犯罪培訓(xùn)課件
- 運(yùn)營團(tuán)隊陪跑服務(wù)方案
- 北京中央廣播電視總臺2025年招聘124人筆試歷年參考題庫附帶答案詳解
- 工業(yè)鍋爐安全培訓(xùn)課件
- 2026中國單細(xì)胞測序技術(shù)突破與商業(yè)化應(yīng)用前景報告
- 叉車初級資格證考試試題與答案
- 2025至2030中國新癸酸縮水甘油酯行業(yè)發(fā)展研究與產(chǎn)業(yè)戰(zhàn)略規(guī)劃分析評估報告
- 剪映完整課件
評論
0/150
提交評論