
ǰÑÔ
ÔÚÈÕ³£·ÖÎöʹÓÃij¸öÈí¼þµÄ¹ý³ÌÖУ¬Èç¹ûÎÒÃÇÏëҪȥÍÚ¾òÈí¼þµÄ©¶´¡¢»òÕßÊÇͨ¹ý´ò²¹¶¡µÄ·½Ê½¸øÈí¼þÔöÌíһЩÐµĹ¦ÄÜ£¬ÒÖ»òÊÇΪÁ˼ǼÏÂÈí¼þÔËÐйý³ÌÖб»µ÷Óõĺ¯Êý¼°Æä²ÎÊý£¬ÓÐʱºòÎÒÃÇÐèÒª½Ù³Ö¶ÔijЩDLL¿âµÄµ÷Óùý³Ì¡£ÔÚÒ»°ãÇé¿öÏ£¬Èç¹ûÎÒÃÇÊÇÈí¼þµÄ¿ª·¢Õß»òÕ߸ÃÈí¼þÌṩԴÂëÏÂÔØ£¬ÄÇô¸Õ²ÅÌáµ½µÄÎÊÌâÖ»Òª¶ÔÔ´Âë½øÐÐÒ»¶¨µÄÐ޸ľͿÉÒÔÁË£¬¼òÖ±ÊÇС²ËÒ»µú¡£µ«ÊÇÔÚ¸ü¶àÇé¿öÏ£¬ÎÒÃÇÎÞ´Ó»ñÈ¡Èí¼þ»òÊÇ¿âµÄÔ´Â룬ÒòΪËûÃǸù±¾Ã»ÓвÉÓÃÔ´Âë·¢Ðеķ½Ê½¡£ÄÇÕâÑùÎÒÃÇÊÇ·ñ¾ÍÒ»³ïĪչÁËÄØ?ͨ¹ýÔĶÁÕâÆªÎÄÕ£¬ÎÒ»á¸æËßÄã×îÁ÷Ðеġ°API¹³×Ó¡±·½·¨ÊÇʲô£¬²¢ÇÒ»áÒÔÂÔ΢²»Í¬µÄ·½Ê½Õ¹ÏÖ¸ø´ó¼Ò¡£
API¹³×Ó
ÕýÈçÉÏÎÄÎÒÃÇÒѾÌáµ½µÄ£¬½Ù³ÖDLL×îÁ÷Ðеķ½·¨±»³Æ×÷¡°API¹³×Ó¡±¡ª¡ªÒ»ÖÖ½«¿âº¯Êýµ÷ÓÃÖØ¶¨Ïòµ½ÄãµÄ´úÂëµÄ¼¼Êõ¡£×îΪÁ÷ÐеÄAPI¹³×Ó¿â·Ç΢ÈíµÄ
Microsoft Detours (³£ÓÃÓÚÓÎÏ·ÆÆ½â)ĪÊô£¬²¢ÇÒÕâ¸öÉÌÒµ¿â±»´òÉϵļÛÖµ±êÇ©ÒѾ¸ß´ï9999.95ÃÀÔª(Ô¼68999ÔªÈËÃñ±Ò)¡£ÔÙ¾ÙÒ»¸öÀý×Ó£¬ÔÚDephiÓïÑÔÖÐÓÐÒ»¸ö¿â½Ð×ö
madCodeHook£¬ËûµÄÉÌÒµ¼ÛֵԼΪ349Å·Ôª(Ô¼2564ÔªÈËÃñ±Ò)¡£
ÏÂÃæ¾ÍÈÃÎÒÃÇÀ´¿´Ò»¿´API¹³×ӵľßÌåʵÏÖÔÀí¡£
¶ÔÓÚÒѾ¼ÓÔØµÄDLL¿â¼°¶ÔÓ¦º¯Êý£¬Í¨¹ýÔÚÏëÒª¹³È¡µÄº¯ÊýÍ·²¿Ê××Ö½Ú´òÉÏÒ»¸ö²¹¶¡(Ò²½ÐÖØÐ´£¬¸öÈËÈÏΪ½Ð¸²¸Ç×îΪÌùÇÐ)£¬²¹¶¡ÄÚÈÝΪһ¸öJMPÖ¸ÁÏñÊÇ
JMP NEAR ÕâÑùµÄÐÎʽ£¬×ª»»³É16½øÖƾÍÊÇ E9 xx xx xx xx¡£ÈçÏÂͼËùʾ£º

