亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? windows x64匯編入門(mén)(2).txt

?? 會(huì)變語(yǔ)言實(shí)現(xiàn)的一些程序
?? TXT
字號(hào):
【原創(chuàng)】Windows X64匯編入門(mén)(2)      

--------------------------------------------------------------------------------
標(biāo) 題: 【原創(chuàng)】Windows X64匯編入門(mén)(2)
作 者: tankaiha
時(shí) 間: 2007-05-07,22:51
鏈 接: http://bbs.pediy.com/showthread.php?t=44078

tankaiha

    五一長(zhǎng)假就要結(jié)束了,總算有時(shí)間好好睡了幾個(gè)懶覺(jué)。今天醒來(lái)后想到的第一件事就是,該寫(xiě)第二篇了。
    64位技術(shù)現(xiàn)在還不成熟,沒(méi)有好調(diào)試器,但是我們搞技術(shù)的總是對(duì)新東西充滿了好奇和熱情。這個(gè)理由就足夠我們現(xiàn)在開(kāi)始學(xué)習(xí)64位匯編了!OK,Let’s go on。

1.  再說(shuō)Calling convention
    關(guān)于API的調(diào)用方式,在入門(mén)(1)中說(shuō)了一些,不過(guò)感覺(jué)有必要再講兩點(diǎn)。一是在調(diào)用API時(shí)椎棧的框架,也就是Stack Frame,二是利用反匯編64位C/C++程序來(lái)研究calling convention。
    先說(shuō)Stack Frame。圖1是一個(gè)通用的椎棧框架。


    在一個(gè)使用STDCALL的32位程序中,stack frame的四項(xiàng)工作:
(1)  傳入?yún)?shù)的調(diào)用;
(2)  在返回caller時(shí),callee要負(fù)責(zé)平衡椎棧;
(3)  給局部變量提供空間;
(4)  保證ebx、esi、edi和ebp四個(gè)寄存器的值不變(這種寄存器被稱(chēng)為non-volatile)。
在64位環(huán)境中,少了一個(gè)平衡椎棧的任務(wù),因?yàn)槠胶庾禇5墓ぷ饔蒫aller負(fù)責(zé)了,因此callee的stack frame只剩下三項(xiàng)工作:
(1)  將寄存器傳入的參數(shù)和其它超過(guò)4個(gè)以上的參數(shù)在椎棧上保存(入棧);
(2)  給局部變量提供空間;
(3)  保證non-volatile寄存器的值不變,包括ebp、ebx、rdi、rsi、r12到r15,xmm6到xmm15。

    所以,在一個(gè)函數(shù)的開(kāi)始往往有如下代碼:

  MOV [RSP+8h],RCX
  MOV [RSP+10h],RDX
  MOV [RSP+18h],R8
  MOV [RSP+20h],R9
  PUSH RBP
  MOV RBP,RSP

    而在返回時(shí)會(huì)有如下代碼:
  LEA RSP,[RBP]
  POP RBP
  RET

    圖2摘自GoASM的幫助文檔,上文描述的情況在圖中一目了然。


    如果能在VC中編譯64位C/C++程序,再用IDA反匯編,不是挺好的嗎?正確,這正是我們玩兒逆向工程的人喜歡的方法。Visual Studio 2005的64位開(kāi)發(fā)環(huán)境設(shè)置網(wǎng)上有,這里不多說(shuō)了。以一個(gè)C/C++的代碼為例:


代碼:
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  UNREFERENCED_PARAMETER(lParam);
  switch (message)
  {
  case WM_INITDIALOG:
    return (INT_PTR)TRUE;

  case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
      EndDialog(hDlg, LOWORD(wParam));
      return (INT_PTR)TRUE;
    }
    break;
  }
  return (INT_PTR)FALSE;
}
    這段代碼是一個(gè)地球人都知道的窗口消息處理代碼,在編譯為64位程序后,用ida64看一下它的反匯編。這樣,熟悉而又有點(diǎn)陌生的64位匯編代碼就出來(lái)了,包括消息的判斷,EndDialog的調(diào)用等,確實(shí)很方便。


