郁金香及反匯編系列教程40-50編寫干凈函數(shù)_第1頁
郁金香及反匯編系列教程40-50編寫干凈函數(shù)_第2頁
郁金香及反匯編系列教程40-50編寫干凈函數(shù)_第3頁
郁金香及反匯編系列教程40-50編寫干凈函數(shù)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、預(yù)計平均每天3課,錄制過程中,大綱會實(shí)時更新(更改)主講:知其所以然開發(fā)環(huán)境:VC6,VS2003,VS2008http6、用 declspec(naked)寫干凈的函數(shù)VOID declspec(naked) MyNakedFunction()strcmp(.);/ cdecl 函數(shù)是調(diào)用者清除參數(shù)堆棧,對于非內(nèi)聯(lián)匯編調(diào)用這類函數(shù),編譯器將自動平衡堆棧,加入 ADD ESP, 8VOID declspec(naked) MyNakedFunction()/. asm CALL strcmp; asm ADD ESP, 8; / 內(nèi)聯(lián)匯編需要自己平衡堆棧 declspec(naked) 是且僅

2、是不產(chǎn)生 prolog 和分配局部變量、平衡堆棧、返回值。log 代碼 保存并恢復(fù)使用過的寄存器和附上剛翻譯的一些 MSDN 可能對 naked 函數(shù)有點(diǎn)用的資料SpecificAll arguments are widened to 32 bits when they are passed. Return values are also widened to 32 bits and returned in the EAX register, except for 8-byte structures, which are returned in theEDX:EAX registair. La

3、rger structures are returnedhe EAX register as poers to hiddenreturn structures. Parameters are pushed onto the stack from right to left. StructuresPODs will not be returned in registers.t are notThe compiler generates prolog andlog code to save and restore the ESI, EDI, EBX, and EBPregisters, if th

4、ey are usedNotehe function.When a struct, union, or class is returned from a function by value, all definitions of the type needto be the same, else the program may fail at runtime.For information on how to define your own function prolog andCalls.log code, see Naked FunctionThe following calling co

5、nventions are supported by the Visual C/C+ compiler.Keyword Stack cleanup Parametassing cdecl Call clrcall n/a Loushes parameters on the stack, in reverse order (right to left)arameters onto CLR expresstack in order (left to right). stdcall Callee Pushes parameters on the stack, in reverse order (ri

6、ght to left) fastcall Callee Stored in registers, then pushed on stack thiscall Callee Pushed on stack; this poer stored in ECX微軟細(xì)節(jié)所有參數(shù)在傳遞時都被擴(kuò)展為 32 位。除了 8 字節(jié)結(jié)構(gòu)體返回在 EDX:EAX 寄存器一對中,其它返回值同樣被擴(kuò)展為 32 位并返回在 EAX 寄存器中。大的結(jié)構(gòu)體返回在 EAX 寄存器中的是指針來間接返回結(jié)構(gòu)體。參數(shù)是自右向左壓入堆棧。結(jié)構(gòu)體是非 POD(Plain Old Data)類型將不會返回在寄存器中。如果 ESI、EDI、

7、EBX 和 EBP 寄存器在函數(shù)中使用,編譯器將產(chǎn)生 prolog 和碼保存并恢復(fù)它們。注釋log 代當(dāng)一個函數(shù)用值返回結(jié)構(gòu)體(struct)、聯(lián)合體(union)或者類(class)時,所有類型的定義必須相同,否則程序可能在運(yùn)行過程中失敗。關(guān)于如何定義你自身函數(shù) prolog 和log 代碼的信息,請查閱 Naked Function Calls。Visual C/C+ 編譯器支持以下調(diào)用轉(zhuǎn)換:關(guān)鍵字 cdecl clrcall stdcall fastcall thiscall堆棧清除調(diào)用者參數(shù)傳遞將參數(shù)倒序壓入堆棧(自右向左)將參數(shù)順序加載到 CLR expres將參數(shù)倒序壓入堆棧(自右

8、向左)保存在寄存器然后壓入堆棧堆棧中(自左向右)不適用 被調(diào)用者被調(diào)用者被調(diào)用者壓入堆棧,指針保存在 ECX 寄存器中 fastcall:兩個以內(nèi)不大于 4 字節(jié)(DWORD)的參數(shù)將自左向右分別保存在 ECX、EDX寄存器內(nèi),由于沒有將參數(shù)壓入堆棧,函數(shù)返回前無需將參數(shù)出棧(這就是它 FASTCALL由來);其它參數(shù)仍按自右向左壓入堆棧,函數(shù)返回時需要把這些參數(shù)出棧。/正常的情況下,寫一個 C/C+ 函數(shù),即使是一個空函數(shù),編譯器也為做了不少的工作,生成了一些“必要”的代碼。請看下面的函數(shù) (為了說明問題隨便寫的): Test()iReturn;char szTemp33;szTemp0 =

9、 A;szTemp1 = 0;iReturn = MessageBox(NULL, szTemp, szTemp, MB_OK);MessageBereturn iReturn;Return);下面是用 VC6 在 Release 方式下編譯后的的反匯編代碼:00401000 sub esp,24h / 增加堆??臻g存放局部變量 (24H = 36D,4 字節(jié)對齊,注意這里沒有為 iReturn 分配空間)00401003 push esi/ 保存要使用的重要寄存器00401004 lea eax,esp+4 / 下面是傳遞 MessageBox() 要使用的參數(shù)00401008 push 0

10、0040100A lea ecx,esp+8 / 編譯器愚蠢,根本不用 ECX,兩個都是 szTemp,兩次 PUSHEAX 不得了0040100E push eax 0040100F push ecx 00401010 push 000401012 mov byte ptr esp+14h,41h 00401017 mov byte ptr esp+15h,00040101C call dword ptr ds:40509Ch / 調(diào)用 MessageBox()00401022 mov esi,eax / 保存返回值到變量 iReturn ???!變量 iReturn 自動使用 ESI,編譯器

11、太聰明了:)00401024 push esi00401025 call dword ptr ds:4050A0h / 調(diào)用 MessageBeep() 0040102B mov eax,esi / 把變量 iReturn 交給 EAX 作為返回值 0040102D pop esi / 恢復(fù)要使用的重要寄存器0040102E add esp,24h / 減少堆棧空間00401031 ret / 堆棧長度減 4 并返回這段代碼雖然很精干 (都能自動使用寄存器來保存變量了),但是有的時候并不需要編譯器提供這些自作主張的代碼 (比如寫驅(qū)動程序的時候,不過我還沒遇到過這種情況,呵呵),希望整個全部函數(shù)

12、都是自己親手寫進(jìn)去的 (BT 呀o)。好,請出今天的主角 “naked”(怎么是呀?),歡迎!Visual C+ 的擴(kuò)展關(guān)鍵字 naked 允許完全定制一個函數(shù),廢話不說了,看例子 (熬夜寫的 Zzzzzz): declspec(naked) asmSUB ESP,24H PUSH ESITest()LEA EAX,ESP+4 PUSH 0PUSH EAXPUSH EAX PUSH 0MOV BYTE PTR ESP+14H,41H MOV BYTE PTR ESP+15H,0CALL DWORD PTR MessageBoxA MOV ESI,EAXPUSH ESICALL DWORD PTR MessageBeep MOV EAX,ESIPOP ESIADD ESP,24H RET上面的代碼是使用的 VC 的內(nèi)聯(lián)匯編,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論