ͼ1£º±»¹³È¡µÄº¯ÊýǰºóÄÚÈÝʾÒâ µ±¿ØÖÆÈ¨±»´«µÝµ½ÎÒÃǹ³È¡¹ýµÄº¯Êýºó£¬Í¨³£Õâʱ¾Í¿ÉÒÔÖ´ÐÐÎÒÃÇ×Ô¼ºÏëÒªÖ´ÐеĴúÂëÁË£¬Ö´ÐÐÍê±ÏºóÓÖ»á½Ó×ÅÔËÐÐÔº¯ÊýÈ»ºó·µ»Øµ½Ö®Ç°´ÓDLL¿âÖе÷Óøú¯ÊýµÄ´úÂëλÖá£
API¹³×ÓÆäʵ»áµ¼ÖÂһЩÎÊÌ⣬¶øÎÊÌâµÄÀ´Ô´¾ÍÔÚÓÚ±àÒë¹ýµÄÈí¼þ½á¹¹ºÍËü±¾ÉíµÄ´úÂë½á¹¹¡£µ±ÎÒÃÇÏëҪͨ¹ý¹³×Ó±¾ÉíÀ´µ÷ÓÃÔº¯ÊýµÄʱºò(ͨ³£²»¼Ó´¦ÀíÇé¿öÏ»ᵼÖÂÒ»¸öËÀÑ»·)£¬ÎÒÃDZØÐëÒª´´½¨Ò»¸öÌØÊâµÄ´úÂëÇø¿éÀ´µ÷ÓÃÔº¯Êý´úÂ룬Õâ¸ö´úÂëÇø¿éÓиö±ð³Æ½Ð×ö¡°±Ä´²¡±(¸öÈ˾õµÃÔÚ¹úÄÚ¸ü³£±»³ÆÎªÌø°å)£¬ÕâÑùµÄ»°¾Í²»Óùܹ³×Ó±¾ÉíÊÇ·ñÔÚÒªµ÷Óõĺ¯ÊýÌåÄÚÁË
ÁíÍâÐèҪ˵Ã÷µÄÊÇ£¬API¹³×Ó¼¼Êõ²»ÊÇÍòÄܵģ¬ÔÚÊܱ£»¤µÄDLL¿âÖм¸ºõ²»¿ÉÄÜʵÏÖ¡£ËµµÃÏêϸһµã¾ÍÊÇ£¬±ÈÈç´æÔÚCRCУÑé±£»¤µÄʱºò£¬ÎÞÂÛÊÇ´ÓÓ²ÅÌÉÏ»¹ÊÇÄÚ´æÖжԿâDLL¿â´úÂëµÄÐ޸ͼÊDz»¿ÉÐеġ£
»¹ÓÐÒ»µã¾ÍÊÇ£¬¾µäµÄAPI¹³×ÓÒ²²»ÊÊÓÃÓÚDLL¿âµ¼³öµÄ¡°Î±º¯Êý¡±£¬ÕâÀïµÄαº¯ÊýÊÇÖ¸µ¼³öµÄ±äÁ¿¡¢ÀàÖ¸ÕëµÈµÈ¡£ÒòΪÔÚÕâÖÖÀàÐ͵ġ°º¯Êý¡±Ìõ¼þÏÂÎÒÃǸù±¾²»¿ÉÄÜÔÚÔº¯ÊýºÍÎÒÃǵĴúÂëÖ®¼ä½¨Á¢Ò»¸ö¾µäµÄ´úÂë¹³×Ó(ÊÂʵÉϸù±¾¾ÍûÓк¯Êý¿É¹³È¡)¡£ÄÇÊDz»ÊǾÍÎÞ¿ÉÄκÎÁËÄØ?ÉÏÃæÎÒÃÇÌáµ½µÄ·½·¨ÊǸÄдԺ¯Êý´úÂ룬¶øÏÂÃæÒª½éÉܵĵڶþÖÖ³£¼û·½·¨¾ÍÊÇÐÞ¸ÄPEµ¼³ö±í¡£Ö»²»¹ýÕâÖÖ·½·¨µÄ¾ÖÏÞÐԺܴó£¬Ô¶²»ÈçǰһÖÖÁ÷ÐУ¬¶øÇÒÖ»ÓкÜÉÙµÄÒ»²¿·Ö¹³×Ó¿âÖ§³ÖËü¡£
DLLת·¢
Ò»ÖÖ¸ü¼ÓÓд´Ò⵫ÊÇÒ²¸üΪÂé·³µÄAPI¹³È¡·½Ê½½Ð×ö¡°DLL¡±×ª·¢£¬Ëüͨ¹ýWindowsµÄÄÚ²¿»úÖÆÀ´ÊµÏÖ£¬»ù±¾ÔÀí¾ÍÊÇת·¢DLLµ÷ÓÃÖÁÆäËûÄ£¿é¡£
DLLת·¢¼¼Êõ»ùÓÚ¡°Ìæ»»±í¡°À´ÊµÏÖ£¬ËùÒÔÒ²±»³ÆÎª¡°DLL´úÀí¡±£¬Ëü¿ÉÒÔµ¼³öËùÓеÄÔʼ¿âº¯Êý£¬Ò²¿ÉÒÔ´«µÝËùÓжԿ⺯ÊýµÄµ÷Ó᪡ª³ýÁËÎÒÃÇÏëÒª¹³È¡µÄÄDz¿·Öº¯Êý¡£¶øº¯Êýµ÷ÓÃÊDZ»Í¨¹ýһЩÏÊΪÈËÖªµÄWindows»úÖÆ´«µÝ¸øÔº¯Êý¿âµÄ£¬ÕâÑùÎÒÃǾͿÉÒÔ½è´ËÀ´µ÷ÓÃÆäËû¿âº¯Êý£¬×°×÷ËûÃDZ¾À´¾ÍÊÇ´æ´¢ÔÚÎÒÃÇʹÓõÄAPI¹³×Ó¿âÀïÒ»Ñù£¬µ«ÊÂʵÉÏÕâЩ´úÂë±»´æ´¢ÔÚÆäËûµÄ¿âÖС£ÅªÃ÷°×ÒÔÉÏÕâЩ¹ý³Ì£¬ÎÒÃÇÒ²¾Í²»ÄѵÃ֪ΪʲôҪ½Ð×ö¡°DLLת·¢¡±ÁË¡£
º¯Êýµ÷ÓùßÀý º¯Êýµ÷ÓùßÀýÊÇÒ»¸öµÍµÈ¼¶µÄÓÃÓÚ´«µÝº¯Êý²ÎÊýºÍ´¦Àíº¯Êýµ÷Ó÷µ»ØÇ°µÄ¶ÑÕ»µÄ·½Ê½¡£ºÜ´óÒ»²¿·ÖÇé¿öÏÂËüÈ¡¾öÓÚ±àÒëʱµÄÉèÖ㬲¢ÇÒÔÚ´ó¶àÊý¸ß¼¶±à³ÌÓïÑÔÖпÉÒÔÈÎÒâÑ¡Ôñº¯Êýµ÷Óõķ½Ê½£¬ËùÒÔÁ½ÕßÈÎÈ¡ÆäÒ»¾ù¿É¡£ÎªÁËÈÃÎÒÃǵÄAPI¹³×Ó¿âÕý³£ÔËÐУ¬ËüµÄ¹³È¡º¯ÊýÒ²±ØÐëʹÓúÍÒѾ±»¹³È¡µÄº¯ÊýÏàͬµÄµ÷ÓùßÀý¡£ËûÃÇÖ»ÓÐÔÚ¶þ½øÖÆÇé¿öÏÂÏ໥¼æÈݲŲ»»áÒý·¢Ïñ¶ÑÕ»ÆÆ»µÖ®ÀàµÄÒì³£¡£
µ÷ÓùßÀý¸ß¶ÈÒÀÀµÓÚ±àÒëÆ÷µÄĬÈÏÉèÖ㬱ÈÈçDelphiĬÈϲÉÓÃregisterµ÷ÓùßÀý£¬CÓïÑÔĬÈϲÉÓÃcdeclµ÷ÓùßÀý¡£
WinAPIº¯Êý(Windowsϵͳº¯Êý)ĬÈÏʹÓÃstdcallµ÷ÓùßÀý£¬ËùÒÔÔÚµ÷ÓÃ֮ǰ£¬º¯ÊýµÄ²ÎÊý¶¼Ê¹ÓÃpushÖ¸Áî´æ´¢ÔÚÕ»ÖУ¬È»ºócallÖ¸Áî±»Ö´ÐУ¬Ö´ÐÐÍê±Ïºó²¢Ã»ÓбØÒªÈ¥ÐÞÕýÕ»Ö¸ÕëESP£¬ÒòΪÔÚstdcallµ÷ÓùßÀýÖУ¬Õ»ÔÚº¯Êý·µ»ØÇ°ÊÇ×Ô¶¯ÐÞÕýµÄ¡£ÕâÀïÖµµÃÒ»ÌáµÄÊÇ£¬Ò»¸öºÜÓÐȤµÄÏÖÏóÊÇWinAPIÖеÄÓÐЩº¯Êý²¢²»Ê¹ÓÃstdcall¶øÊÇCÓïÑÔµÄcdecl£¬cdecl²¢²»½«²ÎÊý´æ´¢ÓÚÕ»£¬µ«Õ»µÄÐÞÕý»áÔÚµ÷ÓÃÍê³Éºó¸ù¾Ýº¯Êý²ÎÊýµÄÊýÁ¿±»±àÒëÆ÷ÐÞÕý¡£¾ÙÒ»¸öÀý×Ó£¬user32.dllÖеÄÒ»¸öº¯ÊýwsprintfA()(ËüÔÚCº¯Êý¿âÖеĶÔÓ¦ÊÇsprintf())¾Í²ÉÓÃcdecl¹ßÀý£¬ÕâÖÖµ÷Ó÷½Ê½ÊDZ¸ÊÜÍÆ³çµÄ£¬ÒòΪÕâÑù³ýÁ˱àÒëÆ÷Ö®ÍâûÓÐÈËÖªµÀ¾¿¾¹´«µÝÁ˶àÉÙ¸ö²ÎÊý¡£
API¹³×ÓʵÀý
×÷Ϊһ¸öÀý×Ó£¬ÎÒÏëÈÃËü¾¡Á¿¼òµ¥Ò×¶®Ò»µã£¬Ö»»áÓõ½Ò»¸ö²âÊÔ¿âBlackBox.dll£¬ËüÖ»µ¼³öÁ½¸öº¯ÊýSum()ºÍDivide()£¬Ïë±ØÄãÒѾ²Âµ½ÁË£¬µÚÒ»¸öº¯ÊýµÄ×÷ÓÃÊÇÁ½¸öÊýµÄÇóºÍ£¬µÚ¶þ¸öº¯ÊýÊÇÁ½¸öÊýµÄ³ý·¨¡£ÈÃÎÒÃǼÙÉèÎÒÃÇÓµÓÐÒ»¸öÍêÕûµÄ¿âÎĵµ£¬²¢ÇÒÇå³þµØÖªµÀÕâÁ½¸öº¯ÊýʹÓõĵ÷ÓùßÀý(¼ÙÉèÎÒÃÇÓÐÕâ¸ö¿âµÄÍ·Îļþ)£¬¶øÇÒÎÒÃÇ»¹ÖªµÀËüÃǸ÷×Ô¶¼Ê¹ÓÃÄÄЩ²ÎÊý¡£ÔÚÆäËûÇé¿öÏÂÎÒÃÇÐèҪʹÓÃÄæÏò¹¤³ÌÀ´»ñµÃÕâЩµ×²ãÐÅÏ¢
´úÂëÇåµ¥1£º
6// ¸Ãº¯Êý½«Á½¸öÊýÏà¼Ó²¢½«½á¹û´¢´æÓÚResult±äÁ¿ÖÐ // ³É¹¦·µ»ØTRUE£¬Ê§°Ü·µ»ØERROR BOOL __stdcall Sum(int Number1, int Number2, int * Result); // ¸Ãº¯Êý½«Á½¸öÊýÏà³ý²¢½«½á¹û´¢´æÓÚResult±äÁ¿ÖÐ // ³É¹¦·µ»ØTRUE£¬Ê§°Ü·µ»ØERROR BOOL __stdcall Divide(int Number1, int Number2, int * Result); |
ÔÚÎÒÃǵÄÑùÀý¿âÖУ¬Divide()º¯ÊýÊÇÓÐbugµÄ£¬ÒòΪÈç¹û³ý0¾Í»áµ¼Ö³ÌÐò±ÀÀ£(¼ÙÉèÎÒÃǵijÌÐò²¢Ã»ÓÐ×öÒì³£´¦Àí)£¬ÏÖÔÚÎÒÃǵÄÄ¿±ê¾ÍÊÇÀ´ÐÞ²¹Õâ¸ö©¶´¡£
´úÀíDLL
ΪÁËÐÞ²¹BlackBox.dllÖеÄ©¶´£¬ÎÒÃǽÓÏÂÀ´ÐèÒª´´½¨Ò»¸öÖмä¿â£¬Äܹ»Ê¹Divide()º¯ÊýµÃÒÔÓÐЧӦÓöø²»³öÏÖ³ý0Òì³£¡£¸ÃÓ¦ÓòÉÓÃFASM±àÒëÆ÷(²¨À¼µÄmr
Tomasza Grysztar ´´½¨)µÄ32λ»ã±àÆ÷¡£ÔÚÏÂÃæÄã»á¿´µ½´øÓо«È·×¢Ê͵ÄÑùÀý¿âÄ£°å¡£
´úÂëÇåµ¥2£ºÑùÀý¿âµÄ¿ªÍ· ;
------------------------------------------------- ; DLL Êä³öÎļþ¸ñʽ ;------------------------------------------------- format PE GUI 4.0 DLL ; DLL Èë¿Úµãº¯ÊýÃû entry DllEntryPoint ; µ¼ÈëµÄWindowsº¯ÊýºÍ³£Êý include '%fasm%\include\win32a.inc' |
×¢ÒâÔ´´úÂëµÄ¿ªÍ·£¬Äã¿ÉÒÔÔÚÕÒµ½Êä³öÎļþµÄÀàÐÍÉùÃ÷£¬²¢ÇÒÔÚÍ·Îļþ¡¢DLL¿âµÄº¯ÊýÈë¿ÚµãÒ²¿ÉÒÔ·ÅÖÃÕâЩ´úÂë
´úÂëÇåµ¥3£ºÎ´³õʼ»¯µÄÊý¾Ý¶Î ;
------------------------------------------------- ; δ³õʼ»¯µÄÊý¾Ý¶Î ;------------------------------------------------- section '.bss' readable writeable ; uchwyt HMODULE oryginalnej biblioteki hLibOrgdd ? |
¿ÉÖ´ÐÐÎļþºÍDLL¿â±»·Ö¸îΪһ¸ö¸ö¶ÀÁ¢µÄ²¿·Ö£¬ËûÃÇÆäÖÐÖ®Ò»ÊÇδ³õʼ»¯µÄÊý¾Ý¶Î£¬Õⲿ·Ö²¢²»Õ¼ÓÃÓ²Å̵Ŀռ䣬½ö½öÓµ×÷ÓڼǼ³ÌÐòËùʹÓõÄδ³õʼ»¯±äÁ¿µÄÕûÌå´óСÐÅÏ¢¡£¿ÉÖ´ÐÐÎļþµÄ¶ÎÃû³Æ²¢²»ÖØÒª(Ëü±»ÏÞÖÆÎª×î¶àÖ»ÓÐ8¸ö×Ö·û)£¬Í¨³£Ëü»á±»¸³ÒÔ¹«Ë¾ºÏͬµÄÃû³Æ¡£ÔÚÕâ¸ö¶ÎµÄÉùÃ÷Öл¹»á¶¨Òå·ÃÎÊȨÏÞ(Èç¶Á¡¢Ð´¡¢Ö´ÐÐ)£¬µ«ÊÇÔÚFASM±àÒëÆ÷ÏÂ.bss¶ÎµÄÉùÃ÷»¹»áΪ±äÁ¿´´½¨Ò»¸öδ³õʼ»¯µÄ¶Î¡£
´úÂëÇåµ¥4£ºÊý¾Ý¶Î ;
------------------------------------------------- ; ³õʼ»¯µÄÊý¾Ý¶Î ;------------------------------------------------- section '.data' data readable writeable ; Ôʼ¿âµÄÃû³Æ szDllOrgdb 'BlackBox_org.dll',0 |
ÒòΪÔʼ¿âÒѾÓÐÁËÃû³ÆÁË£¬ËùÒÔÕâÀïÎÒÃÇÖØÃüÃûÒ»¸öBlackBox_org.dll(ËüÒÔASCIIÐÎʽ´æ´¢ÓÚÔ´´úÂëÖУ¬ÒÔnull½áÊø)£¬Õâ¸ö¿â»áÔÚºóÃæÓõ½¡£
´úÂëÇåµ¥5£º´øÓÐDLLÈë¿ÚµãµÄ´úÂë¶Î ;
;------------------------------------------------- ; ¿âµÄ´úÂë¶Î ;------------------------------------------------- section '.text' code readable executable ;------------------------------------------------- ; DLL¿âÈë¿Úµã (DllMain) ;------------------------------------------------- proc DllEntryPoint hinstDLL, fdwReason, lpvReserved moveax,[fdwReason] ; DLL library ¼ÓÔØÍê±ÏºóÁ¢¼´´«µÝʼþ cmpeax,DLL_PROCESS_ATTACH je_dll_attach jmp_dll_exit ; ¿âÒѾ¼ÓÔØ _dll_attach: ; »ñµÃÔʼ DLL ¿âµÄ¾ä±ú ; Èç¹ûÏëÒªµ÷ÓÃÔʼº¯Êý¾Í»áʹÓà pushszDllOrg call[GetModuleHandleA] mov[hLibOrg],eax ; ·µ»Ø 1 ˵Ã÷¿â³õʼ»¯³É¹¦ moveax,1 _dll_exit: ret |
´úÂë¶Î°üº¬ËùÓп⺯ÊýºÍDLLÈë¿Úµãº¯Êý¡£ÕâÊÇÒ»¸öÌØÊâµÄº¯Êý£¬ËüÔÚ¿â¼ÓÔØÒÔºó±»Windowsϵͳº¯Êýµ÷ÓᣴúÂë¶ÎÐèÒª±»±ê¼ÇÉÏ¿ÉÖ´Ðеıê¼Ç£¬ÒÔ´ËÀ´¸æËß²Ù×÷ϵͳÕâ¶ÎÄÚ´æÇøÓò°üº¬¿ÉÒÔÖ´ÐеĴúÂë¶Î¡£Èç¹ûûÓÐÕâÑù±ê¼Ç£¬ÄÇôÈκÎÏë´ÓÕâ¿éÄÚ´æÇøÓòÖ´ÐдúÂëµÄÐÐΪ¶¼»áÒÔ´¥·¢CPU´¦ÀíÆ÷µÄDEP(Data
Execution Prevention)ÄÚ´æ±£»¤»úÖÆ¶ø¸æÖÕ¡£ÔÚ³õʼ»¯º¯ÊýÄÚ²¿(DllMain),½ÓÊÕµ½
DLL_PROCESS_ATTACH ʼþºóÎÒÃǽ«Ê¹ÓÃÔʼDLL¿âÃû³ÆÀ´»ñµÃËûµÄ¾ä±ú£¬Ò²¾ÍÊÇ HMODULE
(ÕâÑùÖ®ºó¾Í¿ÉÒÔ±»µ÷ÓÃÁË)¡£
´úÂëÇåµ¥6£º¹ý¶ÈÓÅ»¯±£»¤ ;
µ÷ÓÃÈκÎÔʼ¿â ; BlackBox_org.dll Öеĺ¯Êý, ûÓÐËüFASM±àÒëÆ÷¾Í»á ; ÒÆ³ý¶Ô¿âµÄÒýÓò¢ÇÒ²»»á±»×Ô¶¯¼ÓÔØ calldummy |
ÎÒÃÇ×Ô¶¨ÒåµÄ¿â»áµ÷Óõ½Ôʼ¿â£¬µ«ÊÇÈç¹ûÎÒÃÇÒ»µãÒýÓÃÒ²²»·ÅÔÚÔ´´úÂëÖУ¬FASM±àÒëÆ÷»áÒÆ³ýËùÓжÔËüµÄÒýÓÃ(ÓÅ»¯)¶øÇÒÔʼ¿â²¢²»»á±»×Ô¶¯¼ÓÔØ£¬Õâ¾ÍÊÇΪʲôÔÚretÖ¸ÁîºóÖ±½Ó·ÅÁËÒ»¸öαµ÷ÓõÄÔµ¹Ê(ÕâÑùÔÚÈκÎʱºò¶¼²»»áÖ´ÐÐ)
´úÂëÇåµ¥7£ºÓÐЧµÄDivide()º¯Êý´úÂë ;
------------------------------------------------ ; ÎÒÃÇÐ޸ĺóÄܹ»´¦Àí³ý0´íÎóµÄDivide() º¯Êý ;------------------------------------------------- proc Divide Number1, Number2, Result ; ¼ì²é³ýÊýÊÇ·ñΪ0 ; Èç¹ûÊǵϰ·µ»ØERROR´úÂë movecx,[Number2] testecx,ecx jeDivisionError ; ½«µÚÒ»¸öÊý×ÖÔØÈë EAX ´¦ÀíÆ÷ moveax,[Number1] ;À©Õ¹ EDX ¼Ä´æÆ÷À´´¦ÀíÓзûºÅÊý cdq ; ÏÖÔÚ EDX:EAX ¼Ä´æÆ÷¶Ô¿ÉÒÔ´¦Àí64λÊý¾ÝÁË ; EDX:EAX / ECX ³ý·¨µÄʵÏÖ, ³ý·¨ÔÚEDX:EAX¼Ä´æÆ÷¶Ô ; ÉÏʵÏÖ£¬¾ÍÏñ¶Ô´ý64λÊý¾ÝÒ»Ñù, ³ý·¨µÄ½á¹û±£´æÔÚEAX ; ¼Ä´æÆ÷ÖÐ, ÓàÊý±£´æÔÚEDX ¼Ä´æÆ÷ÖÐ idiv ecx ; ¼ì²éÓÐЧµÄÖ¸Ïò½á¹ûµÄÖ¸Õë ; Èç¹ûûÓмì²âµ½Ôò·µ»Øerror ´úÂë movedx,[Result] testedx,edx jeDivisionError ; ÔÚÊܱ£»¤µÄµØÖ·´æ´¢³ý·¨µÄ½á¹û mov[edx],eax ; ÒÔ exit code TRUE (1) ·µ»Ø moveax,1 jmpDivisionExit ; ³ý·¨´íÎ󣬷µ»ØFALSE (0) DivisionError: sub eax,eax DivisionExit: ; ´Ó³ý·¨º¯ÊýÖзµ»Ø ; ²¼¶ûÐ͵Äexit ´úÂë±»ÉèÖÃÔÚ EAX ¼Ä´æÆ÷ÖÐ ret endp |
Ð޸ĺóµÄDivide()º¯ÊýµÄʵÏÖÔöÌíÁ˶Գý0´íÎóµÄУÑ飬º¯ÊýÓöµ½´íÎó»á·µ»Ø´íÎó´úÂëFALSE£¬ÁíÍ⻹¶îÍâ×öÁ˶ÔÖ¸Ïò½á¹û±äÁ¿resultµÄÖ¸Õë·Ç¿Õ¼ì²é£¬Èç¹ûÖ¸ÕëÖ¸ÏònullÒ²»á±¨´í¡£ÁíÍâÇë×¢Ò⣬Ð޸ĺóµÄº¯ÊýµÄµ÷ÓùßÀýÓëÔº¯ÊýÊÇÍêȫһֵ쬲¢ÇÒÔÚÎÒÃǵÄÕâ¸öÀý×ÓÖÐʹÓõÄÊÇstdcall¹ßÀý£¬ËùÒÔº¯Êý²ÎÊý±»´«µÝµ½Õ»ÖУ¬º¯Êý·µ»ØÖµ´¢´æÓÚEAX¼Ä´æÆ÷£¬Õ»Ö¸ÕëÒ²±»FASM±àÒëÆ÷×Ô¶¯ÐÞ¸´£¬·½·¨ÊǸù¾ÝÔ´´úÂëÖеÄretÉùÃ÷Éú³Éret
(number_of_parameters * 4)Ö¸Áî
´úÂëÇåµ¥8£º¿âµÄµ¼Èë±í ;
------------------------------------------------ ; ÎÒÃǵĿâʹÓõĺ¯Êý¶Î ;------------------------------------------------- section '.idata' import data readable writeable ; ÔÚ´úÂëÖÐÓõ½µÄ¿âµÄÁбí library kernel,'KERNEL32.DLL',\ blackbox, 'BlackBox_org.dll' ; KERNEL32.dll¿âµÄº¯ÊýÁбí importkernel,\ GetModuleHandleA, 'GetModuleHandleA' ; ÉùÃ÷ÁËÔʼ¿âµÄÓÃ; ; DLL ¿â»á±»×Ô¶¯¼ÓÔØ importblackbox,\ dummy, 'Divide' |
FASM±àÒëÆ÷ÔÊÐíÎÒÃÇÊÖ¶¯µØ¶¨ÒåÎÒÃÇ×Ô¼ºµÄ¿âµ÷Óõ½µÄ¿âºÍº¯Êý£¬³ýÁ˱ê׼ϵͳ¿â£¬ÎÒÃÇÐèÒªÔÚÕâÀïÌí¼ÓÒ»¸ö¶Ô
BlackBox.dll µÄÒýÓ᣶à¿÷ÓÚ´Ë£¬µ±Windows¼ÓÔØÎÒÃǵĹ³×Ó¿âµÄͬʱҲ»á¸ù¾ÝµØÖ·¿Õ¼ä¼ÓÔØÔʼ¿â£¬´Ó¶øÎÞÐèÔÙÊÖ¶¯µ÷ÓÃ
LoadLibraryA() º¯ÊýÀ´¼ÓÔØËü¡£ ÔÚijЩÇé¿öÏÂÏëҪʹÓõ¼Èë±íÀ´¼ÓÔØ¿âÉõÖÁÊÇÇ¿ÖÆÐÔÒªÇóʹÓà LoadLibraryA()
µÄ£¬ËüÐèҪʹÓöàÏß³ÌÓ¦ÓóÌÐòÖÐTLS(Thread Local Storage)»úÖÆµÄ¶¯Ì¬Á´½Ó¿âÀ´Ö§³Ö¡£
´úÂëÇåµ¥9£ºº¯Êýµ¼³ö±í ;
------------------------------------------------ ; µ¼³ö±í¶Î°üº¬ÎÒÃǵĿâÖе¼³öµÄº¯Êý ; ÕâÀïÎÒÃÇÒ²ÐíÒªÉùÃ÷Ôʼ¿âÖÐÉùÃ÷µÄº¯Êý ;------------------------------------------------- section '.edata' export data readable ; µ¼³öº¯ÊýÁÐ±í¼°ÆäÖ¸Õë export'BlackBox.dll',\ Sum, 'Sum',\ Divide, 'Divide' ; ת·¢±íÃû³Æ, Ê×ÏÈÄ¿µÄ¿â±»´æ´¢ (ÎÞÐè.DLLÀ©Õ¹) ; È»ºó×îÖյĺ¯ÊýÃû³Æ±»´æ´¢ Sum db 'BlackBox_org.Sum',0 |
ÔÚÕâ¸ö¶ÎÖÐÎÒÃDZØÐëÉùÃ÷Ôʼ¿âÖеÄËùÓк¯Êý£¬¶øÇÒÎÒÃÇÏëÒª¹³È¡µÄº¯Êý±ØÐëÔÚ´úÂëÖеÃÒÔÓ¦Óã¬ÏëÒª´«µÝ¸øÔʼ¿âµÄº¯Êý´æ´¢ÔÚÒ»¸öÌØÊâµÄÎı¾¸ñʽÖУº
DestinationDllLibrary.FunctionName
»ò
DestinationDllLibrar y.#1
ÒÔ´ËÀ´Ë³Ðòµ¼È뺯Êý¶ø·Ç°´ÕÕÃû³ÆµÄ˳Ðò¡£¸Ã»úÖÆµÄËùÓÐÄÚ²¿¹¤×÷¾ù½»ÓÉWindowsϵͳ×ÔÉí´¦Àí¡£
ÒÔÉÏΪDLLת·¢¡£
´úÂëÇåµ¥10£ºÖض¨Î»²¿·Ö ;
------------------------------------------------- ; ÖØ¶¨Î»²¿·Ö ;------------------------------------------------- section '.reloc' fixups data discardable |
ÎÒÃǵĿâÖÐ×îºóÒ»¸ö¶ÎÊÇÖØ¶¨Î»¶Î£¬Ëü±£Ö¤ÁËÎÒÃǵĿâÄܹ»Õý³£ÔËÐС£ÕâÊÇÒòΪ¶¯Ì¬Á´½Ó¿â±»¼ÓÔØµÄ»ùµØÖ·ÊǷdz£¶à±äµÄ£¬¶øÒýÆðÕâ¸ö¶à±äÐÔµÄÔÒòÔÚÓÚÖ¸ÕëʹÓõľø¶ÔµØÖ·ºÍ»ã±àÆ÷µÄÖ¸ÁîʹÓõľø¶ÔµØÖ·±ØÐë¸ù¾Ýµ±Ç°ÄÚ´æÖеĻùµØÖ·×ö³ö¸üУ¬¶øÕâ¸ö»ùµØÖ·µÄÐÅÏ¢ÕýÊÇÓɱàÒëÆ÷ÔÚÖØ¶¨Î»¶ÎÖÐÉú³ÉµÄ¡£
×ܽá
ÕâÆªAPI¹³×Ó½éÉܵķ½·¨¿ÉÒÔ±»³É¹¦Ó¦ÓÃÓÚ¸÷ÖÖʹÓö¯Ì¬Á´½Ó¿âµÄ³¡ºÏ£¬½Ï´«Í³µÄ¾µäAPI¹³×Ó·½·¨¶øÑÔ¸÷ÓÐÀû±×£¬µ«ÊÇÔÚÎÒ¿´À´±¾Îĵķ½·¨ÎªÊµ¼ù´ò¿ªÁ˸ü´óµÄÍØÕ¹¿Õ¼ä£¬²¢ÌṩÁËÒ»ÖÖ¸ü¼Ó¼òµ¥µÄ¸Ä±äÈí¼þÍêÕû¹¦ÄÜÐԵķ½·¨¡£¸Ã·½·¨Í¬Ñù¿ÉÒÔÔڸ߼¶ÓïÑÔÖÐÒÔÊʵ±µÄµ¼³öº¯Êý¶¨ÒåÎļþ(DEF)µÄ·½Ê½ÊµÏÖ¡£ |