2.  第二個(gè)匯編例子:SMC
    在入門(mén)(1)中我們寫(xiě)了第一個(gè)64位的匯編程序,這里我們開(kāi)始寫(xiě)第二個(gè)。當(dāng)然,代碼本身還是有點(diǎn)意思的,這就是Self Modify Code。讓我們?cè)囈辉嘢MC在64位下進(jìn)行的如何?這還牽涉到vista的特性。代碼來(lái)自修改過(guò)的參考資料《About RIP relative addressing》。

DATA SECTION
testzero    db 'eax值為0', 0
testnonzero  db 'eax值不為0!', 0
testtitle db '測(cè)試or eax,eax指令', 0
oldprotect dd ?

CODE SECTION
Start:
  ;改變當(dāng)前內(nèi)存頁(yè)的保護(hù)為可寫(xiě)
  sub rsp,28h
  lea r9, oldprotect        ; R9  = lpflOldProtect
  mov r8d, 40h              ; R8D = flNewProtect
  mov rdx, 1                ; RDX = dwSize
  lea rcx, modifyhere ; RCX = lpAddress
  call VirtualProtect
  add rsp,28h

  lea rax,modifyhere
  inc B[rax]

  xor eax,eax
  or eax,eax
  ;如果eax為0,則or指令會(huì)使jz跳轉(zhuǎn)

  lea rax, testzero
modifyhere:
  jz >.skip  ;這個(gè)是GoASM的語(yǔ)法,>號(hào)表示后面代碼中的label
  lea rax, testnonzero

.skip    ;GoASM中的label這樣定義

  ; 顯示結(jié)果
  sub rsp,28h
  mov r9d, 0         ; R9D = UINT uType
  lea r8,  testtitle ; R8  = LPCTSTR lpCaption
  mov rdx, rax       ; RDX = LPCSTR lpText
  mov rcx, 0         ; RCX = HWND hWnd
  call MessageBoxA
  mov ecx, eax       ; ECX = UINT uExitCode
  call ExitProcess
  add rsp,28h

  ret


    代碼的執(zhí)行流程如下:將eax賦0,然后進(jìn)行or eax,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.dll user32.dll
    因?yàn)槲覀兗尤肓讼旅鎯删浯a:
  lea rax,modifyhere
  inc B[rax]
    所以jz為in為jnz了。結(jié)果顯示如下圖所示。注意,GoASM中byte ptr簡(jiǎn)寫(xiě)為B。當(dāng)然,你可以把上面兩句指令刪除,那出來(lái)的就完全是另一個(gè)結(jié)果了。


3.  資源文件
    本文的最后一節(jié)來(lái)講下帶資源的程序編譯。由于GoASM有自己的編譯器GoRC,而visual studio中是rc,因此我們將分別用兩種語(yǔ)法編寫(xiě),看一下兩個(gè)編譯器中的相同與不同。
先按下面的代碼建立MainDlg.rc,這個(gè)rc文件是兩個(gè)例子通用的,代碼來(lái)自RadASM的32位默認(rèn)模板代碼,其實(shí)就是一個(gè)對(duì)話框,沒(méi)有添加任何控件:


代碼:
#define IDD_DLG1 1000
IDD_DLG1 DIALOGEX 6,6,194,106
CAPTION "我的第一個(gè)DialogBox"
FONT 8,"MS Sans Serif"
STYLE 0x10CF0000
EXSTYLE 0x00000000
BEGIN
END
    來(lái)看一下GoASM語(yǔ)法的文件,其中用了很多GoASM的宏語(yǔ)法,不熟悉的可以看下幫助文件。我們把它保存為2.2.asm。
;##################################################################
; DIALOGAPP
;##################################################################

