¦b Windows §@·~¨t²Îªº¥i°õ¦æµ{¦¡¤À¦¨¨âÃþ¡G①¥D±±»Oµ{¦¡¡]¤]¥s±±¨î»Oµ{¦¡¡Aconsole programs¡^»P②µøµ¡µ{¦¡¡]windows programs¡^¡C°Ï¤À¤è¦¡«D±`²³æ¡A«eªÌ°õ¦æ®É¤£²£¥Íµøµ¡¡A¥u¦b¡u©R¥O´£¥Ü¦r¤¸¡v¤¤°õ¦æ¡AÄÝ©ó©R¥O¦C¤¶±¡]command-line interface¡ACLI¡^¡F«áªÌ·|²£¥Íµøµ¡¡AÄÝ©ó¹Ï§Î¨Ï¥ÎªÌ¤¶±¡]Graphical User Interface¡A²ºÙ GUI¡^¡A¸û¨ã¿Ë©M¤O¥B©ö©ó¨Ï¥Î¡A¦]¦¹¤j³¡¤À Windows §@·~¨t²Îªºµ{¦¡³£ÄÝ©ó«áªÌ¡A©¹«áªº¤º®e¤]·|¥H³oÃþµ{¦¡¬°¥D¡A¦ý³o¤@³¹¥ý½Í½Í±±¨î»Oµ{¦¡¡C
±±¨î»Oµ{¦¡ÁöµM¨S¦³º}«Gªº¹Ï§Î¬É±¡A¦ý¬O¤p¦Ó§Ö³t¬O¨äÀuÂI¡A©Ò¥H¤´µM¦³³\¦h¤HÁÙ¦b¨Ï¥ÎµÛ³o¨Çµ{¦¡¡A¹³¬O ping¡Bipconfig¡Bftp µ¥µ{¦¡³£¬O±`±`³Q¨Ï¥Îªº¡C³o¨Çµ{¦¡ªº®æ¦¡»P¤@¯ë¯à²£¥Íµøµ¡ªºµ{¦¡¬Û¦P¡A¤]¯à°õ¦æ¦h°õ¦æºü¡A¤]¥i¥H©I¥s¦U¦¡¦U¼Ëªº Windows API¡A³o¨Çµ{¦¡¤]ºÙ¬°¡u¥D±±»Oµ{¦¡¡v¡CŪªÌ¶·ª¾¡A¥¦Ì©M¥H«eªº DOS µ{¦¡ªº®æ¦¡¬O¤£¦Pªº¡C
¥D±±»Oµ{¦¡¤£»Ýn«Ø¥ßµøµ¡¡A¤]¤£»Ýn°T®§°j°é¡A¦]¦¹µ²ºc²³æ¡A¥ý¤¶²Ð³oºØµ{¦¡¡C
¹q¸£³Ì«nªº¤u§@«K¬O¿é¤J¸ê®Æ¡÷³B²z¸ê®Æ¡÷¿é¥X¸ê®Æ¡C¦b¹q¸£¤W¡A³Ì«nªº¿é¥X¸Ë¸m´N¬O¿Ã¹õ¡AºÙ¬°¼Ð·Ç¿é¥X¸Ë¸m¡]standard output device¡^¡F³Ì«nªº¿é¤J¸Ë¸m¬OÁä½L¡AºÙ¬°¼Ð·Ç¿é¤J¸Ë¸m¡]standard input device¡^¡CÁöµM¹q¸£¿Ã¹õ¥u¯à¿é¥X¸ê®Æ¡A¦ÓµLªk¿é¤J¸ê®Æ¡F¦ÓÁä½L¥u¯à¿é¤J¸ê®Æ¡AµLªk¿é¥X¸ê®Æ¡C¦ý¬O¦³³\¦h§@·~¨t²Î¡A§â¿Ã¹õ»PÁä½L·í°µÀɮרӹï«Ý¡A¥]§t Windows §@·~¨t²Î»P DOS §@·~¨t²Î¡]¨£¡uDOS ²Õ¦X»y¨¥²Ä¤G¤Q³¹¡v¡^³£¦p¦¹¡C
³o¤j·§¬O¦]¬°¿é¥X¡B¿é¤Jªº·Qªk»P§â¸ê®Æ¿é¥X¦ÜÀɮס]§Y¼g¶iÀɮס^¡B¥ÑÀɮ׿é¤J¸ê®Æ¡]§YŪ¨ú¸ê®Æ¡^Ãþ¦ü¡CÁöµM¤j³¡¤ÀÀɮ׳£¯à¼g¶i»PŪ¨ú¡A¦ýÁÙ¬O¦³¨ÇÀɮ׬O¥u¯à¼g¤J¤£¯àŪ¨ú¡A³oÃþÀÉ®×´N¹³¼Ð·Ç¿é¥X¸Ë¸m¡]§Y¿Ã¹õ¡^¤@¼Ë¡C¥t¥~¦³¨ÇÀɮ׬O¥u¯àŪ¨ú¤£¯à¼g¤J¡A³oÃþÀÉ®×´N¹³¼Ð·Ç¿é¤J¸Ë¸m¡]§YÁä½L¡^¤@¼Ë¡C¦]¬°Àɮצ³³o¼Ëªº¯S©Ê¡A©Ò¥H°²¦p§â¿Ã¹õ¡BÁä½L¤]·í¦¨Àɮ׳B²z¡A¹ï§@·~¨t²Î¦Ó¨¥¡A¦³¨ä¤è«K©Ê¡C
DOS ©Î Windows ³B²zÀɮתº¤è¦¡¡A¤£½×¬OŪ¨úÀɮשμg¤JÀɮסA³£n¥ý±o¨ì¡uÀÉ®×±±¨î¥N½X¡v¡AµM«á¦A¥[¥H³B²z¡C¦P²z¡An¦b¡u©R¥O´£¥Ü¦r¤¸¡v¤¤¿é¥X¸ê®Æ¦Ü¿Ã¹õ¡A©Î¦ÛÁä½L¿é¤J¸ê®Æ¡A¤]±o¥ý¨ú±o¼Ð·Ç¿é¥X¡þ¿é¤J¸Ë¸m±±¨î¥N½X¡C§ÚÌ¥i¥H§â³o¨âÓ¥N½X¬Ý¦¨¬OÀÉ®×±±¨î¥N½X¡A¥H«á¿é¥X¤å¦r®É¡A´N¥Î³oÓ¥N½X§@¬°¿é¥X¹ï¶H¡Aµø¬°¹ïÀÉ®×¼g¤J¡A¥u¬O³o¸ÌªºÀɮ׬O¼Ð·Ç¿é¥X¸Ë¸m¡A¥ç§Y¿Ã¹õ¡]³oºØ·Qªk»Pµøµ¡±±¨î¥N½X¤@¼Ë¡^¡C¥ÑÁä½L¿é¤J¸ê®Æ¡A¤]¬O¤@¼Ëªº·Qªk¡C³o¨Ç°Ê§@³£¦³¬ÛÀ³ªº Windows API ¥i¨Ñ©I¥s¡C
¨ú±o¼Ð·Ç¸Ë¸m¥N½X¡A¥i¥H©I¥s GetStdHandle¡A¨ä»yªk¬°
HANDLE WINAPI GetStdHandle( _In_ DWORD nStdHandle );
GetStdHandle ¥u¦³¤@ӰѼơAnStdHandle¡A¥¦¥i¥H¬O¤U±¤TÓ±`¼Æªº¨ä¤¤¤§¤@¡A³o¤TÓ±`¼Æ¦b¥]§tÀɤ¤«Å§i¡G
| nStdHandle | ¼ÆÈ | ·N¸q |
| STD_INPUT_HANDLE | -10 | ¨ú±o¼Ð·Ç¿é¤J¸Ë¸m±±¨î¥N½X |
| STD_OUTPUT_HANDLE | -11 | ¨ú±o¼Ð·Ç¿é¥X¸Ë¸m±±¨î¥N½X |
| STD_ERROR_HANDLE | -12 | ¨ú±o¼Ð·Ç¿ù»~¸Ë¸m±±¨î¥N½X |
Y°õ¦æ¦¨¥\¡A¦^¶ÇȬO¼Ð·Ç¸Ë¸m±±¨î¥N½X¡F¦pªG¥¢±Ñ¡A¦^¶ÇȬ° INVALID_HANDLE_VALUE¡]¬°¤@±`¼Æ¡Aµ¥©ó¡Ð1¡^¡AYn¨ú±o§ó¸Ô²Óªº¿ù»~¸ê®Æ¡A©I¥s GetLastError API¡C·íµ{¦¡§Y±Nµ²§ô¡A¤£»Ýn©I¥s CloseHandle Ãö³¬¼Ð·Ç¿é¥X¡þ¿é¤J¸Ë¸m±±¨î¥N½X¡A¦]¬°¥¦Ì¬O§@·~¨t²Î«Ø¥ßªº¡A¤]¥Ñ§@·~¨t²ÎºÞ²z¡A¦ÓÀ³¥Îµ{¦¡¥u¬O¼È®ÉɥΦӤw¡C¤U±ªº¨Ò¤l¬O¨ú±o¼Ð·Ç¿é¥X¸Ë¸m±±¨î¥N½X¡G
invoke GetStdHandle,STD_OUTPUT_HANDLE
¦pªG¦¨¥\¡ARAX¡×¼Ð·Ç¿é¥X¸Ë¸m±±¨î¥N½X¡F¦pªG¥¢±Ñ¡ARAX¡×INVALID_HANDLE_VALUE¡C
¦pªGÀ³¥Îµ{¦¡¦³©I¥s GetStdHandle¡A¨º»ò¦b°õ¦æ LINK.EXE «Ø¥ßµ{¦¡®É¡A¥²¶·«ü©w¡u/SUBSYSTEM:CONSOLE¡v¡A³o¼Ë§@·~¨t²Î¤~·|°t¸m¥D±±»Oµ¹À³¥Îµ{¦¡¡A¨Ã³]¦n³o¨Ç±±¨î¥N½X¡C¦pªG«ü©w¡u/SUBSYSTEM:WINDOWS¡v¡A¥NªíÀ³¥Îµ{¦¡¤£»Ýn¥D±±»O¡A¤]¤£·|¦³±±¨î¥N½X¡A³o¼Ëªº¸Ü§Y¨Ï©I¥s GetStdHandle ¤]µLªk±o¨ì±±¨î¥N½X¡C
±q¥Ø«eªº´å¼Ð¦ì¸m¶}©l¡A±N¦r¤¸¦r¦ê¼g¤J¥D±±»O¿Ã¹õ½w½Ä°Ï¡C
BOOL WINAPI WriteConsole( _In_ HANDLE hConsoleOutput, _In_ VOID *lpBuffer, _In_ DWORD nNumberOfCharsToWrite, _Out_opt_ LPDWORD lpNumberOfCharsWritten, _Reserved_ LPVOID lpReserved );
©³¤U¬O³o¤Ó°Ñ¼Æªº»¡©ú¡G
¦^¶ÇȪº¸ê®ÆÃþ«¬¬O¥¬ªLÈ¡]ì¤å¬O Boolean¡^¡A¥H BOOL ªí¥Ü¡Aªø«×¬O 32 ¦ì¤¸¡A§Y¨Ï¬O Win64 Àô¹Ò¤]¬O 32 ¦ì¤¸¡C¥¬ªLÈ¥u¦³¨âºØÈ¡A¹s¥Nªí°²¡A¤@¥Nªí¯u¡]¹ê°È¤W¥un¤£¬O¹sªº¼Æ¡A³£¥i¥H¥Nªí¯u¡^¡C¦pªG WriteConsole °õ¦æ¦¨¥\¡A«h¦^¶ÇȬ°«D¹s¡F¦pªG¨ç¦¡°õ¦æ¥¢±Ñ¡A«h¦^¶ÇȬ°¹s¡CYn¨ú±o§ó¸Ô²Óªº¿ù»~¸ê°T¡A½Ð©I¥s GetLastError¡C
ReadConsole ±q¥D±±»O¤¤¿é¤J¦r¦ê¡C¨ä쫬¬°¡G
BOOL WINAPI ReadConsole( _In_ HANDLE hConsoleInput, _Out_ LPVOID lpBuffer, _In_ DWORD nNumberOfCharsToRead, _Out_ LPDWORD lpNumberOfCharsRead, _In_opt_ LPVOID pInputControl );
©³¤U¬O³o¤Ó°Ñ¼Æªº»¡©ú¡G
Âk¦ì¡]carriage return¡^¦r¤¸¤Î´«¦æ¡]line feed¡^¦r¤¸ªº ANSI ½s½X¤À§O¬O 0Dh¡B0Ah¡C¦b¡u©R¥O´£¥Ü¦r¤¸¡v¤¤¡A¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº Enter Áä¡AWindows ¥D±±»O±N¨äÂà´«¦¨ 0Dh¡B0Ah¡F©Î¬O¦b DOS¡þWindows ¯Â¤å¦rÀɤ¤¡A¤@¦æªºµ²§À¤]¥H 0Dh¡B0Ah ªí¥Ü¡C©Ò¥H³o¨âÓ¦r¤¸¨Ì§Çµ²¦X¦b¤@°_¥Nªí´«¦æ¡A¦XºÙ¬°´«¦æ²Å¸¹¡C
¦pªG¨Ï¥ÎªÌ¿é¤Jªº¦ì¤¸²Õ¼Æ¡]¥]§t 0Dh¡B0Ah¡^¤ñ nMumberOfCharsToRead ¦h¡A¨º»ò¶W¹Lªº³¡¤À¡A¤´µM·|Åã¥Ü¦b¿Ã¹õ¤W¡A¦ý¬O«o¤£·|¦s©ñ¦b½w½Ä°ÏùØ¡C¨Ò¦p©³¤Uªºµ{¦¡¡G
buffer DB 8 DUP (0)
nRead DD ?
⁝
invoke ReadConsole,hInput,ADDR buffer,SIZEOF buffer,ADDR nRead,0
¨Ï¥ÎªÌ¿é¤Jªº¦r¦ê»P ReadConsole °õ¦æ«áªºµ²ªG¡A¾ã²z¦¨¤Uªí¡G
| ¿é¤J¦r¦ê | ¨Ï¥ÎªÌ¿é¤J ªº¦r¦êªø«× | buffer ¤º®e | nRead | |
| ASCII | ¤G¶i¦ì¤º®e | |||
| ®]Ä× | 4 | "®]Ä×",0D,0A | AE 5D 44 D7 0D 0A | 6 |
| ©P¤l·ì | 6 | "©P¤l·ì",0D,0A | A9 50 A4 6C B7 EC 0D 0A | 8 |
| Eleanor | 7 | "Eleanor",0D | 45 6C 65 61 6E 6F 72 0D | 8 |
| ªüÄõ¡D¹F¥Ë¨ôº¿ | 14 | "ªüÄõ¡D¹F" | AA FC C4 F5 A1 44 B9 46 | 8 |
¥Ñ¤Wªí¾ã²z¥i±o¡A¥un¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æªø«×¤£¶W¹L nMumberOfCharsToRead¡A¨º»ò¿é¤J¸ê®Æªº³Ì«á¤@Ó¦r¤¸¬O 0Ah¡C¦¹¥~¡A¬°¤F«OÃÒ¤£¿òº|¨Ï¥ÎªÌ¿é¤Jªº¦r¤¸¡AlpBuffer ©Ò«ü¦ì§}¤W¹w³Æ¦s©ñ¨Ï¥ÎªÌ¿é¤J¸ê®Æªº½w½Ä°Ï¤j¤p¡A»P nNumberOfCharsToRead À³¤ñ³Ì¦h¥i¯à¿é¤Jªº¦ì¤¸²ÕӼƦA¼W¥[ 2 ¡]ANSI ª©¡^©Î¦A¦h¨âÓ¦r¤¸¡]¼e¦r¤¸ª©¡^¡A¥H®e¯Ç 0Dh¡B0Ah ¨âÓ¦r¤¸¡C
wsprintf ¬O¼Ò¥é C »y¨¥ªº printf ¨ç¦¡¡A¯à§âÅܼƩM¦r¦ê¨Ì¾Ú®æ¦¡±±¨î¦r¦ê¤¤«ü©wªº®æ¦¡¡A¼g¶i°O¾ÐÅ餺¡Cwsprintf ¥Îªk¬O¡G
int WINAPIV wsprintf(
[out] LPSTR lpOut,
[in] LPCSTR lpFormat,
⁝
);
lpOut »P lpFormat ³£¬O¦r¦êªº¦ì§}¡A«eªÌ¬O¿é¥Xªº½w½Ä°Ï¦r¦ê¦ì§}¡A«áªÌ¬O®æ¦¡±±¨î¦r¦êªº¦ì§}¡C²Ä¤TӰѼƤΨ䤧«áªº°Ñ¼Æ¡A¥i¥H¬OÅܼơB¼È¦s¾¹©Î¦r¦ê¦ì§}¡A¨äÁ`¼Æ¸ò®æ¦¡±±¨î¦r¦ê¤¤¡u%¡vªºÓ¼Æ¬Û¦P¡C
®æ¦¡±±¨î¦r¦ê¶·¥H¹sµ²§À¡A¤º§t®æ¦¡³W½d¡]format specifications¡^¤Î¨ä¥L¤å¦r¡Awsprintf ·|¨Ì®æ¦¡³W½dªº¶¶§Ç°t¦XÅܼơB¼È¦s¾¹©Î¦r¦ê¦ì§}¡A¤@¤@±N¨äÂà´«¬°¼ÆÈ©Î¤å¦r¦Ó¼g¤J½w½Ä°Ï¦r¦ê¡C®æ¦¡³W½d³£¥H¦Ê¤À¤ñ²Å¸¹¡]%¡^¶}©l¡A¨ä¼Ë¤l¦p¤U¡A¨ä¤¤¥H¤@¹ï¤¤¬A¸¹¬A¦íªº¥i¥H¬Ù²¤¡G
%[-][#][0][width][.precision]type
¦pªG wsprintf °õ¦æ¦¨¥\¡A¦^¶ÇȬO¦³¦h¤ÖÓ¦r¤¸¡]¼e¦r¤¸ª©¡^©Î¦h¤ÖӦ줸²Õ¡]ANSI ª©¡^¦s¤J½w½Ä°Ï¡]¤£§tµ²§Àªº¡u0¡v¡^¡F¦pªG¥¢±Ñ¡A¦^¶ÇȤp©ó®æ¦¡±±¨î¦r¦êªº¦r¤¸Ó¼Æ¡C
¨Ò¦p©³¤Uªº¨Ò¤l¡G
.DATA kilo DD 1024 szKilo DB "1K¬O",0 szFmt DB "%s%d¡A¬Û·í©ó¤Q¤»¶i¦ìªº%x¡C",0 szBuffer DB 80 DUP (?) ⁝ invoke wsprint,ADDR szBuffer,ADDR szFmt,ADDR szKilo,kilo,kilo
®æ¦¡±±¨î¦r¦ê¤¤ªº¡u%¡v¦r¤¸¦@¦³¤TÓ¡A¦]¦¹®æ¦¡³W½d¦³¤TÓ¡]¥H¥Õ¦â¼Ð¥Ü¡^¡A©Ò¥H¨ä«áªº°Ñ¼Æ¤]¦³¤TÓ¡C³o¤TӮ榡³W½d¨Ì§Ç¬O¡u%s¡v¡]¦r¦ê¡^¡B¡u%d¡v¡]¤Q¶i¦ì¦³¸¹¼Æ¡^¡B¡u%x¡v¡]¤Q¤»¶i¦ì¼Æ¡^¡A°õ¦æ«á¡Awsprintf ·|§â szBuffer ¦r¦ê·|Åܦ¨
1K¬O1024¡A¬Û·í©ó¤Q¤»¶i¦ìªº400¡C
¨ä¤¤¡©1K¬O¡ª¬O¥Ñ¡u%s¡v¹Bºâªºµ²ªG¡A¡©1024¡ª¬O¡u%d¡vªºµ²ªG¡A¡©400¡ª¬O¡u%x¡vªºµ²ªG¡C
©³¤Uªº GREETING ´N¬O¤W±¥|Ó Win64 API ªºÂ²³æÀ³¥Îªº¨Ò¤l¡C
GREETING.ASM ¬Oӫܲ³æªºÀ³¥Îµ{¦¡¡A¦b©R¥O´£¥Ü¦r¤¸¤º°õ¦æ®É¡AGREETING ·|¦L¥X´£¥Ü¦r¦ê¡u½Ð¿é¤J±zªº¦W¦r¡G¡v¡Aµ¥¨Ï¥ÎªÌ¿é¤J§¹²¦¡A«ö¤U Enter Áä¡AGREETING ·|¦b¤U¤@¦æ¦L¥X¡u±z¦n¡A¡v¡AµM«á¬O¨Ï¥ÎªÌ¿é¤Jªº¦W¦r¡Aµ²§ôµ{¦¡¡Cì©lµ{¦¡¦p¤U¡G
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 32 33 34
35 36 37 38 39 |
INCLUDE E:\masm64\include64\masm64rt.inc
;******************************************************************************
.DATA
hIn HANDLE ?
hOut HANDLE ?
nWritn QWORD ? ;¹ê»Ú¦b¿Ã¹õ¤W¦L¥Xªº¸ê®Æªø«×
nRead QWORD ? ;¨Ï¥ÎªÌ¹ê»Ú¿é¤Jªº¸ê®Æªø«×
sHint DB "½Ð¿é¤J±zªº¦W¦r¡G"
szFmt DB "±z¦n¡A%s¡C",0
sName DB 102 DUP ("f"),0
szGreet DB 116 DUP (0)
;******************************************************************************
.CODE
;------------------------------------------------------------------------------
main PROC
;¨ú±o¼Ð·Ç¿é¤J¡B¿é¥X¸Ë¸mªº±±¨î¥N½X
invoke GetStdHandle,STD_INPUT_HANDLE
mov hIn,rax
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov hOut,rax
;©ó¼Ð·Ç¿é¥X¸Ë¸m¤WÅã¥ÜsHint¦r¦ê¡A¨ÃÅý¨Ï¥ÎªÌ¿é¤J¦r¦ê
invoke WriteConsole,hOut,ADDR sHint,SIZEOF sHint,ADDR nWritn,0
invoke ReadConsole,hIn,ADDR sName,SIZEOF sName,ADDR nRead,0
;Åý¨Ï¥ÎªÌ¿é¤Jªº¦W¦r«á¡A¥[¤W0¡A¨Ï¦¨¥H¹sµ²§Àªº¦r¦ê
invoke wsprintf,ADDR szGreet,ADDR szFmt,ADDR sName
;§Q¥Îwsprintf¥Í¦¨szGreet¡A¦¹¦r¦ê¬O¡u±z¦n¡A¡v+¦W¦r+¡u¡C¡v
lea r10,sName
add r10,nRead
cmp BYTE PTR [r10-1],0ah
jne over
mov BYTE PTR [r10-2],0 ;¨Ï¥ÎªÌ¿é¤J¾A·íªø«×ªº¦W¦r
jmp pnt_it
over: mov BYTE PTR [r10-1],0 ;¨Ï¥ÎªÌ¿é¤J¹Lªøªº¦W¦r
pnt_it: invoke wsprintf,ADDR szGreet,ADDR szFmt,ADDR sName
invoke WriteConsole,hOut,ADDR szGreet,eax,ADDR nWritn,0
invoke ExitProcess,0
main ENDP
;******************************************************************************
END |
²Õͳsµ² GREETING.ASM ªº¤èªk¡A½Ð°Ñ¾\¤U¹Ï¡A²HÂŦ⪺^¤å¦r¬O¨Ï¥ÎªÌ»Ýn¿é¤Jªº¡C²Ä①¡ã③¨BÆJ¡A»P«e¨â³¹¤jP¤@¼Ë¡A¦ý²Ä④¨BÆJnª`·N¡C¦]¬° GREETING ¬O¥D±±»Oµ{¦¡¡A¥²¶·©ó³sµ²®É¿é¤J¡u/SUBSYSTEM:CONSOLE¡v¿ï¶µ¤~¦æ¡]¬õ¦â®Ø½u¤º¡^¡FY¥Î¡u/SUBSYSTEM:WINDOWS¡v¡AÁöµL¿ù»~¥X²{¡A¦ý°õ¦æ®É¤£¯à¦L¥X¦r¤¸¡A¤]µLªk¿é¤J¡C²Ä④¨BÆJ¡A¡u/link¡v¬O ML64.EXE ªº¿ï¶µ¤§¤@¡A¥¦ªí¥Ü¦b ML64.EXE ²Õͦ¨¥\«á¡A·|¦Û°Ê°õ¦æ LINK.EXE¡A¦Ó¡u/link¡vªº·N«ä¬O«á±ªº¿ï¶µ¨Ã¤£¬O ML64.EXE ªº¡A¦Ó¬On¶Çµ¹ LINK.EXE ªº¿ï¶µ¡C¤]´N¬O»¡¡A¡u/subsystem:console¡v»P¡u/entry:main¡v³£¬On¶Çµ¹ LINK.EXE ªº¿ï¶µ¡C
²Ä④¨B¦pªG¨S¦³¿ù»~°T®§¡A´Nªí¥Ü²Õͳsµ²¦¨¥\¡A²Ä⑤¨B¬O°õ¦æ GREETING.EXE¡CGREETING.EXE ·|¦L¥X´£¥Ü¦r¦ê¡u½Ð¿é¤J±zªº¦W¦r¡G¡v¡A¨Ï¥ÎªÌ¿é¤J¡u¤p¤ì°¸¡v¦A«ö¤U Enter Áä¡AGREETING.EXE ·|¦L¥X¡u±z¦n¡A¤p¤ì°¸¡C¡v¡C°²¦p°õ¦æ GREETING.EXE «á¥X²{¶Ã½X¡AÀ³¸Ó¬O¶½X±³]©w¿ù»~¡A¥i¥H¦b©R¥O´£¥Ü¦r¤¸¥Î¡uchcp 950¡v¤Á´«¡AÅܦ¨¯à¿é¤J©Î¦b¿Ã¹õ¤W¦L¥X¤¤¤å¡C©³¤U¤¶²Ð GREETING.ASM ¤¤·sªº«ü¥O©Î¹Bºâ¤l
Windows §@·~¨t²Î«Ü½ÆÂø¡A©Ò¥H¸ê®ÆÃþ«¬¤]«Ü¦h¡A¤ñ²Õ¦X»y¨¥¦h±o¦h¡C²Õ¦X»y¨¥¤¤¥uÃö¤ß¸ê®ÆÃþ«¬ªºªø«×¡A¦Ó Windows ¤£¶È¬Oªø«×¡AÁÙnª`·N¨ä·N¸q¡C¨Ò¦p±±¨î¥N½X»P¦ì§}ªºªø«×³£¬O¥|¦r²Õ¡A¦ý¬O¦b Windows ¤¤¤À§O¬O HANDLE »P LPSTR ªí¥Ü¡FY¥Î²Õ¦X»y¨¥¡A¨ä¹ê³£¥i¥H¥Î QWORD¡C¦b²Ä¤T³¹µù¤G¤]ª¾¹D¡A¥ú¬O¦ì§}¤S¤À³\¦hºØ¡C¤£½×¦p¦ó¡A³o¨Ç³£¦b win64.inc «Å§i¡C
DUP ¹Bºâ¤l¬O¥Î¨Ó©w¸q¨ã¦³«½Æ¥X²{ªº¼ÆÈ¡A¥²¶··f°t DB¡BDW¡BDD¡BDQ ¨Ï¥Î¡A¨ä»yªk¬O¡G
¦¸¼Æ DUP ( ªì©lÈ[,ªì©lÈ[,...]] )
¤W¦¡¤¤ªº¦¸¼Æ´N¬O«½Æ¦¸¼Æ¡An«½Æªº³¡¤À¦b«á±¤@¹ï ( ) ¤ºªºªì©lÈ¡A³oªì©lȤ]¥i¥H¬O¦r¦ê¡C¦pªG¤£½T©wªì©lÈ¡A¤]¥i¥H¥Î¡u?¡v¥N´À¡C¥t¥~¡A¦b ( ) ¤º¤]¥i¥H¦A«×¨Ï¥Î DUP ¹Bºâ¤l¡C©³¤U¬O´XÓ¨Ò¤l¡G
a BYTE 4 DUP (1) ;¬Û·í©ó¡ua DB 1,1,1,1¡v b DB 5 DUP (10 DUP (2)) ;¬Û·í©ó©w¸q¤F 50 Ӧ줸²Õªº 2 c DB 3 DUP (1,2,3) ;¬Û·í©ó©w¸q¤T¦¸¡u1,2,3¡v¡A¤]´N¬O¡uc DB 1,2,3,1,2,3,1,2,3¡v d DB 2 DUP ("so ") ;¬Û·í©ó¡ud DB "so ","so "¡v¡A¤]´N¬O¡ud DB "so so "¡v
°£¤F SIZEOF ¹Bºâ¤l¤§¥~ÁÙ¦³ TYPE¡BLENGTHOF ¨âÓ¡A³o¤TÓ¹Bºâ¤lªº»yªkÃþ¦ü¡A¦]¦¹¤@°_»¡©ú¡C¥¦Ìªº»yªk¤À§O¬O
LENGTHOF ÅÜ¼Æ SIZEOF ÅÜ¼Æ©Î¸ê®ÆÃþ«¬ TYPE ÅÜ¼Æ©Î¸ê®ÆÃþ«¬
LENGTHOF ¬OÅý²Õ;¹pºâ©Ò©w¸qªºÅܼƦ¨û¦³¦h¤ÖÓ¡FTYPE ¬OÅý²Õ;¹¶Ç¦^¨CÓ¦¨û¦³¦h¤ÖӦ줸²Õ¡A¤]´N¬O¦¹¸ê®ÆÃþ«¬¦³´XӦ줸²Õ¡FSIZEOF Åý²Õ;¹pºâÅܼÆÁ`¦@§t¦³¦h¤ÖӦ줸²Õ¡C¥Ñ«e±±Ôz¥iª¾¡ASIZEOF¡×TYPE¡ÑLENGTHOF¡CÁ|´XÓ¨Ò¤l»¡©ú¡AÀ³¸Ó·|§ó²M·¡¡G
;TYPE LENGTHOF SIZEOF v1 DB 3 DUP (1,2,3) ; 1 9 9 v2 DW 40 DUP (40 DUP (5)) ; 2 1600 3200 v3 DD 3 DUP (20,30) ; 4 6 24 str1 DB "After all, Tomorrow is", ; 1 35 35 " another day." str2 DB "After all, Tomorrow is" ; 1 22 22 DB " another day."
¤W±¨Ò¤lùØ¡Av1 ¨ä¹ê¬O¡uv1 DB 1,2,3,1,2,3,1,2,3¡v¡A©Ò¥H¨CÓ¦¨û¤j¤p¬°¤@Ӧ줸²Õ¡ATYPE v1 ¬° 1¡A¦¹¥~ v1 ¦³¤EÓ¦¨û¡A¬G LENGTHOF v1 ¬° 9¡Fv1 Á`¦@¦û¥Î 9 Ӧ줸²Õ ( 9¡Ñ1 )¡A¬G SIZEOF v1 ¬° 9¡C
v2 ¬O¥H DW ©w¸q¡A©Ò¥H¨CÓ¦¨û¤j¤p¬°¨âӦ줸²Õ¡A¬G TYPE v2 ¬° 2¡F¦¹¥~¦b DUP ªº¬A¸¹ùئ³ 40 Ó¦¨û¡A¦ýn«½Æ 40 ¦¸¡A¦]¦¹¦³ 40¡Ñ40 Ó¦¨û¡A©Ò¥H LENGTHOF v2 ¬° 1600¡Fv2 Á`¦@¦û¥Î 3200 Ӧ줸²Õ ( 1600¡Ñ2 )¡A¬G SIZEOF v2 ¬° 3200¡C
¦]¬° v3 ¬O¥H DD ©w¸q¡A©Ò¥H¨CÓ¦¨û¤j¤p¬°¥|Ӧ줸²Õ¡A¬G TYPE v3 ¬° 4¡Fv3 ¦b DUP ªº¬A¸¹ùئ³ 20¡B30 ¨âÓ¦¨û¡A¦ýn«½Æ 3 ¦¸¡A¦]¦¹Á`¦@¦³¤»Ó¦¨û¡A©Ò¥H LENGTHOF v3 ¬° 6¡Fv3 Á`¦@¦û¥Î 24 Ӧ줸²Õ ( 6¡Ñ4 )¡A¬G SIZEOF v3 ¬° 24¡C
³Ì«á¨âÓ¨Ò¤l¬O¦³´«¦æªº¦r¦ê¡Aª`·N¨ì str1 ¦b¤Þ¸¹«á±¦³³r¸¹¡Aªí¥Ü str1 ¦r¦ê·|©µ¦ù¨ì¤U¤@¦æ¡A³o®ÉÔ¤U¤@¦æ¤£»Ýn¥H¡uDB¡v©w¸q¡A¤]´N¬O»¡ str1 ¬O¡uAfter all,Tomorrow is another day.¡v¡A¦]¦¹ SIZEOF pºâ¥X¨Óªºµ²ªG¬° 35 Ӧ줸²Õ¡C
³Ì«á¤@Ó¨Ò¤l¡Astr2¡A¤Þ¸¹«á±¨S¦³³r¸¹¡Aªí¥Ü¦¹¦r¦ê¥u¦³¤@¦æ¦Ó¤w¡F¦b str2 ©³¤Uªº¦r¦ê¡A§Y¨Ï¨S©w¸q¦r¦ê¦WºÙ¡A¦b²Õ;¹ªºµø¨¤¤¤¤´»P str2 ²@¤£¬Û¤zªº¡C¤]´N¬O»¡ str2 ¦r¦ê¬O¡uAfter all, Tomorrow is¡v¡A¦]¦¹ SIZEOF pºâ¥X¨Óªºµ²ªG¥u¦³ 22 Ӧ줸²Õ¡C¥Ñ¦¹¬Ý¨Ó¡A¦³¨S¦³¡u,¡v©M¡uDB¡v·N¸q§¹¥þ¤£¦P¡A·í©w¸qªº¦r¦ê¤Óªøn´«¦æ®É¶·¤p¤ßª`·N¡C
¯à¶i¦æ¹Bºâªº x64 «ü¥O¡A¦pªG»Ýn¨âÓ¹Bºâ¤¸¡A¨Ò¦p MOV¡BADD¡BSUB¡BXOR¡K¡Kµ¥¡A³o¨âÓ¹Bºâ¤¸ªºªø«×¥²¶·¬Û¦P¡A¨Ò¦p¤£¯à¥Øªº¹Bºâ¤¸¬O¤Q¤»¦ì¤¸¡A¦Ó¨Ó·½¹Bºâ¤¸¬O¤K¦ì¤¸¡C¦ý¦³®ÉÔ¡A¥²¶·±j¢Åý¤w©w¸qªºÅܼƧïÅÜ¸ê®ÆÃþ«¬¡A¥H²Å¦X¥t¤@Ó¹Bºâ¤¸¡C³o®ÉÔ´N¥i¥H¥Î PTR ¹Bºâ¤l¡A¨ä¥Îªk¬O¡G
type PTR expression
type ¬O§ïÅܤ§«áªº¸ê®ÆÃþ«¬¡Aexpression «h¬OÅܼƦWºÙ©Î¬O¶¡±µ©w§}ªº°O¾ÐÅéÅܼơC¨Ò¦p©³¤Uªº¨Ò¤l¡G
number DQ 589abh
⁝
mov rax,112233h
mov ax,WORD PTR number
¤@¶}©l©w¸q number ¬O¥|¦r²ÕÅܼơ]64 ¦ì¤¸¡^¡A°²·Qµ{¦¡«á¨Ó»Ýn§â number ¤§È²¾¤J AX ¸Ì¡C¦ý AX ªø«×¬°¦r²Õ¡]16 ¦ì¤¸¡^¡A¦]¦¹¥Î¡uWORD PTR¡v±j¢ number ¼È®É§ï¦¨¦r²Õªº¸ê®ÆÃþ«¬¡C³o®ÉÔn§â number ¤§¼ÆÈ¼È®É·Q¦¨¬O 89ABH¡C°õ¦æ§¹¡umov ax,WORD PTR number¡v«á¡A¥u¦³ AX ¤§È§ïÅÜ¡ARAX ¨ä¥L¦ì¤¸¤´¤£ÅÜ¡A©Ò¥H RAX ¤§ÈÅܬ° 1189ABH¡C
³o¬O¤@ºØ¶¡±µ©w§}¡A½Ð°Ñ¾\²Ä¤G³¹ªº»¡©ú¡C
JMP ªº»yªk¬O
JMP ¼Ð°O
JMP ¬O¡uJump¡vªº·N«ä¡A§YµL±ø¥ó¸õÅD¨ì¼Ð°O ( label ) ªº¦ì§}³BÄ~Äò°õ¦æ¡C
¦pªG¼Ð°O¬O¡u@f¡v©Î¡u@b¡vªº¸Ü¡A¥²©w·|¦³¤@Ó¬O¡u@@:¡vªº¼Ð°O¡C¦pªG¬O¡uJMP @f¡v¡A¥Nªí©¹°ª¦ì§}¸õÅD¨ì³Ìªñªº¡u@@:¡v³B¡F¦pªG¬O¡uJMP @b¡v¡A¥Nªí©¹§C¦ì§}¸õÅD¨ì³Ìªñªº¡u@@:¡v³B¡C·|¦³¡u@@:¡v¼Ð°Oªºì¦]¡A¥Dn¬O¦]¬°²Õ¦X»y¨¥¥Î¨ì¸õÅD«ü¥Oªº¾÷·|¤£¤Ö¡A¦ý¬O¨C¦¸³£n¬°¼Ð°O¨úÓ¦³·N¸qªº¦W¦r«Ü³Â·Ð¡Aªp¥B¦³®É¨ººØ·N¸q¤]¤£«n¡A¦]¦¹¥Î¡u@@:¡v¥N´À¡C
CMP ¬O¤ñ¸û«ü¥O¡A¤ñ¸û¨âÓ¹Bºâ¤¸ªº«ü¥O¡A¨ä»yªk¬O¡G
CMP ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸
¨Æ¹ê¤W¡ACPU ¦b°õ¦æ CMP «ü¥O®É¡A¨ä¹ê¬O°õ¦æ SUB «ü¥O¡A®t§O¥u¬O¦b©ó¡ACMP ¨Ã¨S¦³§âµ²ªG¦s¤J¥Øªº¹Bºâ¤¸¡C¨âªÌ³£·|§ïÅܺX¼Ð¼È¦s¾¹¤§È¡A¦Ó CMP «ü¥O«á±³q±`·|±µ±ø¥ó¸õ¶V«ü¥O¡A¥H§¹¦¨¬yµ{±±¨î¡C
JE «ü¥O»P JZ «ü¥O¬O¬Û¦Pªº«ü¥O¡A¨ä·N¤À§O¬°¡ujump if equal¡v©Î¡ujump if zero¡v¡A³oÓ«ü¥Oªº»yªk¬O¡G
JE ¼Ð°O JNE ¼Ð°O
¼Ð°O¡]label¡^¬O¤@¦ê^¤å¦r²Õ¦¨¡A¤]¥i¥H¥]§t¡u_¡v¡Bªü©Ô§B¼Æ¦r¡A¥²¶·¥H¡u:¡vµ²§À¡C¥¦¥NªíµÛ¦ì§}¡A´£¨Ñ¸õÅD«ü¥O±N±±¨îÅvÂಾªº¥Øªº¦a¡C¸õÅD«ü¥Oªº¥Øªº¦a¡A³q±`¥u¯à¦b¦P¤@°Æµ{¦¡¤º¡F¦ý¼Ð°Oªºµ²§À¤]¥i¥H¬O¡u::¡v¡A¥ç§Y¨âÓ³sÄòªº«_¸¹¡A³oºØ¼Ð°O§@¬°¨ä¥L°Æµ{¦¡¤º¸õÅD«ü¥Oªº¥Øªº¦a¡]¤£¹L³oºØ¼gªk¤£²Å¦Xµ²ºc¤Æµ{¦¡³]pÆ[©À¡AºÉ¶q¤Ö¥Î¡^¡C
JE ·|Àˬd¹sȺX¼Ð¡A¦pªG¹sȺX¼Ð¤w³Q³]©w¡]¤]´N¬O¹sȺX¼Ð¬°¤@¡^¡A´N·|µo¥Í¸õÅD¡A±±¨îÅv·|¸õÅD¨ì¨ä«á©Ò±µªº¼Ð°O¤§³B°õ¦æ¡C¨º¤°»ò®ÉÔ¹sȺX¼Ð·|³]©w©O¡H·í«e±ªº«ü¥O¹Bºâµ²ªG¬°¹s®É¡ACPU ·|³]©w¹sȺX¼Ð¡] °Ñ¦Ò²Ä¤G³¹¶i¦ìºX¼Ð»P¹sȺX¼Ð¡^¡C
JNE »P JNZ ¬O¬Û¦Pªº«ü¥O¡A¨ä·N¤À§O¬°¡ujump if not equal¡v©Î¡ujump if not zero¡v¡A¥¦Ìªº·N«ä³£¬O¦pªG¤£µ¥©ó´N¸õÅD¡A»yªk¨£¤W± JE ªº»¡©ú¡C³o¨âÓ«ü¥OÀˬd¹sȺX¼Ð¡A¦pªG¹sȺX¼Ð¤w³Q²M°£¡]¤]´N¬O¹sȺX¼Ð¬°¹s¡^¡A´N·|µo¥Í¸õÅD¡A±±¨îÅv·|¸õÅD¨ì¨ä«á©Ò±µªº¼Ð°O¤§³B°õ¦æ¡C
¥H GREETING.ASM ªº²Ä 29¡ã33 ¦æ¡G
cmp BYTE PTR [r10-1],0ah
jne over
mov BYTE PTR [r10-2],0
jmp pnt_it
over: mov BYTE PTR [r10-1],0
pnt_it: invoke wsprintf,ADDR szGreet,ADDR szFmt,ADDR sName
GREETING.ASM ªº²Ä 31 ¦æ¤ñ¸û [R10-1] ¤§È¡]¦¹¼ÆÈªº¸ê®ÆÃþ«¬¬O¦ì¤¸²Õ¡^¬O§_¬° 0AH¡]¦¹¬°¤Q¤»¶i¦ìªº A¡A¬Û·í©ó¤Q¶i¦ìªº 10¡^¡C¤ñ¸û¤è¦¡¨ä¹ê´N¬O±N¨â¼Æ¶i¦æ´îªk¹Bºâ¡A[R10¡Ð1]¡Ð0ah¡C¥u¦³·í¨â¼Æ¬Ûµ¥®É¡A¬Û´î®Éµ²ªG¤~µ¥©ó¹s¡ACPU ³]©w¹sȺX¼Ð¡A´N¤£¸õÅD¡CY¨â¼Æ¤£µ¥¡A¬Û´î¤£¬°¹s¡A¹sȺX¼Ð·|³Q CPU ²M°£¡A´Nµo¥Í¸õÅD¡C¦ý³o¼Ë²z¸Ñ¤Ó½ÆÂø¡A¹ê°È¤W¶È»Ý°O±o¡GJE/JZ ªí¥Ü¬Ûµ¥´N¸õÅD¡FJNE/JNZ ªí¥Ü¤£¬Ûµ¥´N¸õÅD¡]§â Z ¬Ý¦¨ E¡^¡A¦Ó¥B§¡¤£¼vÅTì¨Ó CMP ªº¥þ³¡¹Bºâ¤¸¡C
©³¤Uªºµ{¦¡µ²ºc¬O«Ü±`¥Îªº¡A¥¦Ãþ¦ü GREETING.ASM ªº²Ä 29¡ã33 ¦æ¡A¨ä¥Î³~¬O·í¥Øªº¹Bºâ¤¸µ¥©ó¨Ó·½¹Bºâ¤¸®É¡A°õ¦æµ{¦¡¤ù¬q¤@¡F§_«h°õ¦æµ{¦¡¤ù¬q¤G¡A¤£¹L¡A¤£½×°õ¦æþÓ¬qµ{¦¡¤ù¬q¡A³Ì«á³£·|¨ì¼Ð°O2³B°õ¦æ¡G
cmp ¥Øªº¹Bºâ¤¸,¨Ó·½¹Bºâ¤¸
jz ¼Ð°O1
µ{¦¡¤ù¬q¤@
jmp ¼Ð°O2
¼Ð°O1: µ{¦¡¤ù¬q¤G
¼Ð°O2: ⁝
¤£ª¾§A¬O§_·|ı±o²Õ¦X»y¨¥±±¨îµ{¦¡¬yµ{ªº¤è¦¡«Ü¤£ª½Æ[¡A¦³¨S¦³¤èªk§ï¶i©O¡HÁÙ¯uªº¦³¡A½Ð°Ñ¾\µù¤@¡C
¦³Ãö GREETING.ASM ©Ò¥Î¨ì·sªº Win64 API¡B«ü¥O³£¤w´£¹L¡A¦p´N³o¼Ëµ²§ô¡AÁ`·Pı¹j¹u·kÄo¡F¦p¥Î x64dbg ¨ÓÆ[¹î¡A©Î³\§óª½Æ[¡C©³¤U¬O¸ü¤J GREETING.EXE «á¡A¤w¸gn°õ¦æ§Ú̼¶¼gªºµ{¦¡½X¤F¡]¦pªG¨S¦³¡A½Ð°Ñ¦Ò²Ä¤G³¹¡^¡C¸ê®ÆÅã¥Ü°Ï©ÒÅã¥Üªº¨Ã«D GREETING.EXE ªº¸ê®Æ°Ï¬q¡A¨£¤U¹Ï¤¤¬õ¦â®Ø¤ºªº¦ì§}¡A¬O hIn ©Ò¦b¦ì§}¡C¥i¥H§â·Æ¹«´å¼Ð²¾¦Ü¸ê®ÆÅã¥Ü°Ï¡A¦A«ö¤U Ctrl¡ÐG¡A¿é¤J¸Ó¦ì§}¡A³Ì«á«K¯à¨£¨ìGREETING.EXE ªº¸ê®Æ°Ï¬q¡A¦p¤U¹Ï
©Î³\²´¦yªº¤H·|µo²{¡A¤W¹Ï¤¤ªºÂÅ¦â®Ø¤º¡]¼Ð¥Ü①¡^¡A¥»À³¸Ó¬O¤¤¤å¦r¦ê¡A¦p¤µ«o¬O¶Ã½X¡A³o¬O¦]¬°½s½X¿ù»~¡C
¨£¤W¹Ï¡A§â·Æ¹«´å¼Ð²¾¦Ü¸ê®ÆÅã¥Ü°Ï¡A«ö·Æ¹«¥kÁä¡÷¡u¤Q¤»¶i¦ì¡v¡÷¡uBig5¡v§Y¥i¨Ï¥Î Big¡Ð5 ½s½X¤è¦¡¡]¦pªG¿ï³æ¤W¨S¦³ Big5¡A¨º»ò¥i¥H¿ï¡u¦r½X¶¡vµM«á©ó¼u¥Xªº¹ï¸Ü²°¤¤¿ï¾Ü Big5¡^¡A³o¼Ë´N¯à¥¿±`Åã¥Ü¡A¼ÐÃDÄæ¤]§ï¦¨¡uBig5¡v¡A¨£¤U¹ÏÂÅ¦â®Ø©Ò¥Ü¡C³oùض¶±a¤@´£¡A¥Ñ¤U¹Ï¥iª¾¡A½Ðªº Big¡Ð5 ½X¬O BDD0¡A¿é¬O BFE9¡A³o¨Ç«o¬O¨Ì¾Ú¤pºÝ§Ç±Æ¦C¡A»P x64 ²ßºD¤£¦P¡C
±µ¤U¨Ón°õ¦æ GREETING.EXE ¤F¡A¦ý¬O§ÚÌ¥u·QÆ[¹î¨Ï¥ÎªÌ¿é¤J¦W¦r«áªºµ²ªG¡AÀò±o¼Ð·Ç¸Ë¸m±±¨î¥N½X¡B¦L¥X sHint ¦r¦ê¡Bµ¥¨Ï¥ÎªÌ¿é¤J¦W¦r«ÜÈÆ[¡A¤£¤Ó»ÝnÆ[¹î¡A³o®ÉÔ¤¤Â_ÂI´N«Ü¦³¥Î¤F¡C
n¦b¬YÓ«ü¥O¤W³]¸m¤¤Â_ÂI¡A¥ý§â·Æ¹«´å¼Ð²¾¨ì¸Ó«ü¥O¤W¡AÂIÀ»¤@¤U¡A¦A«ö¤U¡uF2¡vÁä¡A«K³]¸m¦¨¥\¡C¦pªGn¨ú®ø¤¤Â_ÂI¡A´N¦A«ö¤@¦¸¡uF2¡vÁä¡C±µ¤U¨Ó¡A«ö¤U¡uF9¡vÁä¡Ax64dbg ´NÅýÀ³¥Îµ{¦¡¶}©l°õ¦æ¡Aª½¨ì¤¤Â_ÂI¤Wªº«ü¥O³B°±¤î¡]¸Ó«ü¥O©|¥¼°õ¦æ¡^¡C¤U¹Ï¬O§â¤¤Â_ÂI³]¸m¦b¡ulea rcx,qword ptr ds:[13F7¡K]¡v«ü¥O¤W¡C
±µ¤U¨Ó¡A«ö¤U¡uF9¡vÁä¡AGREETING.EXE ´N¶}©l°õ¦æ¡A¨Ï¥ÎªÌ¶·¤Á´«¨ì x64dbg ¥Í¦¨ªº©R¥O´£¥Ü¦r¤¸¡A¿é¤J¦W¦r¡AµM«á«ö¤U¡uEnter¡vÁä¡Ax64dbg ·|§âµe±¤Á´«¦^¨Ó¡]¦pªG¨S¦³¡A½Ð¦Û¦æ¥Î·Æ¹«ÂI¿ï x64dbg¡^¡C¨£¤U¹Ï¡G
¤W¹Ïªº¬õ¦â®Ø¤º´N¬O¨Ï¥ÎªÌèè¿é¤Jªº¦W¦rªø«×¡AÂÅ¦â®Ø¤ºªº«h¬Oèè¿é¤Jªº¦W¦r¡A¨ä¤¤ªº¡u\r¡v¡B¡u\n¡v¤À§O¬OÂk¦ì¦r¤¸¤Î´«¦æ¦r¤¸¡C
©I¥s ReadConsole ¥iÅý¨Ï¥ÎªÌ¿é¤J¦W¦r¡A¦ýn¥Í¦¨°Ý¦n¦r¦ê¡AÁÙ±o¦b¦W¦r¤§«e¥[¤W¡u±z¦n¡A¡v¡A¦W¦r¤§«á¥[¤W¡u¡C¡vÂÇ¥Ñ wsprintf «Ü®e©ö´N¯à§â¹s´²ªº¦r¦ê³s±µ°_¨Ó¡A«D±`¤è«K¡C
¦ý°ÝÃD¬O¡AÂÇ¥Ñ ReadConsole ©Ò¿é¤Jªº¦W¦r¬O¥H 0Dh¡B0Ah µ²§À¨Ã«D¥H¹sµ²§À¡A¦Ó©I¥s wsprintf ªº°Ñ¼Æ¡A¦pªG¬O¦r¦ê¦ì§}¡A¸Ó¦ì§}¤Wªº¦r¦ê¶·¥H¹sµ²§À¡A©Ò¥H¥²¶·¥Î¹s¨ú¥N 0Dh¡B0Ah¡C¨º¸Ó«ç»ò¿ì©O¡Hº¥ý§ä¨ì¦W¦rªºµ²§À¦ì§}¡AµM«á§PÂ_µ²§À¦ì§}«e±²Ä´XӦ줸²Õ¸Ó§ï¦¨¹s¡C
¨ä¹ê¤]¤£Ãø¡AsName ¦r¦ê¦ì§}¦A¥[¤W ¨Ï¥ÎªÌ¿é¤Jªºªø«×´N¬Oµ²§À¦ì§}ªº¤U¤@¦ì§}¡C¦p¤U¹Ï¡A¦pªG¨Ï¥ÎªÌ¿é¤J¡u¤p¤ì°¸¡v¤T¦r¡A¨º»ò¨Ï¥ÎªÌ¿é¤Jªºªø«×¬O 8 Ӧ줸²Õ¡AsName ¦ì§}¬O 13F743097¡A©Ò¥Hµ²§À¦ì§}ªº¤U¤@¦ì§}¬O 13F74309F¡]¾ï¦â½bÀY¡^¡C
¦pªG¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æªø«×¡A¤p©ó©Îµ¥©ó SIZEOF sName¡A¨º»òºâ¬O¥¿±`¿é¤J¡Aµ²§À¦ì§}¤ºªº¬O 0Ah¡A¦]¦¹¥u¶·§âµ²§À¦ì§}«e¤@Ó¦ì§}¶ñ¤J¹s§Y¥i¡C¦pªG¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æªø«×¶W¹L SIZEOF sName¡Aµ²§À¦ì§}¤ºªº´N¤£¬O 0Ah¡A¦]¬°³oºØ±¡ªp¤U¡A¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¹Lªø¡A¤Ï¥¿¶W¹Lªº³¡¤À³£·|³QºI±¼¡A©Ò¥H´NÅýµ²§À¦ì§}¤º®eÅܹs¡C
¥»³¹¤¶²Ðªº¥D±±»Oµ{¦¡¡A¬O¬°¤F¤U¤@³¹·Ç³Æ¡C¤U¤@³¹n¤¶²Ð°Ï°ìÅܼơB°ïÅ|®Ø¡B°Æµ{¦¡¹ê§@µ¥°ò¥»·§©À¡A¤]¬O§Q¥Î¸û¬°³æ¯Âªº¥D±±»Oµ{¦¡¬°¨Ò¤l¡C
¡u.if/.elseif/.else/.endif¡v¥¨¶°¬O³\¦h¥ý¶i¨¯³Òªº¦¨ªG¡A¨Ã«D ML64 ªº«O¯d¦r¡A¬G¥²¶·°Ï¤À¤j¤p¼g¡]¥ç§Y³£¥²¶··Ó©³¤Uªº¤j¤p¼g¨Ó¼g¡A§_«h·|µo¥Í¿ù»~¡^¡C¥¦ªº»yªk¦³¤TºØ¡G
⑴¡B²Ä¤@ºØ³Ì²³æ¡A¥¦ªº»yªk¬O
.if §PÂ_¦¡
µ{¦¡¤ù¬q
.endif
¤W±³o¬qµ{¦¡¬O»¡¡A·í§PÂ_¦¡¬°¯u¡A°õ¦æµ{¦¡¤ù¬q¤ºªºµ{¦¡½X¡A«Ý³o¨Çµ{¦¡½X³£°õ¦æ§¹²¦¡A¸õ¨ì .endif ¤§«áÄ~Äò°õ¦æ¡FY§PÂ_¦¡¬°°²¡A«h¸õ¦Ü .endif ¤§«áªºµ{¦¡½X°õ¦æ¡A¤£°õ¦æµ{¦¡¤ù¬q¤ºªºµ{¦¡½X¡C³o¨àªº§PÂ_¦¡»P©³¤U¨âºØ±¡§Îªº§PÂ_¦¡¡Aµy«á»¡©ú¡C
⑵¡B²Ä¤GºØ»yªk¬O¡G
.if §PÂ_¦¡
µ{¦¡¤ù¬q¤@
.else
µ{¦¡¤ù¬q¤G
.endif
¤W±ªºµ{¦¡½X¬O»¡¡A·í§PÂ_¦¡¬°¯u®É¡A°õ¦æµ{¦¡¤ù¬q¤@¸Ì±ªºµ{¦¡½X¡A«Ý°õ¦æ§¹«á¸õ¦Ü .endif ¤§«áªºµ{¦¡½XÄ~Äò°õ¦æ¡FY§PÂ_¦¡¬°°²¡A«h°õ¦æµ{¦¡¤ù¬q¤G¸Ì±ªºµ{¦¡½X¡A°õ¦æ§¹¤§«á¤]¸õ¦Ü .endif ¤§«áªºµ{¦¡½XÄ~Äò°õ¦æ¡C
⑶¡B²Ä¤TºØ»yªk¸û¬°½ÆÂø¡G
.if §PÂ_¦¡¤@
µ{¦¡¤ù¬q¤@
.elseif §PÂ_¦¡¤G
µ{¦¡¤ù¬q¤G
.elseif §PÂ_¦¡¤T
µ{¦¡¤ù¬q¤T
⁝
.else
µ{¦¡¤ù¬q
.endif
¤W±ªºµ{¦¡½X¬O»¡¡A·í§PÂ_¦¡¤@¬°¯u®É¡A°õ¦æµ{¦¡¤ù¬q¤@¸Ì±ªºµ{¦¡½X¡A«Ý°õ¦æ§¹«á¸õ¦Ü .endif ¤§«áªºµ{¦¡½XÄ~Äò°õ¦æ¡FY§PÂ_¦¡¤@¬°°²¡A¥B§PÂ_¦¡¤G¬°¯u¡A«h°õ¦æµ{¦¡¤ù¬q¤G¸Ì±ªºµ{¦¡½X¡A°õ¦æ§¹¤§«á¤]¸õ¦Ü .endif ¤§«áªºµ{¦¡½XÄ~Äò°õ¦æ¡FY§PÂ_¦¡¤@»P§PÂ_¦¡¤G§¡¬°°²¡A¥B§PÂ_¦¡¤T¬°¯u¡A«h°õ¦æµ{¦¡¤ù¬q¤T¸Ì±ªºµ{¦¡½X¡A°õ¦æ§¹¤§«á¤]¸õ¦Ü .endif ¤§«áªºµ{¦¡½XÄ~Äò°õ¦æ¡K¡K¡FY¥H¤W§PÂ_¦¡§¡¬°°²¡A´N°õ¦æµ{¦¡¤ù¬q¤ºªºµ{¦¡½X¡A°õ¦æ§¹¤§«á¤]¸õ¦Ü .endif ¤§«áªºµ{¦¡½XÄ~Äò°õ¦æ¡C.else »Pµ{¦¡¤ù¬q¥i¥H¬Ù²¤¡A¦pªG¬Ù²¤¡A¨º»ò©Ò¦³§PÂ_¦¡¬°°²®É¡A´N¤£·|°õ¦æ .if ¨ì .endif ¤§¶¡ªº¥ô¦óµ{¦¡¤ù¬q¡A¦Ó¬Oª½±µ¸õ¦Ü .endif ¤§«áªºµ{¦¡°õ¦æ¡C
³o¸Ìªº§PÂ_¦¡¨Ã«D¬O ML64.EXE ©Ò´£¨Ñªº±ø¥ó²ÕĶªº§PÂ_¦¡¡A¦Ó¬O·f°t MASM64 SDK ªº¥¨¶°¡G.while/.break .if/.endw ©Î .if/.elseif/.else/.endif ¨Ï¥Î¡A¤£n·d²V¡C³o¨àÁ¿ªº§PÂ_¦¡¦³¨âºØ»yªk¡G
⑴¡G²Ä¤@ºØ§PÂ_¦¡ªº»yªk¬O¡G
¹Bºâ¤¸¤@ ÅÞ¿è¹Bºâ¤l ¹Bºâ¤¸¤G
³oºØ»yªk¤¤ªº¹Bºâ¤¸¤@»P¹Bºâ¤¸¤G¥i¥H¬O¼È¦s¾¹¡BÅܼƩα`¼ÆÈ¡A¦ý¤£¯à¦P®É¬°ÅܼơC¹Bºâ¤¸©MÅÞ¿è¹Bºâ¤l¤§¶¡ªºªÅ¥Õ¥i¥H¬Ù²¤¡C±`¥ÎªºÅÞ¿è¹Bºâ¤l¦p¤Uªí¡G
| ÅÞ¿è¹Bºâ¤l | ·N¸q | ÅÞ¿è¹Bºâ¤l | ·N¸q |
| == | µ¥©ó | {} | ¤£µ¥©ó |
| } | ¤j©ó | }= | ¤j©ó©Îµ¥©ó |
| { | ¤p©ó | {= | ¤p©ó©Îµ¥©ó |
| || | ©Î | && | ¥B |
©³¤Uªº¨Ò¤l¬O»¡¦pªG RAX ¤£µ¥©ó¤@¡A°õ¦æ .if ¨ì .endif ¸Ì±ªºµ{¦¡¡F¦pªG RAX ¬°¤@¡A´N¸õ¦Ü .endif ¤§«áªºµ{¦¡¡C©³¤Uµ{¦¡°õ¦æ§¹«á¡ARCX¡×300¡ARDX¡×400¡C
mov rax,3
mov rcx,100
mov rdx,200
.if rax{}1
mov rcx,300
mov rdx,400
.endif
¡u||¡v©M¡u&&¡vÅÞ¿è¹Bºâ¤l¤]¥i¥H¦b¨âÓ§PÂ_¦¡¤§¶¡°µ¬°ÅÞ¿è¹Bºâ¡C¨Ò¦p¡A©³¤Uªº¨Ò¤l¬O·í RAX¡BRDX §¡¤j©ó¹s®É¡A¤~°õ¦æ .if »P .endif ¤§¶¡ªºµ{¦¡¡A§_«h´N°õ¦æ .endif ¤§«áªºµ{¦¡¡C
.if rax}0 && rdx}0
mov rcx,300
.endwf
⑵¡G²Ä¤GºØ§PÂ_¦¡¼gªkªº»yªk¬°¡G
¹Bºâ¤¸
´N¥u¦³¤@Ó¹Bºâ¤¸¡A¥¦¥i¥H¬O¼È¦s¾¹¡BÅܼƩα`¼ÆÈ¡C·í³oÓ¹Bºâ¤¸¬°«D¹s®É¡A§PÂ_¦¡¬°¯u¡F¹Bºâ¤¸¬°¹s®É¡A§PÂ_¦¡¬°°²¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G
mov rax,3
.if rax
sub rcx,300
.endif
¤W±ªºµ{¦¡¬O«ü¦pªG RAX ¤£¬°¹s¡A°õ¦æ .if ¨ì .endif ¸Ì±ªºµ{¦¡¡FY¬°¹s¡A´N¸õ¦Ü .endif ¤§«áªºµ{¦¡¡C¦Ó¤@¶}©l RAX ¬° 3¡A©Ò¥H³Ì«á RCX¡×300¡C