²Ä¥|³¹¡@²Ä¤@­Ó Win64 µøµ¡µ{¦¡¡]¤G¡^

³o¤@³¹±N§Q¥Î MASM64 SDK ©Ò´£¨Ñªº¸ê·½¡A­«·s¼¶¼g FIRST_WND1.ASM¡C§A·|µo²{¡A­«¼g«áÅܱo§ó¨ã¥iŪ©Ê¡A¤]§ó²³æ¤F¡C¦b»¡©ú¦p¦ó§ï¨} FIRST_WND1.ASM ¤§«e¡A¥ý¤¶²Ð INCLUDE °²«ü¥O¡A²¦³º§ï¨}«áªº²Ä¤@¦æ¡A´N¬O INCLUDE °²«ü¥O¡C

INCLUDE °²«ü¥O

INCLUDE °²«ü¥O¯à±N¥]§tÀɯǤJ­ì©lµ{¦¡¤º¡C¥]§tÀɪº¤º®e¨ä¹ê´N¬O²Õ¦X»y¨¥­ì©l½X¡A¨Ã¥B¯à°÷³q¹L²Õ;¹²ÕĶªº¡C·í­ì©lµ{¦¡¥Î INCLUDE §â¥]§tÀɯǤJ®É¡A´N¬Û·í©ó§â¥]§tÀɪº¥þ³¡¤º®e¶K¦b INCLUDE ©Ò¦b¤§³B¡CINCLUDE ªº»yªk¦p¤U¡G

INCLUDE ¥]§tÀɦWºÙ
¥]§tÀɦWºÙ¦³¤TºØ±¡§Î¡A·|¼vÅT¨ì­þ­Ó¤l¥Ø¿ý¥h´M§ä¥]§tÀÉ¡G
①¡B¦pªG¥]§tÀɦWºÙ¬O¬O±qºÏºÐ¾÷¶}©l¡AµM«á¬O¸ô®|¡K¡K¤@ª½¨ì¥]§tÀɪº¥DÀɦW»P°ÆÀɦWªº§¹¾ãÀɦW¡A¨º»ò²Õ;¹´N¥u·|·j´M«ü©wªº¸ô®|¡A¶}±Ò¥]§tÀÉ¡A¦pªGµLªk§ä¨ì¡A´N·|²£¥Í¿ù»~¡C
②¡B¦pªG¶È¶È¥u¦³¥]§tÀɦWºÙ¡A¨S¦³¸ô®|¡C¨º»ò²Õ;¹·|¨Ì¤U­±¶¶§Ç·j´M¸ÓÀɮסG
  1. ¥ý¨ì¡u/I¡v¿ï¶µ©Ò«ü©wªº¥Ø¿ý¥h´M§ä¡C¡u/I¡v¿ï¶µ¬O¡uML64.EXE¡vªº¤@­Ó¿ï¶µ¡A¨Ò¦p¦b©R¥O´£¥Ü¦r¤¸¤U²ÕͮɡA¤U¹F¡uml64 /Ie:\masm64\include64 first_wnd2.asm¡v¡A²Õ;¹´N·|¨ì¡ue:\masm64\include64¡v¤l¥Ø¿ý¥h·j´M¥]§tÀÉ¡C
  2. ·í«e¥Ø¿ý¡C
  3. ¦pªG¨Ï¥ÎªÌ¦³¨Æ¥ý©w¸q¡uINCLUDE¡vÀô¹ÒÅܼơA¨º»ò´N·|¨ì¦¹¥Ø¿ý¤U¥h·j´M¡C³]©w INCLUDE Àô¹ÒÅܼơA¥²¶·¥Î©R¥O´£¥Ü¦r¤¸ªº¡uSET INCLUDE=¡v«ü¥O¡A¦P®É INCLUDE ¥i¥H³]©w¦b¦h­Ó¤l¥Ø¿ý¤¤·j´M¡A¤¤¶¡¥H¡u;¡v¹j¶}¡C