;暫時(shí)沒(méi)有完整的include文件,我們把要用的自己添加進(jìn)來(lái)
#Define WM_INITDIALOG               00110H
#Define WM_DESTROY                  00002H
#Define WM_COMMAND                  00111H
#Define WM_CLOSE                    00010H


#IFNDEF FALSE
  #Define FALSE               0
#ENDIF

#IFNDEF TRUE
  #Define TRUE                1
#ENDIF

CONST SECTION
  IDD_DLG1  equ    1000


DATA SECTION
  hInstance  DQ    ?

CODE SECTION

Start:
  ;invoke是GoASM調(diào)用API的宏,用不著我們自己進(jìn)行stack frame了
  invoke GetModuleHandleA, 0
  mov [hInstance],rax
  invoke InitCommonControls
  invoke DialogBoxParamA,[hInstance],IDD_DLG1,0,ADDR DlgProc,0
  invoke ExitProcess,0

;FRAME是GoASM的宏
DlgProc FRAME hwnd,uMsg,wParam,lParam
  mov eax,[uMsg]
  cmp eax,WM_INITDIALOG
  jne >.WMCOMMAND

    jmp >.EXIT

  .WMCOMMAND
  cmp eax,WM_COMMAND
  jne >.WMCLOSE

    jmp >.EXIT

  .WMCLOSE
  cmp eax,WM_CLOSE
  jne >.DEFPROC
    INVOKE EndDialog,[hwnd],0

  .DEFPROC
    mov eax,FALSE
    ret

  .EXIT

  mov eax, TRUE
  ret
ENDF


    編譯時(shí)有個(gè)很奇怪的問(wèn)題,就是要把資源文件編譯成.obj格式才能順利鏈接。命令行如下:
GoRC /machine x64 /o maindlg.rc
GoASM /x64 2.2.asm
GoLink “2.2.obj” maindlg.obj kernel32.dll user32.dll comctl32.dll
生成了2.2.exe后,運(yùn)行,如下圖所示:



    下面,看一下ml64的編譯過(guò)程。rc文件不變,把下面的代碼保存為2.3.asm。
;##################################################################
; DIALOGAPP
;##################################################################

extrn GetModuleHandleA : proc
extrn MessageBoxA : proc
extrn InitCommonControls : proc
extrn DialogBoxParamA : proc
extrn DestroyWindow : proc
extrn ExitProcess : proc
extrn EndDialog : proc

.const
 WM_INITDIALOG       equ        00110H
 WM_DESTROY          equ        00002H
 WM_COMMAND          equ        00111H
 WM_CLOSE            equ        00010H
 FALSE               equ 0
 TRUE        equ 1

IDD_DLG1  equ    1000


.data?
  hInstance  qword    ?

.code

Main proc
  ;invode是GoASM調(diào)用API的宏,用不著我們自己進(jìn)行stack frame了
  sub rsp,30h
  xor rcx,rcx
  call GetModuleHandleA
  mov [hInstance],rax
  call InitCommonControls

  mov rcx,[hInstance]
  mov rdx,IDD_DLG1
  xor r8,r8
  lea r9,DlgProc
  push 0
  call DialogBoxParamA
    
  xor rcx,rcx
  call ExitProcess
  add rsp,30h
  ret
Main endp

;DlgProc FRAME hwnd,uMsg,wParam,lParam
DlgProc:
  mov [rsp+8],rcx
  mov [rsp+10h],rdx
  mov [rsp+18h],r8
  mov [rsp+20h],r9
  push rbp
  mov rbp,rsp
  
  mov eax,edx
  cmp eax,WM_INITDIALOG
  jne WMCOMMAND

    jmp EXIT

  WMCOMMAND:
  cmp eax,WM_COMMAND
  jne WMCLOSE

    jmp EXIT

  WMCLOSE:
  cmp eax,WM_CLOSE
  jne DEFPROC
    
    sub rsp,18h
    xor rdx,rdx
    ;注意,這里第一個(gè)參數(shù)rcx未變。按理應(yīng)該是由rbp定位
    mov rcx,[rbp+10h]
    call EndDialog
    add rsp,18h

  DEFPROC:
    pop rbp
    mov eax,FALSE
    ret

  EXIT:
  pop rbp
  mov eax, TRUE
  ret
