![Windows X86-64位匯編語言入門教學(xué)內(nèi)容_第1頁](http://file4.renrendoc.com/view/08a107809dce59727a67c6401fcbf2ad/08a107809dce59727a67c6401fcbf2ad1.gif)
![Windows X86-64位匯編語言入門教學(xué)內(nèi)容_第2頁](http://file4.renrendoc.com/view/08a107809dce59727a67c6401fcbf2ad/08a107809dce59727a67c6401fcbf2ad2.gif)
![Windows X86-64位匯編語言入門教學(xué)內(nèi)容_第3頁](http://file4.renrendoc.com/view/08a107809dce59727a67c6401fcbf2ad/08a107809dce59727a67c6401fcbf2ad3.gif)
![Windows X86-64位匯編語言入門教學(xué)內(nèi)容_第4頁](http://file4.renrendoc.com/view/08a107809dce59727a67c6401fcbf2ad/08a107809dce59727a67c6401fcbf2ad4.gif)
![Windows X86-64位匯編語言入門教學(xué)內(nèi)容_第5頁](http://file4.renrendoc.com/view/08a107809dce59727a67c6401fcbf2ad/08a107809dce59727a67c6401fcbf2ad5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。Windows X86-64位匯編語言入門-WindowsX86-64位匯編語言入門WindowsX64匯編入門(1)最近斷斷續(xù)續(xù)接觸了些64位匯編的知識(shí),這里小結(jié)一下,一是階段學(xué)習(xí)的回顧,二是希望對(duì)64位匯編新手有所幫助。我也是剛接觸這方面知識(shí),文中肯定有錯(cuò)誤之處,大家多指正。文章的標(biāo)題包含了本文的四方面主要內(nèi)容:(1)Windows:本文是在windows環(huán)境下的匯編程序設(shè)計(jì),調(diào)試環(huán)境為WindowsVista64位版,調(diào)用的均為windowsAPI。(2)X64:本文討論的是x64匯編,這里的x6
2、4表示AMD64和Intel的EM64T,而不包括IA64。至于三者間的區(qū)別,可自行搜索。(3)匯編:顧名思義,本文討論的編程語言是匯編,其它高級(jí)語言的64位編程均不屬于討論范疇。(4)入門:既是入門,便不會(huì)很全。其一,文中有很多知識(shí)僅僅點(diǎn)到為止,更深入的學(xué)習(xí)留待日后努力。其二,便于類似我這樣剛接觸x64匯編的新手入門。本文所有代碼的調(diào)試環(huán)境:WindowsVistax64,IntelCore2Duo。1.建立開發(fā)環(huán)境1.1編譯器的選擇對(duì)應(yīng)于不同的x64匯編工具,開發(fā)環(huán)境也有所不同。最普遍的要算微軟的MASM,在x64環(huán)境中,相應(yīng)的編譯器已經(jīng)更名為ml64.exe,隨VisualStudio2
3、005一起發(fā)布。因此,如果你是微軟的忠實(shí)fans,直接安裝VS2005既可。運(yùn)行時(shí),只需打開相應(yīng)的64位命令行窗口(圖1),便可以用ml64進(jìn)行編譯了。第二個(gè)推薦的編譯器是GoASM,共包含三個(gè)文件:GoASM編譯器、GoLINK鏈接器和GoRC資源編譯器,且自帶了Include目錄。它的最大好外是小,不用為了學(xué)習(xí)64位匯編安裝幾個(gè)G的VS。因此,本文的代碼就在GoASM下編譯。第三個(gè)Yasm,因?yàn)椴皇?,所以不再贅述,感興趣的朋友自行測試吧。不同的編譯器,語法會(huì)有一定差別,這在下面再說。1.2IDE的選擇搜遍了Internet也沒有找到支持asm64的IDE,甚至連個(gè)Editor都沒有。因此,
4、最簡單的方法是自行修改EditPlus的masm語法文件,這也是我采用的方法,至少可以得到語法高亮。當(dāng)然,如果你懶得動(dòng)手,那就用notepad吧。沒有IDE,每次編譯時(shí)都要手動(dòng)輸入不少參數(shù)和選項(xiàng),做個(gè)批處理就行了。1.3硬件與操作系統(tǒng)硬件要求就是64位的CPU。操作系統(tǒng)也必須是64位的,如果在64位的CPU上安裝了32位的操作系統(tǒng),就算編譯成功也無法運(yùn)行程序。2.寄存器的改變匯編是直接與寄存器打交道的語言,因此硬件對(duì)語言影響很大。先來看看x64與x32相比在硬件上多了什么,變了什么(圖2)。X64多了8個(gè)通用寄存器:R8、R9、R10、R11、R12、R13、R14、R15,當(dāng)然,它們都是64
5、位的。另外還增加了8個(gè)128位XMM寄存器,不過通常用不著。X32中原有的寄存器在X64中均為擴(kuò)展為64位,且名稱的第一個(gè)字母從E改為R。不過我們還是可以在64位程序中調(diào)用32位的寄存器,如RAX(64位)、EAX(低32)、AX(低16位)、AL(低8位)、AH(8到15位),相應(yīng)的有R8、R8D、R8W和R8B。不過不要在程序中使用如AH之類的寄存器,因?yàn)樵贏MD的CPU上這種用法會(huì)與某些指令產(chǎn)生沖突。3.第一個(gè)x64匯編程序本節(jié),我們開始編寫自己的第一個(gè)x64匯編程序。在這之前,先講一下callingconvention的改變。3.1API調(diào)用方式把Callingconvention放在
6、第一個(gè)講,代表它的重要性。在32位匯編中,我們調(diào)用一個(gè)API時(shí),采用的是stdcall,它有兩個(gè)特點(diǎn):一是所有參數(shù)入棧,通過椎棧傳遞;二是被調(diào)用的API負(fù)責(zé)棧指針(ESP)的恢復(fù),我們?cè)谡{(diào)用MessageBox后不用addesp,14h,因?yàn)镸essageBox已經(jīng)恢復(fù)過了。而在x64匯編中,兩方面都發(fā)生了變化。一是前四個(gè)參數(shù)分析通過四個(gè)寄存器傳遞:RCX、RDX、R8、R9,如果還有更多的參數(shù),才通過椎棧傳遞。二是調(diào)用者負(fù)責(zé)椎??臻g的分配與回收。下面給出一段代碼,功能是顯示一個(gè)簡單的MessageBox,注意對(duì)RSP的操作:代碼:;示例代碼1.asm;語法:GoASMDATASECTIONt
7、extdbHellox64!,0captiondbMyFirstx64Application,0CODESECTIONSTART:subrsp,28hxorr9d,r9dlear8,captionleardx,textxorrcx,rcxcallMessageBoxAaddrsp,28hret這段代碼是在GoASM中編譯,指令部分GoASM與ML64差不多,關(guān)鍵是一些宏的定義有差別。比如masm中的.code,在這里就成了CODESECTION。下面再說區(qū)別,先編譯。GoASM中編譯分兩步:(1)編譯:goasm/x641.asm(2)鏈接:golink1.objuser32.dll如果一些正
8、常,命令行中應(yīng)顯示圖3的內(nèi)容。運(yùn)行一下,我們的第一個(gè)64位windows程序就運(yùn)行了。GoASM還有一個(gè)特點(diǎn)是支持宏:ARG和INVOKE,使用這兩個(gè)宏可以免除程序員自己對(duì)椎棧進(jìn)行操作。不過初學(xué)嗎,還是從基礎(chǔ)掌握比較好。下面的一段代碼相同的功能的MASM代碼,注意看看區(qū)別。ML64至今仍不支持宏,所以每一步工作都要自己做。代碼:;示例代碼2.asm;語法:ML64extrnMessageBoxA:proc.datatextdbHellox64!,0captiondbMyFirstx64Application,0.codeMainprocsubrsp,28hxorr9d,r9dlear8,cap
9、tionleardx,textxorrcx,rcxcallMessageBoxAaddrsp,28hretMainENDPend編譯這段代碼的命令行是:ml642.asm/link/subsystem:windows/entry:Mainuser32.lib。如果正常,應(yīng)該如圖5顯示那樣。很有意思吧,在64位系統(tǒng)下,我們?nèi)匀徽{(diào)用user32的API??赡苁敲Q用習(xí)慣了,微軟自己都懶得改了吧。3.264位的椎棧代碼中還有一處值得注意,那就是subrsp,28h和addrsp,28h。28h這個(gè)數(shù)值是怎么來的呢?首先,x64中椎棧被擴(kuò)展為64位;其次,我們?cè)谡{(diào)用MessageBoxA時(shí),要給四個(gè)參
10、數(shù)外加一個(gè)返回地址留空間,因此8(位)*5=40=28h。另外一些小問題要注意,AMD64不支持push32bit寄存器的指令,最好的方法就是push和pop都用64位寄存器。EM64T如何?看了下Intel的開發(fā)手冊(cè),各個(gè)指令都分三種情況:純32位、純64位和32與64位混合。下面是手冊(cè)的片段:Opcode*Instruction64-BitModeCompat/LegModeDescriptionFF/6PUSHr/m16ValidValidPushr/m16.FF/6PUSHr/m32N.E.ValidPushr/m32.FF/6PUSHr/m64ValidN.E.Pushr/m64.D
11、efaultoperandsize64-bits.沒別的好方法,使用中多注意,盡量在64位程序中保用64位寄存器。4.一些參考資料寫完了第一個(gè)helloworld,本文就此打住。本還想寫一些內(nèi)容,但掌握不深,留待下回吧。感覺有些資料不得不在第一篇文章中放出來,因?yàn)樗鼈兪乾F(xiàn)有學(xué)習(xí)x64匯編的最好教材了,文中很多代碼和知識(shí)點(diǎn)也來自于這些資料。(1)MovingtoWindowsx64,出自:/Files/vista_x64.htm(2)GoASM的幫助文檔,目前最好的64位匯編教程。出自:www.jorgon.freeserve.co.uk(3)開始進(jìn)行64位Windows系統(tǒng)編程之前需要了解的所
12、有信息,出自:/china/MSDN/library/Windev/64bit/issuesx64.mspx(4)來自CodeGurus的兩篇文章Assembler&Win64,http:/www.codegurus.be/codegurus/Programming/assembler&win64_en.htmboutRIPrelativeaddressinghttp:/www.codegurus.be/codegurus/Programming/riprelativeaddressing_en.htm(5)AMD開發(fā)手冊(cè)(6)Intel開發(fā)手冊(cè),注意是新的ntel64andIA-32Arch
13、itecturessoftwareDevelopersManualWindowsX64匯編入門(2)五一長假就要結(jié)束了,總算有時(shí)間好好睡了幾個(gè)懶覺。今天醒來后想到的第一件事就是,該寫第二篇了。64位技術(shù)現(xiàn)在還不成熟,沒有好調(diào)試器,但是我們搞技術(shù)的總是對(duì)新東西充滿了好奇和熱情。這個(gè)理由就足夠我們現(xiàn)在開始學(xué)習(xí)64位匯編了!OK,Letsgoon。1.再說Callingconvention關(guān)于API的調(diào)用方式,在入門(1)中說了一些,不過感覺有必要再講兩點(diǎn)。一是在調(diào)用API時(shí)椎棧的框架,也就是StackFrame,二是利用反匯編64位C/C+程序來研究callingconvention。先說Stac
14、kFrame。圖1是一個(gè)通用的椎棧框架。在一個(gè)使用STDCALL的32位程序中,stackframe的四項(xiàng)工作:(1)傳入?yún)?shù)的調(diào)用;(2)在返回caller時(shí),callee要負(fù)責(zé)平衡椎棧;(3)給局部變量提供空間;(4)保證ebx、esi、edi和ebp四個(gè)寄存器的值不變(這種寄存器被稱為non-volatile)。在64位環(huán)境中,少了一個(gè)平衡椎棧的任務(wù),因?yàn)槠胶庾禇5墓ぷ饔蒫aller負(fù)責(zé)了,因此callee的stackframe只剩下三項(xiàng)工作:(1)將寄存器傳入的參數(shù)和其它超過4個(gè)以上的參數(shù)在椎棧上保存(入棧);(2)給局部變量提供空間;(3)保證non-volatile寄存器的值不變,
15、包括ebp、ebx、rdi、rsi、r12到r15,xmm6到xmm15。所以,在一個(gè)函數(shù)的開始往往有如下代碼:MOVRSP+8h,RCXMOVRSP+10h,RDXMOVRSP+18h,R8MOVRSP+20h,R9PUSHRBPMOVRBP,RSP而在返回時(shí)會(huì)有如下代碼:LEARSP,RBPPOPRBPRET圖2摘自GoASM的幫助文檔,上文描述的情況在圖中一目了然。如果能在VC中編譯64位C/C+程序,再用IDA反匯編,不是挺好的嗎?正確,這正是我們玩兒逆向工程的人喜歡的方法。VisualStudio2005的64位開發(fā)環(huán)境設(shè)置網(wǎng)上有,這里不多說了。以一個(gè)C/C+的代碼為例:代碼:/Me
16、ssagehandlerforaboutbox.INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)UNREFERENCED_PARAMETER(lParam);switch(message)caseWM_INITDIALOG:return(INT_PTR)TRUE;caseWM_COMMAND:if(LOWORD(wParam)=IDOK|LOWORD(wParam)=IDCANCEL)EndDialog(hDlg,LOWORD(wParam);return(INT_PTR)TRUE;break;return
17、(INT_PTR)FALSE;這段代碼是一個(gè)地球人都知道的窗口消息處理代碼,在編譯為64位程序后,用ida64看一下它的反匯編。這樣,熟悉而又有點(diǎn)陌生的64位匯編代碼就出來了,包括消息的判斷,EndDialog的調(diào)用等,確實(shí)很方便。2.第二個(gè)匯編例子:SMC在入門(1)中我們寫了第一個(gè)64位的匯編程序,這里我們開始寫第二個(gè)。當(dāng)然,代碼本身還是有點(diǎn)意思的,這就是SelfModifyCode。讓我們?cè)囈辉嘢MC在64位下進(jìn)行的如何?這還牽涉到vista的特性。代碼來自修改過的參考資料AboutRIPrelativeaddressing。DATASECTIONtestzerodbeax值為0,0te
18、stnonzerodbeax值不為0!,0testtitledb測試oreax,eax指令,0oldprotectdd?CODESECTIONStart:;改變當(dāng)前內(nèi)存頁的保護(hù)為可寫subrsp,28hlear9,oldprotect;R9=lpflOldProtectmovr8d,40h;R8D=flNewProtectmovrdx,1;RDX=dwSizelearcx,modifyhere;RCX=lpAddresscallVirtualProtectaddrsp,28hlearax,modifyhereincBraxxoreax,eaxoreax,eax;如果eax為0,則or指令會(huì)使j
19、z跳轉(zhuǎn)learax,testzeromodifyhere:jz.skip;這個(gè)是GoASM的語法,號(hào)表示后面代碼中的labellearax,testnonzero.skip;GoASM中的label這樣定義;顯示結(jié)果subrsp,28hmovr9d,0;R9D=UINTuTypelear8,testtitle;R8=LPCTSTRlpCaptionmovrdx,rax;RDX=LPCSTRlpTextmovrcx,0;RCX=HWNDhWndcallMessageBoxAmovecx,eax;ECX=UINTuExitCodecallExitProcessaddrsp,28hret代碼的執(zhí)行流
20、程如下:將eax賦0,然后進(jìn)行oreax,eax,如果不修改代碼,則jz處會(huì)跳轉(zhuǎn),結(jié)果會(huì)顯示“eax值為0”。我們的任務(wù)就是把jz改為jnz。jz的十六進(jìn)制編碼為74,jnz為75。編譯一下:GoASM/x64“2.1.asm”GoLink“2.1.obj”kernel32.dlluser32.dll因?yàn)槲覀兗尤肓讼旅鎯删浯a:learax,modifyhereincBrax所以jz為in為jnz了。結(jié)果顯示如下圖所示。注意,GoASM中byteptr簡寫為B。當(dāng)然,你可以把上面兩句指令刪除,那出來的就完全是另一個(gè)結(jié)果了。3.資源文件本文的最后一節(jié)來講下帶資源的程序編譯。由于GoASM有自己的
21、編譯器GoRC,而visualstudio中是rc,因此我們將分別用兩種語法編寫,看一下兩個(gè)編譯器中的相同與不同。先按下面的代碼建立MainDlg.rc,這個(gè)rc文件是兩個(gè)例子通用的,代碼來自RadASM的32位默認(rèn)模板代碼,其實(shí)就是一個(gè)對(duì)話框,沒有添加任何控件:代碼:#defineIDD_DLG11000IDD_DLG1DIALOGEX6,6,194,106CAPTION我的第一個(gè)DialogBoxFONT8,MSSansSerifSTYLE0 x10CF0000EXSTYLE0 x00000000BEGINEND來看一下GoASM語法的文件,其中用了很多GoASM的宏語法,不熟悉的可以看下
22、幫助文件。我們把它保存為2.2.asm。;#;DIALOGAPP;#;暫時(shí)沒有完整的include文件,我們把要用的自己添加進(jìn)來#DefineWM_INITDIALOG00110H#DefineWM_DESTROY00002H#DefineWM_COMMAND00111H#DefineWM_CLOSE00010H#IFNDEFFALSE#DefineFALSE0#ENDIF#IFNDEFTRUE#DefineTRUE1#ENDIFCONSTSECTIONIDD_DLG1equ1000DATASECTIONhInstanceDQ?CODESECTIONStart:;invoke是GoASM調(diào)用A
23、PI的宏,用不著我們自己進(jìn)行stackframe了invokeGetModuleHandleA,0movhInstance,raxinvokeInitCommonControlsinvokeDialogBoxParamA,hInstance,IDD_DLG1,0,ADDRDlgProc,0invokeExitProcess,0;FRAME是GoASM的宏DlgProcFRAMEhwnd,uMsg,wParam,lParammoveax,uMsgcmpeax,WM_INITDIALOGjne.WMCOMMANDjmp.EXIT.WMCOMMANDcmpeax,WM_COMMANDjne.WMCL
24、OSEjmp.EXIT.WMCLOSEcmpeax,WM_CLOSEjne.DEFPROCINVOKEEndDialog,hwnd,0.DEFPROCmoveax,FALSEret.EXITmoveax,TRUEretENDF編譯時(shí)有個(gè)很奇怪的問題,就是要把資源文件編譯成.obj格式才能順利鏈接。命令行如下:GoRC/machinex64/omaindlg.rcGoASM/x642.2.asmGoLink“2.2.obj”maindlg.objkernel32.dlluser32.dllcomctl32.dll生成了2.2.exe后,運(yùn)行,如下圖所示:下面,看一下ml64的編譯過程。rc文件不
25、變,把下面的代碼保存為2.3.asm。;#;DIALOGAPP;#extrnGetModuleHandleA:procextrnMessageBoxA:procextrnInitCommonControls:procextrnDialogBoxParamA:procextrnDestroyWindow:procextrnExitProcess:procextrnEndDialog:proc.constWM_INITDIALOGequ00110HWM_DESTROYequ00002HWM_COMMANDequ00111HWM_CLOSEequ00010HFALSEequ0TRUEequ1IDD_DLG1equ1000.data?hInstanceqword?.codeMainproc;invode是GoASM調(diào)用API的宏,用不著我們自己進(jìn)行stackframe了subrsp,30hxorrcx,rcxcallGetModuleHandleAmovhInstance,raxcallInitCommonCont
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高校PCR實(shí)驗(yàn)課程設(shè)計(jì)與實(shí)施計(jì)劃
- 2025年度核桃優(yōu)良品種繁育與銷售合作合同
- 2025年度綠色建筑節(jié)能改造工程聯(lián)合承包合同
- 二零二四年外聘專家提供企業(yè)管理咨詢服務(wù)合同3篇
- 公司2024年固定資產(chǎn)貸款合同版B版
- 2025年國際人工智能技術(shù)研發(fā)與設(shè)備進(jìn)口合同范本
- 二零二五版承諾合同樣本:體育賽事組織與贊助合同4篇
- 2025年度住宅小區(qū)配套設(shè)施工程承攬合同范本
- 二零二四年度農(nóng)產(chǎn)品直銷倉儲(chǔ)配送合同2篇
- 2025年度護(hù)膚品品牌授權(quán)與區(qū)域代理推廣與服務(wù)合同
- 充電樁知識(shí)培訓(xùn)課件
- 2025年七年級(jí)下冊(cè)道德與法治主要知識(shí)點(diǎn)
- 2025年交通運(yùn)輸部長江口航道管理局招聘4人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(shí)(2024版)解讀
- 偏癱足內(nèi)翻的治療
- 藥企質(zhì)量主管競聘
- 信息對(duì)抗與認(rèn)知戰(zhàn)研究-洞察分析
- 手術(shù)室??谱o(hù)士工作總結(jié)匯報(bào)
- 2025屆高三聽力技巧指導(dǎo)-預(yù)讀、預(yù)測
- 四年級(jí)下冊(cè)部編版語文教學(xué)參考教師用書
- 月球基地建設(shè)與運(yùn)行管理模式
評(píng)論
0/150
提交評(píng)論