¦pªG¥H¤W¤TªÌ³£§ä¤£¨ìªº¸Ü¡A´N·|²£¥Í¿ù»~¡C
③¡B¦pªGÀɮצWºÙ¥]§t¬Û¹ï¸ô®|¡A¨º»ò²Õ;¹·|§â INCLUDE «áªº¸ô®|±µ¦b②©Ò´£¨ìªº¤TºØ¥Ø¿ý¤§«á¡A¤]´N¬O»¡ INCLUDE «áªº¸ô®|·í¦¨¬O³o¤T­Ó¥Ø¿ýªº¤l¥Ø¿ý¡C¨Ò¦p­ì©lµ{¦¡¤¤¬O¡uINCLUDE Win64\MATH.INC¡v¡A¦Ó²ÕĶ®É¿é¤J¡uml64 /IE:\HomePage\Source PARABOLA.ASM¡v¡A¨º»ò²Õ;¹·|¶}±Ò¡uE:\HomePage\Source\Win64\MATH.INC¡v¥]§tÀÉ¡C

¥]§tÀɬO¯Â¤å¦rÀÉ¡A°ÆÀɦW¨Ã¨S¦³µw©Ê³W©w¡A¤@¯ë¬O *.INC¡]«Ü©úÅã¡A¬O include ªºÁY¼g¡^©Î *.MAC¡]¨ã¦³³oºØ°ÆÀɦWªºÀɮפº®e¡A¤j¦h¬O¥¨¶°«ü¥O¡^¡A¦ý¬O¤]¥i¥H¬O¨ä¥L°ÆÀɦW¡C