end


    編譯命令行為:
rc maindlg.rc
ml64 2.3.asm /link /subsystem:windows /entry:Main kernel32.lib user32.lib comctl32.lib maindlg.res
    如果你編譯正確了,應(yīng)該和2.2.exe的運(yùn)行結(jié)果一樣。
    和GoASM的宏比起來(lái),ml64的語(yǔ)法顯得更低級(jí),也更基礎(chǔ)。不過(guò)要注意的是,在2.3.asm中,很多語(yǔ)法我并沒(méi)有寫(xiě)得很規(guī)范,要想知道最規(guī)范的代碼,便是逆向高級(jí)語(yǔ)言或GoASM 生成的exe文件。

    OK,第二篇就到這里了。五一長(zhǎng)假將在今晚結(jié)束,明天上班嘍。 

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亲子伦对白| 国产99久久久国产精品免费看| 亚洲精品福利视频网站| 国产精品美女久久久久久| 国产欧美精品一区二区色综合朱莉 | 开心九九激情九九欧美日韩精美视频电影 | 国产精品亚洲一区二区三区在线 | 日本在线不卡视频| 秋霞成人午夜伦在线观看| 视频一区欧美精品| 美女视频黄频大全不卡视频在线播放 | 亚洲欧美激情一区二区| 亚洲欧美偷拍卡通变态| 一区二区三区四区视频精品免费| 一区二区三区在线影院| 亚洲国产一区二区三区| 首页国产欧美日韩丝袜| 蜜臀av一区二区| 国产乱子伦一区二区三区国色天香 | 成人理论电影网| 99re视频精品| 欧美日韩黄视频| 日韩欧美一卡二卡| 久久久亚洲综合| ...xxx性欧美| 婷婷成人综合网| 国产美女在线观看一区| 99视频一区二区三区| 欧美三级中文字幕| 日韩区在线观看| 国产欧美日产一区| 一区二区在线观看免费| 日本一区中文字幕| 国产成a人亚洲| 日本韩国一区二区| 日韩区在线观看| 国产精品国产三级国产aⅴ原创| 亚洲激情图片一区| 久久激情综合网| 91在线精品秘密一区二区| 欧美日韩精品系列| 国产片一区二区| 亚洲一区二区三区四区五区中文| 蜜臀av性久久久久av蜜臀妖精| 懂色av中文字幕一区二区三区 | 国产精品素人一区二区| 亚洲图片欧美一区| 国产精品18久久久久久久久久久久| 91在线观看下载| 日韩欧美一区中文| 国产精品久久久久久久午夜片| 日韩精品免费专区| 丁香亚洲综合激情啪啪综合| 欧美日韩国产精选| 欧美国产欧美综合| 日韩成人午夜电影| 91在线国产福利| 精品国产123| 亚洲第一激情av| 成人激情av网| 欧美大片在线观看一区二区| 亚洲免费观看高清完整版在线观看| 久久se精品一区精品二区| 在线亚洲免费视频| 国产欧美日韩麻豆91| 美女国产一区二区| 欧美午夜精品一区| 中文字幕在线观看不卡| 九色综合狠狠综合久久| 欧美日韩一区二区三区在线| 国产精品妹子av| 国产一区二区三区在线观看精品| 欧美视频在线观看一区| 国产精品久久久久影院色老大| 蜜臂av日日欢夜夜爽一区| 欧美无乱码久久久免费午夜一区| 国产亚洲精品免费| 精品一区二区三区在线播放视频| 欧美亚洲动漫另类| 亚洲精品一二三四区| 成人久久视频在线观看| 久久久欧美精品sm网站| 美女一区二区在线观看| 欧美精品久久久久久久多人混战 | 国产中文一区二区三区| 4438x亚洲最大成人网| 一区二区三国产精华液| 99视频精品免费视频| 国产亚洲欧美一区在线观看| 激情成人午夜视频| 精品欧美一区二区三区精品久久| 无码av中文一区二区三区桃花岛| 欧美性色aⅴ视频一区日韩精品| 中文字幕日韩一区| 成年人网站91| 国产精品福利av| jlzzjlzz亚洲女人18| 国产精品麻豆99久久久久久| 大白屁股一区二区视频| 国产蜜臀av在线一区二区三区| 国产剧情一区二区三区| 精品国产伦一区二区三区免费| 久久国产生活片100| 欧美一级爆毛片| 麻豆91精品视频| 精品国产乱码久久久久久久久| 免费高清视频精品| 欧美电影免费观看高清完整版在线 | 亚洲精品国产视频| 91日韩一区二区三区| 亚洲免费看黄网站| 欧美日韩一区二区在线观看视频 | 91在线精品一区二区| 亚洲欧美一区二区三区极速播放| 色一情一乱一乱一91av| 亚洲最新在线观看| 欧美疯狂性受xxxxx喷水图片| 日韩黄色免费电影| 精品国产一区二区三区av性色 | 欧美日韩国产综合草草| 五月天激情综合网| 日韩欧美你懂的| 丰满少妇久久久久久久| 国产精品卡一卡二| 91国产免费看| 日本在线不卡视频一二三区| 久久综合999| av电影一区二区| 亚洲va中文字幕| 欧美mv和日韩mv国产网站| 国产不卡免费视频| 一区二区三区在线观看视频| 欧美日韩国产免费一区二区| 久久av中文字幕片| 国产精品传媒入口麻豆| 欧美午夜精品一区二区蜜桃| 免费看精品久久片| 国产精品乱码一区二三区小蝌蚪| 欧美在线色视频| 精品制服美女久久| 亚洲日本一区二区| 欧美一区二区三区四区五区 | 欧美日韩中字一区| 精品一区二区在线观看| 中文字幕五月欧美| 日韩亚洲欧美综合| av亚洲精华国产精华精华| 丝袜美腿亚洲综合| 国产日韩欧美一区二区三区综合| 在线欧美小视频| 国内精品免费**视频| 亚洲资源中文字幕| 国产视频在线观看一区二区三区| 在线观看免费成人| 国内久久婷婷综合| 亚洲成人1区2区| 国产精品私人自拍| 欧美大尺度电影在线| 91免费观看视频| 国产一区二区三区观看| 午夜精品免费在线观看| 中文字幕欧美区| 欧美一区二区成人| 在线免费观看一区| 床上的激情91.| 另类中文字幕网| 亚洲韩国精品一区| 国产一区二区电影| 亚洲国产欧美在线人成| 日本一区二区视频在线| 欧美精品色一区二区三区| 99riav一区二区三区| 极品美女销魂一区二区三区| 亚洲成人一二三| 亚洲欧洲成人精品av97| 久久久久国产精品麻豆ai换脸 | 精品va天堂亚洲国产| 欧美性videosxxxxx| 高清不卡在线观看av| 久久精品99国产国产精| 五月天久久比比资源色| 亚洲一区精品在线| 亚洲人亚洲人成电影网站色| 久久精品视频免费| 精品国精品国产| 欧美一区二区在线观看| 欧美日韩国产成人在线免费| 91浏览器打开| k8久久久一区二区三区| 国产成人免费在线视频| 黑人巨大精品欧美一区| 蜜臀av亚洲一区中文字幕| 日韩国产成人精品| 亚洲国产中文字幕| 亚洲午夜精品网| 亚洲国产日产av| 亚洲成人高清在线| 亚洲一区二区三区四区的| 亚洲资源中文字幕| 亚洲成人1区2区|