¥i¯à¦³¤H·|°Ý¡A¬JµM¬O²Õ¦X»y¨¥­ì©l½X¡A¦ó¤£ª½±µ¼g¦b­ì©lµ{¦¡¤º¡A¤Ï¦Ó­n¦h¦¹¤@Á|©O¡H­ì¦]¬O¡A¦pªG»s§@¦¨¥]§tÀÉ¡A«Ü®e©ö¥i¥HÅý¨ä¥Lµ{¦¡¨Ï¥Î¡A¨Ã¥BÁÙ¯à¼W¥[¥iŪ©Ê¡C¨Ò¦p¦b win64.inc ¸Ì«Å§i¤F MB_OK¡BMB_OKCANCEL¡K¡Kµ¥±`¼Æ¡A¥u­n¥Î INCLUDE §â win64.inc ¯Ç¶i¨Ó¡A¥ô¦óµ{¦¡©I¥s MessageBoxA¡A²Ä¥|­Ó°Ñ¼Æ´N¥i¥H¨Ï¥Î MB_OK ³o¼Ë¤@¥ØÁAµMªº±`¼Æ¡A¤£¥Î¥h°O¼Æ­È¡C


§â FIRST_WND1 §ï¦¨ FIRST_WND2

³o¤@³¹­n§Q¥Î MASM64 SDK ©Ò´£¨Ñªº¥]§tÀÉ¡A­«·s¼¶¼g FIRST_WND1.ASM¡A­×§ï«áªº­ì©lµ{¦¡ºÙ¬° FIRST_WND2.ASM¡C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INCLUDE E:\masm64\include64\masm64rt.inc
;*********************************************************************
.CONST
szCaption       DB      "²Ä¤@­ÓWin64µ{¦¡",0
szText          DB      "³o¬O¥Î²Õ¦X»y¨¥¼gªº64¦ì¤¸µ{¦¡¡C",0
;*********************************************************************
.CODE
;---------------------------------------------------------------------
main    PROC
        invoke  MessageBox,0,ADDR szText,ADDR szCaption,MB_OK
        invoke  ExitProcess,0
main    ENDP
;*********************************************************************
END

»P FIRST_WND1.ASM ¤ñ¸û°_¨Ó¡A­ì©lµ{¦¡¤p¤F«Ü¦h¡A¤£¦Pªº¦a¤è¦³¤U­±´X³B¡G

  1. ³]©w°Ï¤À¤j¤p¼g¡B«Å§i¥~³¡°Æµ{¦¡¡B¤Þ¤J¶×¤Jµ{¦¡®w³£¥Î¥]§tÀÉ masm64rt.inc §¹¦¨¡C
  2. Win64 API °Ñ¼Æ·|¥Î¨ìªº±`¼Æ¡A¹³ MB_OK¡K¡Kµ¥¡A¤]³£¦b¥]§tÀɤ¤«Å§i¡C
  3. ¨Ï¥Î invoke ©I¥s Win64 API¡C

masm64rt.inc ¥]§tÀÉ

¦pªG§A¶}±Ò masm64rt.inc¡AÆ[¹î¨ä¤º®e¡A·|µo²{«e´X¦æ¬O¡G

    OPTION DOTNAME                          ; required for macro files
    option casemap:none                     ; case sensitive

    include \masm64\include64\win64.inc     ; main include file
    include \masm64\macros64\vasily.inc     ; main macro file
    include \masm64\macros64\macros64.inc   ; auxillary macro file
        ⁝
    includelib \masm64\lib64\kernel32.lib
    includelib \masm64\lib64\user32.lib
    includelib \masm64\lib64\gdi32.lib
        ⁝

²Ä¤G¦æ«Å§i¤F¡uoption casemap:none¡v¡F¦Ó«á­±´X¦æ¡A«h¬O¸ü¤J¤F¶×¤Jµ{¦¡®w¡C©Ò¥H¡A¦b FIRST_WND2.ASM ¤£»Ý­n³]©w°Ï¤À¤j¤p¼g¡B¤]¤£»Ý­n¸ü¤J¶×¤Jµ{¦¡®w¡A³£¥Ñ masm64rt.inc ¥N³Ò¤F¡C

¦b¤W­± masm64rt.inc ªº²Ä¥|¦æ¡A¸ü¤J¤F win64.inc¡C¦b win64.inc ªº¨ä¤¤¤@¦æ«Å§i¤F¡uMB_OK equ 0h¡v¡A©Ò¥H¡AFIRST_WND2.ASM ¤]¤£»Ý«Å§i MessageBoxA ¥Î¨ìªº MB_OK °Ñ¼Æ¡C¦b win64.inc ¸Ì­±¤£¶È¶È¬O«Å§i¤F MessageBoxA ªº°Ñ¼Æ¥i¥H¨Ï¥Îªº±`¼Æ¡A¤]«Å§i¤F¨ä¥L³\³\¦h¦h Win64 API ¥i¥Îªº±`¼Æ¡C

Á¿¤F³o»ò¦h¡A¬Ý¦üÂø¶ÃµL³¹¡A¨ä¹êµ²½×´N¥u¦³¤@¥y¸Ü¡A©¹«á¥Î MASM64 SDK ¼¶¼g²Õ¦X»y¨¥µ{¦¡¡A¥u¶·¦b²Ä¤@¦æ¥[¤W¡uINCLUDE E:\masm64\include64\masm64rt.inc¡v¡A´N¯à¦Û°Ê³]©w°Ï¤À¤j¤p¼g¡B«Å§i¥~³¡ Win64 API¡K¡Kµ¥Âø¨Æ¡A«D±`¤è«K¡C

invoke ¥¨¶°

±µ¤U¨Ó¬Ý¬Ý main ¥Dµ{¦¡¡A¥¦¥Î¨â­Ó invoke ´N§¹¦¨©I¥s MessageBox »P ExitProcess¡A¨º»ò invoke ¬O¤°»ò©O¡H

¦b»¡©ú invoke ¤§«e¡A¥ý¨Ó¤F¸Ñ¥¦ªº¾ú¥v¡C¦b·L³nµo°â MASM 6.x ªº®É­Ô¡A¥¿¬O 16 ¦ì¤¸ªº MS¡ÐDOS §@·~¨t²Î¥\¦¨¨­°h¡A32 ¦ì¤¸ªº Windows 95/98 ¹ñÅSÀY¨¤¤§»Ú¡C¨º®Éªº²Õ;¹ºÙ¬° ML.EXE¡A¯à¶}µo 16 ¦ì¤¸ªº MS¡ÐDOS µ{¦¡»P 32 ¦ì¤¸ªº Windows µ{¦¡¡C·L³n¤]¬O¦b¦¹®É¡A§â invoke¡B.if/.elseif/.else/.endif¡B.while/.endw¡K¡Kµ¥°ª¶¥°²«ü¥O¥[¤J¨ì ML.EXE ²Õ;¹¤§¤¤¡A¤§«eª©¥»¨Ã¤£¤ä´©¥¦­Ì¡CWin32 API ©I¥sºD¨ÒºÙ¬° STDCALL¡Ainvoke ¶È»Ý¤@¦æ´N¯à©I¥s Win32 API¡Ainvoke µo´§¤F«Ü¦nªº¥\¥Î¡C

¨ì¤F 64 ¦ì¤¸ªº Win64 ®É¥N¡A¶}µo 64 ¦ì¤¸µ{¦¡ªº²Õ;¹¬O ML64.EXE¡A¦ý¬O·L³n¤Ï¦Ó§â invoke µ¥°ª¶¥°²«ü¥O§R±¼¤F¡A©Ò¥H«e´X³¹¸Ì¤~·|¥Î«Ü³Â·Ðªº¤èªk©I¥s Win64 API¡CµM¦Ó¡A³\¦h«e½ú¥ý¶i¨Ã¤£±¡Ä@Åý³o¼Ë¦n¥Îªº«ü¥O®ø¥¢¡A©ó¬Oµo´§¦Û¨­¤~¯à¨ÃµL¨pªº©^Äm¡A§Q¥Î ML64.EXE ªº¥¨¶°¥H¤Î±ø¥ó²ÕĶ¡]¥¨¶°¡B±ø¥ó²Õͳ£«Ü½ÆÂø¡A¦b²Ä³¹¦A°µ¤¶²Ð¡^¨Ó¼ÒÀÀ invoke¡AMASM64 SDK ´N¬O¨ä¤¤¤§¤@¡C

MASM64 SDK ¸Ìªº macro64.inc ¦³¤@¤j¬qµ{¦¡½X©w¸q¤F invoke ¥¨¶°¡A¨Ï¥Î¥¦©I¥s¦Û»sªº°Æµ{¦¡©Î Win64 API ®É¡A·|¦Û°Ê½Õ¾ã¼v¤lªÅ¶¡¡A¨Ã¹ï»ô¸`¦ì§}¡A¤]·|¦Û°Ê±N«e¥|­Ó°Ñ¼Æ¦s¤J¹ïÀ³ªº¼È¦s¾¹¤¤¡A²Ä¤­­Ó¤Î¨ä¥H«áªº°Ñ¼Æ±À¤J°ïÅ|¤¤¡AµM«á°õ¦æ CALL «ü¥O¡A«D±`¤è«K¡Cinvoke ªº»yªk¦p¤U¡G

invoke  °Æµ{¦¡¦WºÙ,°Ñ¼Æ¦Cªí

¨Ï¥Î invoke ®É¡A¦³¤@¨Ç¨Æ±¡±oª`·N¡G

  1. invoke ¥²¶·¨Ï¥Î¤p¼g¡A¦]¬°¥¦¬O¨Ï¥ÎªÌ¦Û¦æ©w¸qªº¥¨¶°¡A¨Ã«D°²«ü¥O¡C
  2. ¦pªG°Ñ¼Æ¬O¬Y­ÓÅܼƩΦr¦êªº¦ì§}¡A¨º»ò¤£¥i¥H¥Î OFFSET¡A¥²¶·¨Ï¥Î ADDR¡C³o¬O¦]¬°³o¨ÇÅܼƥi¯à¬O¦b°ïÅ|¤ºªº°Ï°ìÅܼơA¨Ã«D¦b¸ê®Æ°Ï¬qªº¥þ°ìÅܼơA¤]´N¬O»¡³oºØ°Ï°ìÅܼƥu¦³¦b°õ¦æ®É¡A¤~¯à­pºâ¥X¦ì§}¡A¦b²ÕͶ¥¬qµLªk±oª¾¨ä¦ì§}¡C
  3. ¦pªG°Ñ¼Æ¬O ANSI ¦r¦êªº¦ì§}¡A¥i¥H¥Î¤@¹ï¡u"¡v±N¦r¦ê¬A¦í¡Aª½±µ¼g¦b°Ñ¼Æ¤W§Y¥i¡C
  4. ¦pªG°Ñ¼Æ¤Ó¦h¡A©Î¬°¤F¥iŪ©Ê¡A·Q­n´«¦æ¡A¥i¥H¦b­n´«¦æªº¦a¤è¨Ï¥Î¡u\¡v¡AML64.EXE ·|¦Û°Ê§â¤U¤@¦æ±µ¨ì«á­±¡C

¨Ò¦p¦b FIRST_WND2 ¤¤¡A©I¥s MessageBox ¤]¥i¥H¼g¦¨¡G

invoke	MessageBox,\
                   0,\
                   "³o¬O¥Î²Õ¦X»y¨¥¼gªº64¦ì¤¸µ{¦¡¡C",\
                   "²Ä¤@­ÓWin64µ{¦¡",\
                   MB_OK

¼g¦¨³oºØ¼Ë¤l®É¡A´N¯à§â¸ê®Æ°Ï¬q¤ºªº szCaption¡BszText ¨â¦r¦ê§R¥h¡C

¬°¦ó¤£¬O MessageBoxA ©Î MessageBoxW¡A¦Ó¬O MessageBox

²´¦yªºÅªªÌ©Î³\¤w¸gµo²{¡A¦b FIRST_WND2.ASM ¸Ì©I¥sªº Win64 API ¨Ã¤£¬O MessageBoxA ©Î MessageBoxW¡A¦Ó¬O MessageBox¡A«ç»ò¦nºÝºÝªº¤S«_¥X¨Ó¤@­Ó¦WºÙ«D±`Ãþ¦üªº©O¡H

¨Æ¹ê¤W¡AMSDN ©Î·L³nºô¯¸¹ï Win64 API ªº»¡©ú¡A¨Ã¤£¤À ANSI ª©©Î¼e¦r¤¸ª©¡A³£¬O§â¦r§Àªº¡uA¡v©Î¡uW¡v¥h±¼¡C¨Ò¦p¥Î MessageBox ¥h¥N´À MessageBoxA ©Î MessageBoxW¡C©¹«á¥Î²Õ¦X»y¨¥¼¶¼gÀ³¥Îµ{¦¡¡A¦pªG§â¥]§tÀɯǤJ¡A¤]¤£·|¥[¤W¡uA¡v©Î¡uW¡v¡A³o¬O¦]¬°©¹«á·|¦b­ì©lµ{¦¡¤¤²K¥[¥]§tÀÉ¡A¨ä¤º·|¦³¤@®MÂà´«¾÷¨î¡A¹³¤U­±ªº¼Ë¤l¡G

IFNDEF __UNICODE__
  MessageBox equ <MessageBoxA>
ENDIF
⁝
IFDEF __UNICODE__
  MessageBox equ <MessageBoxW>
ENDIF

³o¬qµ{¦¡¸Ìªº IFDEF/ENDIF »P IFNDEF/ENDIF ¬O¥¨¶°«ü¥O¤¤ªº±ø¥ó²ÕĶ¡A¥¦­Ìªº»yªk¦p¤U¡G

IFDEF ²Å¸¹
  µ{¦¡¤ù¬q
ENDIF

IFNDEF ²Å¸¹
  µ{¦¡¤ù¬q
ENDIF

IFDEF ¬O if defined ªº·N«ä¡A¤]´N¬O»¡¡A¦pªG²Å¸¹¤w©w¸q©Î¤w«Å§i¡A´N²Õͧ¨¦b IFDEF »P ENDIF ¤§¶¡ªºµ{¦¡¤ù¬q¡CIFNDEF ¬O if not defined¡A¤]´N¬O»¡¡A¦pªG²Å¸¹¥¼©w¸q©Î¥¼«Å§i¡A´N²Õͧ¨¦b IFNDEF »P ENDIF ¤§¶¡ªºµ{¦¡¤ù¬q¡C©Ò¥H¤W­±ªºÂà´«¾÷¨îªº·N«ä¡A¦pªG¨S¦³«Å§i __UNICODE__ ªº¸Ü¡A¨º»ò MessageBox ´Nµ¥©ó MessageBoxA¡F¦pªG¦³ªº¸Ü¡AMessageBox ´Nµ¥©ó MessageBoxW¡C«Å§i __UNICODE__ ªº¤èªk«Ü²³æ¡A¥u»Ý­n¤@¦æ¡G

__UNICODE__     EQU     1

¦b FIRST_WND2.ASM ¸Ì¡A¨S¦³«Å§i __UNICODE__¡A©Ò¥H·|§â MessageBox µø¬° MessageBoxA¡C


¥Î x64dbg ¸ü¤J FIRST_WND2.EXE

­è­è´£¹L invoke ¦³´X­Ó§@¥Î¡G·|¦Û°Ê½Õ¾ã¼v¤lªÅ¶¡¡A¨Ã¹ï»ô¸`¦ì§}¡A¯à¦Û°Ê±N«e¥|­Ó°Ñ¼Æ¦s¤J¹ïÀ³ªº¼È¦s¾¹¤¤¡A²Ä¤­­Ó¤Î¨ä¥H«áªº°Ñ¼Æ±À¤J°ïÅ|¤¤¡AµM«á°õ¦æ CALL «ü¥O¡C©³¤U¥Î x64dbg ¸ü¤J FIRST_WND2.EXE Æ[¹î¬Ý¬Ý¡G

¤W¹Ïµµ¦â®Ø¤ºªº´N¬O FIRST_WND2.EXE ªºµ{¦¡½X¡C²Ä¤@­Ó«ü¥O¬O EXTER¡A©³¤U¥ý»¡»¡³o­Ó«ü¥O¡C

x64 «ü¥O¡GENTER »P LEAVE

ENTER «ü¥O¯à²¤Æ«Ø¥ß°ïÅ|®Øªº¤u§@¡A³q±`¬O¶i¤J°Æµ{¦¡ªº²Ä¤@­Ó«ü¥O¡A¥¦·|§¹¦¨¥H¤U¤T¥ó¨Æ±¡¡G①§â RBP ±À¤J°ïÅ|¡F②§â RSP ¤§­È¦s¤J RBP ùØ¡F③«O¯d°Ï°ìÅܼƪºªÅ¶¡¡C¦³Ãö RBP ¼È¦s¾¹¡B°ïÅ|®Ø¡B°Ï°ìÅܼƪº»¡©úµy«á¤¶²Ð¡A«ØÄ³ÁA¸Ñ¥L­Ì¤§«á¡A¥i¥H¦^¨Ó½Æ²ß ENTER «ü¥O¡CENTER ªº»yªk¬O¡G

ENTER   ¥ß§Y­È1,¥ß§Y­È2

¥ß§Y­È1¥Nªí­n¦b°ïÅ|¤W«O¯d¦h¤Ö¦ì¤¸²Õµ¹°Ï°ìÅܼƨϥΡC¦pªG°Æµ{¦¡¨S¦³°Ï°ìÅܼơA¬G¥i¥Î¡uENTER 0,0¡v¡A³o¼Ë´Nµ¥®Ä©ó¡G

        push    rbp
        mov     rbp,rsp

¦pªG°Æµ{¦¡¦³¨â­Ó¸ê®ÆÃþ«¬¬O QWORD ªº°Ï°ìÅܼơA¦û¥Î¤Q¤»­Ó¦ì¤¸²Õ¡A¥i¥Î¡uENTER 16,0¡v¡Aµ¥®Ä©ó¤U­±ªº«ü¥O¡G

        push    rbp
        mov     rbp,rsp
        sub     rsp,16

¥ß§Y­È2¥u¯à¬O 0¡ã31 ¤§¶¡ªº¾ã¼Æ¡A¥i¥H¬O 0 ©Î 31¡A¥¦¥Î¨Ó¤ä´©±_ª¬°Æµ{¦¡¡C©Ò¿×±_ª¬°Æµ{¦¡¡]nested procedures¡^´N¬O«ü¤@­Ó°Æµ{¦¡¥Ò¤º¥]§t¥t¤@­Ó°Æµ{¦¡¤A¡A¦Ó¤A¯à°÷¨Ï¥Î¥Òªº°Ï°ìÅܼơC³o¸Ìªº¥]§t°Æµ{¦¡¤A¡A¨Ã¤£¬O©I¥s°Æµ{¦¡¤A¡A¦Ó¬O­ì©lµ{¦¡¤¤°Æµ{¦¡¥Ò¸Ì­±¤S¦³°Æµ{¦¡¤Aªº·N«ä¡A¦p¤U­±µ{¦¡¡G

°Æµ{¦¡¥Ò¡@¡@PROC
            ⁝
¡@°Æµ{¦¡¤A  PROC
            ⁝
¡@°Æµ{¦¡¤A  ENDP
            ⁝
°Æµ{¦¡¥Ò¡@¡@ENDP

¦b³oºØ±¡§Î¤U¡A°Æµ{¦¡¥Ò¨Ï¥Î¡uENTER xx,0¡v¡A°Æµ{¦¡¤A¨Ï¥Î¡uENTER yy,1¡v¡C³oºØ±_ª¬°Æµ{¦¡¦]¬°¯àŪ¨ú¤W¤@¼h°Æµ{¦¡ªº°Ï°ìÅܼơA·|Åܱo«Ü½ÆÂø¡A¦]¦¹¹³ C »y¨¥´N¸T¥Î³oºØ°Æµ{¦¡¡Aªì¾ÇªÌ»P¦Ñ¤â³£³Ì¦n¤Ö¥Î¡C

LEAVE «ü¥O¨S¦³¹Bºâ¤¸¡A¥¦¬O¥Î¨Ó§R¥h°ïÅ|®Øªº¡A»yªk¬O¡G

LEAVE

LEAVE ªº¹Lµ{«ê¦n»P ENTER ¬Û¤Ï¡G①§â RBP ¤§­È¦s¤J RSP ùØ¡F②¦Û°ïÅ|¼u¥X¤@¼Æ­È¨ì RBP¡CLEAVE ¨Ã¨S¦³¹³ ENTER ¨º¼Ë¦³¡uADD RSP,XX¡vªº¹Lµ{¡A¨Æ¹ê¤W¤]¤£¶·³o­Ó¥\¯à¡A¦]¬° LEAVE ·|§â­ì¨Ó¦s©ó RBP ¤¤ªº°ïÅ|³»¨ú¦^¡A³o¼Ë´N§¹¦¨§R°£°Ï°ìÅܼƪº¥\¯à¤F¡CÁ`¤§¡ALEAVE «ü¥O¬Û·í©ó©³¤U¨â­Ó«ü¥Oªº²Õ¦X¡G

        mov     rsp,rbp
        pop     rbp

LEAVE ³q±`·|»P ENTER ·f°t¡A¦b°Æµ{¦¡µ²§ô©I¥s RET «ü¥O¤§«e°õ¦æ¡C¹³©³¤Uªº¼Ë¤l¡G

MyFunc  PROC
        push  rbp           ;«O¦sªº RBP
        mov   rbp,rsp       ;«Ø¥ß°ïÅ|®Ø
        sub   rsp,20h       ;¤À°t°Ï°ìÅܼƪŶ¡
        ⁝
        leave               ;²M²z°ïÅ|®Ø ¡Ý mov rsp,rbp + pop rbp
        ret                 ;ªð¦^¥Dµ{¦¡
MyFunc  ENDP

¦³Ãö ENTER/LEAVE «ü¥O¡A¤]½Ð°Ñ¦Ò²Ä³¹ªº»¡©ú¡C

ADDR °²«ü¥O

¥H invoke ©I¥s°Æµ{¦¡®É¡A¦pªG¨ä°Ñ¼Æ¬O¬Y­ÓÅܼƩΦr¦ê¦WºÙªº¦ì§}¡A¨º»ò¥²¶·¦b¸ÓÅܼƩΦr¦ê¦WºÙ¤§«e¥[¤W ADDR¡CADDR ¬O±Mªù¥Î©ó invoke ªº°Ñ¼Æ¦Cªí¤¤¡A¨D¥XÅܼƩΦr¦ê¦WºÙªº¦ì§}¡C

¤ñ¸û­ì©lµ{¦¡»P¥Î x64dbg ¸ü¤J¥i°õ¦æÀɫ᪺µ{¦¡½X¡A§A·|µo²{¡G

invoke  MessageBox,0,ADDR szText,ADDR szCaption,MB_OK

³QÂà´«¬°

mov   rcx,0
lea   rdx,qword ptr ds:[13F7F2030]
lea   r8,qword ptr ds:[13F7F2020]
mov   r9,0
call  qword ptr ds:[<MessageBoxA>]

±q³o¨à´N¯àµo²{¡A¨Æ¹ê¤W ADDR ¬O§â¨ä«á©Ò±µªºÅܼƩΦr¦ê¦WºÙ¡A¥Î LEA «ü¥O¨Ó¨D±o¨ä¦ì§}¡C¤]¦]¬°¬O³o¼Ë¡A©Ò¥H¯à±o¨ì¦b°õ¦æ¶¥¬qÅܼƩΦr¦êªº¦ì§}¡C

¸ÑªR MASM64 SDK ²Õ͵²ªG

¤ñ¸û FIRST_WND1.EXE »P FIRST_WND2.EXE ªºµ{¦¡½X¤£¤@¼Ëªº¦a¤è¡A¥i¥H¤j­P¬Ý¥X¨Ó masm64rt.inc °µ¤F­þ¨Ç¨Æ¡G

FIRST_WND1FIRST_WND2
sub  rsp,28
xor  rcx,rcx
mov  rdx,first_wnd1.7FF72C822030
lea  r8,qword ptr ds:[7FF72C822020]
mov  r9,0
call qword ptr ds:[<MessageBoxA>]
sub  rcx,rcx
call qword ptr ds:[<ExitProcess>]
enter 80,0
sub   rsp,60
mov   rcx,0
lea   rdx,qword ptr ds:[13F7F2030]
lea   r8,qword ptr ds:[13F7F2020]
mov   r9,0
call  qword ptr ds:[<MessageBoxA>]
mov   rcx,0
call  qword ptr ds:[<ExitProcess>]

¤Wªí¤¤µµ¬õ¦âªº³¡¤À´N¬O¨âªÌªº®t²§¡A¥ªÄ椤¬O§Ú­Ì¦Û¤v¥Î¤H¤u½Õ¾ãªº¤è¦¡¡A¨Ï¦b©I¥s MessageBoxA «e¡A¹ê²{ªÅ¤U«e¥|­Ó°Ñ¼Æªº¼v¤lªÅ¶¡¥H¤Î RSP ¹ï»ô¸`¦ì§}¡A³o¨Ç³£¦b«e¤@³¹¤w¦³¸ÔºÉªº»¡©ú¡C

¥kÄæµµ¬õ¦âªº³¡¤À¡A¬O¥]§tÀÉ masm64rt.inc ©Ò°µªº½Õ¾ã¡C³o¨â¦æ«ü¥O¡A¬Û·í©ó©³¤Uªº¥|¹D«ü¥O¡G

        push    rbp
        mov     rbp,rsp
        sub     rsp,80h
        sub     rsp,60h

¦P¼Ë¤]¯à¹F¦¨³o¨â¶µ¥Øªº¡A¦ý«o¦³¨â­Ó¤£¦Pªº¦a¤è¡G

  1. «O¦s RBP¡A³o¬O¬°¤F¦s¨ú°Ï°ìÅܼơAµy«á¤¶²Ð¡C
  2. °£¤F«O¯d«e¥|­Ó°Ñ¼Æªº¼v¤lªÅ¶¡¥~¡AÁÙ¦b°ïÅ|¤W«O¯d§ó¦hªºªÅ¶¡¡A³oÀ³¸Ó¬O¬°¤F©I¥s¨ã¦³§ó¦h°Ñ¼Æªº°Æµ{¦¡©Î Win64 API ©Ò°µªº¡C

µ²½×

¤p¤ì°¸±q²Ä¤@³¹¤¶²Ð²Õ¦X»y¨¥°ò¥»µ²ºc¶}©l¡A¨ì²Ä¤G³¹¤¶²Ð°O¾ÐÅé¡B¦ì§}¡B°ïÅ|µ¥°ò¦·§©À¡A²Ä¤T³¹ªº°Æµ{¦¡»P Win64 API¡A³Ì«á¬O¥»³¹§Q¥Î MASM64 SDK ¤j´T²¤Æ¥Î²Õ¦X»y¨¥¼¶¼g Win64 À³¥Îµ{¦¡ªº¹Lµ{¡C©¹«á¤p¤ì°¸©ÒÁ|ªº¨Ò¤l¡A³£·|¥Î MASM64 SDK ¨Ó¼¶¼g Win64 À³¥Îµ{¦¡¡C

¥Î³o®M¤u¨ã¼¶¼g Win64 À³¥Îµ{¦¡¡A¨ä¹ê«Ü²³æ¡A¨BÆJ¦p¤U¡G

  1. ¦b²Ä¤@¦æ¨Ï¥Î INCLUDE §â masm64rt.inc ¯Ç¤J¶i¨Ó¡C
  2. ¨Ï¥Î invoke ©I¥s°Æµ{¦¡©Î Win64 API¡A¥i¥H§¹¥þ¤£¥²²z·| x64 ©I¥sºD¨Ò¡AMASM64 SDK ·|¦Û°Ê³B²z¦n³o¨Ç²Ó¸`¡AÁöµM®ö¶O¤F¤@¨Ç°ïÅ|ªÅ¶¡¡C
  3. ¦b invoke ¤§«áªº°Ñ¼Æ¤¤¡A¦pªG­n¨ú±o¬Y­ÓÅܼƩΦr¦ê¦ì§}¡A¥²¶·¨Ï¥Î ADDR¡C
  4. °£¤F invoke ¤§¥~¡AÁÙ¦³¤@¨Ç¥¨¶°¤]«D±`¦n¥Î¡A¨Ò¦p .if/.elseif/.else/.endif µ¥µ¥¡A±N¦b©¹«á¤¶²Ð¡C