²é¿´: 272  |  »Ø¸´: 1
µ±Ç°Ö÷ÌâÒѾ­´æµµ¡£

sdlj8051

½ð³æ (ÖøÃûдÊÖ)

[½»Á÷] Óû§²ãÏÂÀ¹½ØÏµÍ³apiµÄÔ­ÀíÓëʵÏÖ

À¹½ØapiµÄ¼¼ÊõÓкܶàÖÖ£¬´óÌå·ÖΪÓû§²ãºÍÄں˲ãµÄÀ¹½Ø£®ÕâÀïֻ˵˵Óû§²ãµÄÀ¹½Ø£®¶øÓû§²ãÒ²·ÖΪÐí¶àÖÖ£ºÐÞ¸ÄPEÎļþµ¼Èë±í£¬Ö±½ÓÐÞ¸ÄÒªÀ¹½ØµÄapiµÄÄڴ棨´Ó¿ªÊ¼µ½×îºó£¬Ê¹³ÌÐòÌø×ªµ½Ö¸¶¨µÄµØÖ·Ö´ÐУ©£®²»¹ý´ó²¿·ÖÔ­Àí¶¼ÊÇÐ޸ijÌÐòÁ÷³Ì£¬Ê¹Ö®Ìø×ªµ½ÄãÒªÖ´Ðеĵط½£¬È»ºóÔÙ·µ»Øµ½Ô­µØÖ·£®Ô­À´apiµÄ¹¦ÄܱØÐ뻹ÄÜʵÏÖ£®·ñÔòÀ¹½Ø¾Íʧȥ×÷ÓÃÁË£®ÐÞ¸ÄÎļþµ¼Èë±íµÄ·½·¨µÄȱµãÊÇÈç¹ûÓû§³ÌÐò¶¯Ì¬¼ÓÔØ£¨Ê¹ÓÃLoadLibraryºÍGetProcAddressº¯Êý£©£¬À¹½Ø½«±äµÃ¸´ÔÓһЩ£®ËùÒÔÕâÀï½éÉÜһϵڶþÖÖ·½·¨£¬Ö±½ÓÐÞ¸Äapi£¬µ±È»²»ÊÇÈ«¾ÖµÄ£®£¨ºóÃæ»á˵µ½£©

¡¡¡¡ÐèÒªÁ˽âµÄһЩ֪ʶ£º

¡¡¡¡£±£®windowsÄÚ´æµÄ½á¹¹ÊôÐԺͽø³ÌµØÖ·¿Õ¼ä

¡¡¡¡£²£®º¯Êý¶ÑÕ»µÄһЩ֪ʶ

Ò»£ºwin2000ºÍxpµÄÄÚ´æ½á¹¹ºÍ½ø³ÌµØÖ·¿Õ¼ä

    windows²ÉÓÃ4GBƽ̹ÐéÄâµØÖ·¿Õ¼äµÄ×ö·¨¡£¼´Ã¿¸ö½ø³Ìµ¥¶ÀÓµÓÐ4GBµÄµØÖ·¿Õ¼ä¡£Ã¿¸ö½ø³ÌÖ»ÄÜ·ÃÎÊ×Ô¼ºµÄÕâ4GBµÄÐéÄâ¿Õ¼ä£¬¶ø¶ÔÓÚÆäËû½ø³ÌµÄµØÖ·¿Õ¼äÔòÊDz»¿É¼ûµÄ¡£ÕâÑù±£Ö¤Á˽ø³ÌµÄ°²È«ÐÔºÍÎȶ¨ÐÔ¡£µ«ÊÇ£¬Õâ4GBµÄ¿Õ¼äÊÇÒ»¸öÐéÄâ¿Õ¼ä£¬ÔÚʹÓÃ֮ǰ£¬ÎÒÃDZØÐëÏȱ£ÁôÒ»¶ÎÐéÄâµØÖ·£¬È»ºóÔÙΪÕâ¶ÎÐéÄâµØÖ·Ìá½»ÎïÀí´æ´¢Æ÷¡£¿ÉÊÇÎÒÃǵÄÄÚ´æ´ó²¿·Ö¶¼»¹Ã»ÓÐ1GB£¬ÄÇôÕâ4GBµÄµØÖ·¿Õ¼äÊÇÈçºÎʵÏÖµÄÄØ£¿ÊÂʵÉÏwindows²ÉÓõÄÄÚ´æÓ³ÉäÕâÖÖ·½·¨£¬¼´°ÑÎïÀí´ÅÅ̵±×÷ÄÚ´æÀ´Ê¹Ó㬱ÈÈçÎÒÃÇ´ò¿ªÒ»¸ö¿ÉÖ´ÐÐÎļþµÄʱºò£¬²Ù×÷ϵͳ»áΪÎÒÃÇ¿ª±ÙÕâ¸ö4GBµÄµØÖ·¿Õ¼ä£º0x00000000--0xffffffff¡£ÆäÖÐ0x00000000--0x7fffffffÊÇÊôÓÚÓû§²ãµÄ¿Õ¼ä.0x80000000--0xffffffffÔòÊôÓÚ¹²ÏíÄں˷½Ê½·ÖÇø£¬Ö÷ÒªÊDzÙ×÷ϵͳµÄÏ̵߳÷¶È£¬ÄÚ´æ¹ÜÀí£¬Îļþϵͳ֧³Ö£¬ÍøÂçÖ§³ÖºÍËùÓÐÉ豸Çý¶¯³ÌÐò¡£¶ÔÓÚÓû§²ãµÄ½ø³Ì£¬ÕâЩµØÖ·¿Õ¼äÊDz»¿É·ÃÎʵġ£ÈκηÃÎʶ¼½«µ¼ÖÂÒ»¸ö´íÎ󡣿ª±ÙÕâ4GBµÄÐéÄâµØÖ·¿Õ¼äÖ®ºó£¬ÏµÍ³»á°Ñ´ÅÅÌÉϵÄÖ´ÐÐÎļþÓ³Éäµ½½ø³ÌµÄµØÖ·¿Õ¼äÖÐÈ¥(Ò»°ãÊÇÔÚµØÖ·0x00400000£¬¿ÉÒÔͨ¹ýÐ޸ıàÒëÑ¡ÏîÀ´ÐÞ¸ÄÕâ¸öµØÖ·)¶øÒ»¸ö½ø³ÌÔËÐÐËùÐèÒªµÄ¶¯Ì¬¿âÎļþÔòÒ»°ã´Ó0x10000000¿ªÊ¼¼ÓÔØ¡£µ«ÊÇÈç¹ûËùÓеĶ¯Ì¬¿â¶¼¼ÓÔØµ½Õâ¸öλÖÿ϶¨»áÒýÆð³åÍ»¡£Òò´Ë±ØÐë¶ÔһЩ¿ÉÄÜÒýÆð³åÍ»µÄdll±àÒëÊ±ÖØÐÂÐ޸ĻùµØÖ·¡£µ«ÊǶÔÓÚËùÓеIJÙ×÷ϵͳËùÌṩµÄ¶¯Ì¬¿âwindowsÒѾ­¶¨ÒåºÃÁËÓ³ÉäÔÚÖ¸¶¨µÄλÖá£Õâ¸öλÖûáËæ×Ű汾µÄ²»Í¬¶ø»áÓÐËù¸Ä±ä£¬²»¹ý¶ÔÓÚͬһ̨»úÆ÷ÉϵÄÓ³É䵨ַÀ´Ëµ¶¼ÊÇÒ»ÑùµÄ¡£¼´ÔÚa½ø³ÌÀïÓ³ÉäµÄkernel32.dllµÄµØÖ·ºÍÔÚ½ø³ÌbÀïµÄkernel32.dllµÄµØÖ·ÊÇÒ»ÑùµÄ¡£¶ÔÓÚÎļþÓ³ÉäÊÇÒ»ÖÖÌØÊâµÄ·½Ê½£¬Ê¹µÃ³ÌÐò²»ÐèÒª½øÐдÅÅÌi/o¾ÍÄܶԴÅÅÌÎļþ½øÐвÙ×÷£¬¶øÇÒÖ§³Ö¶àÖÖ±£»¤ÊôÐÔ¡£¶ÔÓÚÒ»¸ö±»Ó³ÉäµÄÎļþ£¬Ö÷ÒªÊÇʹÓÃCreateFileMappingº¯Êý£¬ÀûÓÃËûÎÒÃÇ¿ÉÒÔÉ趨һЩ¶ÁдÊôÐÔAGE_READONLY,PAGE_READWRITE,PAGE_WRITECOPY.µÚÒ»²ÎÊýÖ¸¶¨Ö»ÄܶԸÃÓ³ÉäÎļþ½øÐжÁ²Ù×÷¡£ÈκÎд²Ù×÷½«µ¼ÖÂÄÚ´æ·ÃÎÊ´íÎó¡£µÚ¶þ¸ö²ÎÊýÔòÖ¸Ã÷¿ÉÒÔ¶ÔÓ³ÉäÎļþ½øÐжÁд¡£Õâʱºò£¬ÈκζÔÎļþµÄ¶Áд¶¼ÊÇÖ±½Ó²Ù×÷ÎļþµÄ¡£¶ø¶ÔÓÚµÚÈý¸ö²ÎÊýPAGE_WRITECOPY¹ËÃû˼Òå¾ÍÊÇдÈëʱ¿½±´£¬ÈκÎÏòÕâ¶ÎÄÚ´æÐ´ÈëµÄ²Ù×÷(ÒòΪÎļþÊÇÓ³Éäµ½½ø³ÌµØÖ·¿Õ¼äµÄ£¬¶ÔÕâ¶Î¿Õ¼äµÄ¶Áд¾ÍÏ൱ÓÚ¶ÔÎļþ½øÐеÄÖ±½Ó¶Áд)¶¼½«±»ÏµÍ³²¶»ñ£¬²¢ÖØÐÂÔÚÄãµÄÐéÄâµØÖ·¿Õ¼äÖØÐ±£Áô²¢·ÖÅäÒ»¶ÎÄڴ棬ÄãËùдÈëµÄÒ»Çж«Î÷¶¼½«ÔÚÕâÀ¶øÇÒÄãÔ­ÏȵÄÖ¸ÏòÓ³ÉäÎļþµÄÄÚ´æµØÖ·Ò²»áʵ¼ÊÖ¸ÏòÕâ¶ÎÖØÐ·ÖÅäµÄÄڴ棬ÓÚÊÇÔÚ½ø³Ì½áÊøºó£¬Ó³ÉäÎļþÄÚÈݲ¢Ã»Óиı䣬ֻÊÇÔÚÔËÐÐÆÚ¼äÔÚÄǶÎ˽Óп½±´µÄÄÚ´æÀïÃæ´æÔÚ×ÅÄãÐ޸ĵÄÄÚÈÝ¡£windows½ø³ÌÔËÐÐËùÐèÒªÓ³ÉäµÄһЩϵͳdll¾ÍÊÇÒÔÕâÖÖ·½Ê½Ó³ÉäµÄ£¬±ÈÈç³£ÓõÄntdll.dll,kernel32.dll,gdi32.dll.¼¸ºõËùÓеĽø³Ì¶¼»á¼ÓÔØÕâÈý¸ö¶¯Ì¬¿â¡£Èç¹ûÄãÔÚÒ»¸ö½ø³ÌÀïÐÞ¸ÄÕâ¸öÓ³ÉäÎļþµÄÄÚÈÝ£¬²¢²»»áÓ°Ïìµ½ÆäËûµÄ½ø³ÌʹÓÃËûÃÇ¡£ÄãËùÐ޸ĵÄÖ»ÊÇÔÚ±¾½ø³ÌµÄµØÖ·¿Õ¼äÖ®Äڵġ£ÊÂʵÉÏԭʼÎļþ²¢Ã»Óб»¸Ä±ä¡£
ÕâÑù£¬ÔÚºóÃæµÄÐÞ¸ÄϵͳapiµÄʱºò£¬Êµ¼Ê¾ÍÊÇÐÞ¸ÄÕâЩ¶¯Ì¬¿âµØÖ·ÄÚµÄÄÚÈÝ¡£Ç°ÃæËµµ½Õâ²»ÊÇÐÞ¸ÄÈ«¾Öapi¾ÍÊÇÕâ¸öÔ­Òò£¬ÒòΪËûÃǶ¼ÊÇÒÔдÈëʱ¿½±´µÄ·½Ê½À´Ó³ÉäµÄ¡£²»¹ýÕâÒѾ­×ã¹»ÁË£¬windowsÌṩÁË2¸öÇ¿´óµÄÄÚ´æ²Ù×÷º¯ÊýReadProcessMemoryºÍWriteProcessMemory.ÀûÓÃÕâÁ½¸öº¯ÊýÎÒÃǾͿÉÒÔËæ±ã¶ÔÈÎÒâ½ø³ÌµÄÈÎÒâÓû§µØÖ·¿Õ¼ä½øÐжÁдÁË¡£µ«ÊÇ£¬ÏÖÔÚÓÐÒ»¸öÎÊÌ⣬ÎÒÃǸÃдʲô£¬ËµÁ˰ëÌ죬ÔõôʵÏÖÌø×ªÄØ£¿ÏÖÔÚÀ´¿´Ò»¸ö¼òµ¥µÄÀý×Ó£º
MessageBox(NULL, "World", "Hello", 0);
ÎÒÃÇÔÚÖ´ÐÐÕâÌõÓï¾äµÄʱºò£¬µ÷ÓÃÁËϵͳapi MessageBox£¬Êµ¼ÊÉÏÔÚ³ÌÐòÖÐÎÒûÓж¨ÒåUNICODEºê£¬ÏµÍ³µ÷ÓõÄÊÇMessageBoxµÄANSI°æ±¾MessageBoxA,Õâ¸öº¯ÊýÊÇÓÉuser32.dllµ¼³öµÄ¡£ÏÂÃæÊÇÖ´ÐÐÕâÌõÓï¾äµÄ»ã±à´úÂ룺
0040102A   push        0
0040102C   push        offset string "Hello" (0041f024)
00401031   push        offset string "World" (0041f01c)
00401036   push        0
00401038   call        dword ptr [__imp__MessageBoxA@16 (0042428c)]
Ç°ÃæËÄÌõÖ¸Áî·Ö±ðΪ²ÎÊýѹջ£¬ÒòΪMessageBoxAÊÇ__stdcallµ÷ÓÃÔ¼¶¨£¬ËùÒÔ²ÎÊýÊÇ´ÓÓÒÍù×óѹջµÄ¡£×îºóÔÙCALL 0x0042428c

¿´¿´0042428cÕâ¶ÎÄÚ´æµÄÖµ£º
0042428C  0B 05 D5 77 00 00 00
¿ÉÒÔ¿´µ½Õâ¸öÖµ0x77d5050b,ÕýÊÇuser32.dllµ¼³öº¯ÊýMessageBoxAµÄÈë¿ÚµØÖ·¡£

ÕâÊÇ0x77D5050B´¦µÄÄÚÈÝ£¬  
77D5050B 8B FF                mov         edi,edi
77D5050D 55                   push        ebp
77D5050E 8B EC                mov         ebp,esp
ÀíÂÛÉÏÖ»Òª¸Ä±äapiÈë¿ÚºÍ³ö¿ÚµÄÈκλúÆ÷Â룬¶¼¿ÉÒÔÀ¹½Ø¸Ãapi¡£ÕâÀïÎÒÑ¡Ôñ×î¼òµ¥µÄÐ޸ķ½·¨£¬Ö±½ÓÐÞ¸ÄqpiÈë¿ÚµÄǰʮ¸ö×Ö½ÚÀ´ÊµÏÖÌø×ª¡£ÎªÊ²Ã´ÊÇÊ®×Ö½ÚÄØ£¿ÆäʵÐ޸ĶàÉÙ×Ö½Ú¶¼Ã»ÓйØÏµ£¬Ö»ÒªÊµÏÖÁ˺¯ÊýµÄÌø×ªÖ®ºó£¬ÄãÄܰÑËûÃǻָ´²¢ÈÃËû¼ÌÐøÔËÐвÅÊÇ×îÖØÒªµÄ¡£ÔÚCPUµÄÖ¸ÁîÀÓм¸ÌõÖ¸Áî¿ÉÒԸıä³ÌÐòµÄÁ÷³Ì£ºJMP£¬CALL£¬INT£¬RET£¬RETF£¬IRETµÈÖ¸Áî¡£ÕâÀïÎÒÑ¡ÔñCALLÖ¸ÁÒòΪËûÊÇÒÔº¯Êýµ÷Óõķ½Ê½À´ÊµÏÖÌø×ªµÄ£¬ÕâÑù¿ÉÒÔ´øÒ»Ð©ÄãÐèÒªµÄ²ÎÊý¡£µ½ÕâÀÎÒ¸Ã˵˵º¯ÊýµÄ¶ÑÕ»ÁË¡£

×ܽ᣺windows½ø³ÌËùÐèÒªµÄ¶¯Ì¬¿âÎļþ¶¼ÊÇÒÔдÈëʱ¿½±´µÄ·½Ê½Ó³Éäµ½½ø³ÌµØÖ·¿Õ¼äÖеġ£ÕâÑù£¬ÎÒÃÇÖ»ÄÜÀ¹½ØÖ¸¶¨µÄ½ø³Ì¡£ÐÞ¸ÄÄ¿±ê½ø³ÌµØÖ·¿Õ¼äÖеÄÖ¸¶¨apiµÄÈë¿ÚºÍ³ö¿ÚµØÖ·Ö®¼äµÄÈÎÒâÊý¾Ý£¬Ê¹Ö®Ìø×ªµ½ÎÒÃǵÄÀ¹½Ø´úÂëÖÐÈ¥£¬È»ºóÔÙ»Ö¸´ÕâЩ×Ö½Ú£¬Ê¹Ö®ÄÜ˳Àû¹¤×÷¡£



¶þ£ºº¯Êý¶ÑÕ»µÄһЩ֪ʶ

    ÕýÈçÇ°ÃæËù¿´µ½MessageBoxAº¯ÊýÖ´ÐÐ֮ǰµÄ»ã±à´úÂ룬Ê×ÏȽ«Ëĸö²ÎÊýѹջ£¬È»ºóCALL MessageBoxA£¬ÕâʱºòÎÒÃǵÄÏ̶߳ÑÕ»¿´ÆðÀ´Ó¦¸ÃÊÇÕâÑùµÄ£º

|     |    <---ESP
|·µ»ØµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|..   |

ÎÒÃÇÔÙ¿´MessageBoxAµÄ»ã±à´úÂ룬
77D5050B 8B FF                mov         edi,edi
77D5050D 55                   push        ebp
77D5050E 8B EC                mov         ebp,esp
×¢Òâµ½¶ÑÕ»µÄ²Ù×÷ÓÐPUSH ebp,ÕâÊDZ£´æµ±Ç°µÄ»ùÖ·Ö¸Õ룬ÒÔ±ãÒ»»á¶ù»Ö¸´¶ÑÕ»ºó·µ»Øµ÷ÓÃÏß³ÌʱʹÓã¬È»ºóÔÙÓÐmov ebp,esp¾ÍÊǰѵ±Ç°espµÄÖµ¸³¸øebp£¬ÕâʱºòÎÒÃǾͿÉÒÔʹÓà ebp+Æ«ÒÆ À´±íʾ¶ÑÕ»ÖеÄÊý¾Ý£¬±ÈÈç²ÎÊý1¾Í¿ÉÒÔ±íʾ³É[ebp+8]£¬·µ»ØµØÖ·¾Í¿ÉÒÔ±íʾ³É[ebp+4]..Èç¹ûÎÒÃÇÔÚÀ¹½ØµÄʱºòÒª¶ÔÕâЩ²ÎÊýºÍ·µ»ØµØÖ·×öÈκδ¦Àí£¬¾Í¿ÉÒÔʹÓÃÕâÖÖ·½·¨¡£Èç¹ûÕâ¸öʱºòº¯ÊýÓоֲ¿±äÁ¿µÄ»°£¬¾Íͨ¹ý¼õСESPµÄÖµµÄ·½Ê½À´ÎªÖ®·ÖÅä¿Õ¼ä¡£½ÓÏÂÀ´¾ÍÊDZ£´æÒ»Ð©¼Ä´æÆ÷£ºEDI,ESI,EBX.ҪעÒâµÄÊÇ£¬º¯Êý¶ÑÕ»ÊÇ·´·½ÏòÉú³¤µÄ¡£Õâʱºò¶ÑÕ»µÄÑù×Ó£º
|....|
|EDI|  <---ESP
|ESI|
|EBX|
|¾Ö²¿±äÁ¿|
|EBP     |   
|·µ»ØµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|..   |

ÔÚº¯Êý·µ»ØµÄʱºò£¬Óɺ¯Êý×ÔÉíÀ´½øÐжÑÕ»µÄÇåÀí£¬ÕâʱºòÇåÀíµÄ˳ÐòºÍ¿ªÊ¼ÈëÕ»µÄ˳ÐòǡǡÏà·´£¬ÀàËÆµÄ»ã±à´úÂë¿ÉÄÜÊÇÕâÑùµÄ£º

pop edi
pop esi
pop ebx
add esp, 4
pop ebp
ret 0010
ÏȻָ´ÄÇЩ¼Ä´æÆ÷µÄÖµ£¬È»ºóͨ¹ýÔö¼ÓESPµÄÖµµÄ·½Ê½À´Êͷžֲ¿±äÁ¿¡£ÕâÀï¿ÉÒÔÓÃmov esp, ebpÀ´ÊµÏÖÇå¿ÕËùÓоֲ¿±äÁ¿ºÍÆäËûһЩ¿ÕÏзÖÅä¿Õ¼ä¡£½Óן¯Êý»á»Ö¸´EBPµÄÖµ£¬ÀûÓÃÖ¸ÁîPOP EBPÀ´»Ö¸´¸Ã¼Ä´æÆ÷µÄÖµ¡£½Óן¯ÊýÔËÐÐret 0010Õâ¸öÖ¸Áî¡£¸ÃÖ¸ÁîµÄÒâ˼ÊÇ£¬º¯Êý°Ñ¿ØÖÆÈ¨½»¸øµ±Ç°Õ»¶¥µÄµØÖ·µÄÖ¸ÁͬʱÇåÀí¶ÑÕ»µÄ16×ֽڵIJÎÊý¡£Èç¹ûº¯ÊýÓзµ»ØÖµµÄ»°£¬ÄÇÔÚEAX¼Ä´æÆ÷Öб£´æ×ŵ±Ç°º¯ÊýµÄ·µ»ØÖµ¡£Èç¹ûÊÇ__cdeclµ÷Ó÷½Ê½£¬ÔòÖ´ÐÐretÖ¸Á¶ÔÓÚ¶ÑÕ»²ÎÊýµÄ´¦Àí½»¸øµ÷ÓÃÏß³ÌÈ¥×ö¡£Èçwsprintfº¯Êý¡£

Õâ¸öʱºò¶ÑÕ»ÓÖ»Ö¸´ÁËÔ­À´µÄÑù×Ó¡£Ï̵߳ÃÒÔ¼ÌÐøÍùÏÂÖ´ÐÐ...
ÔÚÀ¹½ØapiµÄ¹ý³ÌÖ®ÖÐÒ»¸öÖØÒªµÄÈÎÎñ¾ÍÊDZ£Ö¤¶ÑÕ»µÄÕýÈ·ÐÔ¡£ÄãÒªÀíÇåÿһ²½¶ÑÕ»Öз¢ÉúÁËʲô¡£


Èý£ºÐγÉ˼·
   
    ºÇºÇ£¬²»ÖªµÀÄãÏÖÔÚÄÔº£ÊDz»ÊÇÓÐʲôÏë·¨¡£ÔõôȥʵÏÖÀ¹½ØÒ»¸öapi£¿
    ÕâÀï¸ø³öÒ»¸ö˼·£¬ÊÂʵÉÏÀ¹½ØµÄ·½·¨ÕæµÄºÜ¶à£¬ÀíÇåÁËÒ»¸ö£¬ÆäËûµÄÒ²¾ÍÈÝÒ×ÁË¡£¶øÇÒÉÏÃæËù˵µÄ2¸ö¹Ø¼ü֪ʶ£¬Ò²¿ÉÒÔÒÔÁíÍâµÄÐÎʽÀ´ÀûÓá£
    ÎÒÒÔÀ¹½ØCreateFileÕâ¸öapiΪÀý×ÓÀ´¼òµ¥ËµÏÂÕâ¸ö˼·°É£º
   
    Ê×ÏÈ£¬¼ÈÈ»ÎÒÃÇÒªÀ¹½ØÕâ¸öapi¾ÍÓ¦¸ÃÖªµÀÕâ¸öº¯ÊýÔÚÄÚ´æÖеÄλÖðɣ¬ÖÁÉÙÐèÒªÖªµÀ´ÓÄĶùÈë¿Ú¡£CreateFileÕâ¸öº¯ÊýÊÇÓÉkernel32.dllÕâ¸ö¶¯Ì¬¿âµ¼³öµÄ¡£ÎÒÃÇ¿ÉÒÔʹÓÃÏÂÃæµÄ·½·¨À´»ñÈ¡ËûÓ³Éäµ½ÄÚ´æÖеĵØÖ·£º
    HMODULE hkernel32 = LoadLibrary("Kernel32.dll";
    PVOID dwCreateFile = GetProcAddress(hkernei32, "CreateFileA";
Õâ¾Í¿ÉÒԵõ½createfileµÄµØÖ·ÁË£¬×¢ÒâÕâÀïÊÇ»ñÈ¡µÄcreatefileµÄansic°æ±¾¡£¶ÔÓÚUNICODE°æ±¾µÄÔò»ñÈ¡CreateFileW¡£ÕâʱdwCreateFileµÄÖµ¾ÍÊÇËûµÄµØÖ·ÁË¡£¶ÔÓÚÆäËû½ø³ÌÖеÄcreatefileº¯ÊýÒ²ÊÇÕâ¸öµØÖ·£¬Ç°ÃæËµ¹ýwindowsÖ¸¶¨ÁËËûÌṩµÄËùÓеÄdllÎļþµÄ¼ÓÔØµØÖ·¡£
   
    ½ÓÏÂÀ´£¬ÎÒÃǸÃÏë°ì·¨ÊµÏÖÌø×ªÁË¡£×î¼òµ¥µÄ·½·¨¾ÍÊÇÐÞ¸ÄÕâ¸öapiÈë¿Ú´¦µÄ´úÂëÁË¡£µ«ÊÇÎÒÃǸÃÐ޸ĶàÉÙÄØ£¿Ð޸ĵÄÄÚÈÝÎªÊ²Ã´ÄØ£¿Ç°ÃæËµ¹ýÎÒÃÇ¿ÉÒÔʹÓÃCALLµÄ·½Ê½À´ÊµÏÖÌø×ª£¬ÕâÖÖ·½·¨µÄºÃ´¦ÊÇ¿ÉÒÔΪÄãµÄÀ¹½Øº¯ÊýÌṩһ¸ö»òÕß¶à¸ö²ÎÊý¡£ÕâÀïÖ»ÒªÒ»¸ö²ÎÊý¾Í×ã¹»ÁË¡£´ø²ÎÊýµÄº¯Êýµ÷ÓõĻã±à´úÂëÊÇʲôÑù×ÓÄØ£¬Ç°ÃæÒ²ÒѾ­ËµÁË£¬ÀàËÆÓëµ÷ÓÃMessageBoxAʱµÄ´úÂ룺

PUSH  ²ÎÊýµØÖ·
CALL  º¯ÊýÈë¿ÚµØÖ·(ÕâÀïΪһ¸öÆ«ÒÆµØÖ·)

Ö´ÐÐÕâ2ÌõÖ¸Áî¾ÍÄÜÌø×ªµ½ÄãÒªÀ¹½ØµÄº¯ÊýÁË£¬µ«ÊÇÎÒÃǸÃÐ޸ijÉÊ²Ã´ÄØ¡£Ê×ÏÈ£¬ÎÒÃÇÐèÒªÖªµÀÕâ2ÌõÖ¸ÁîµÄ³¤¶ÈºÍ¾ßÌåµÄ»úÆ÷´úÂëµÄÖµ¡£ÆäÖÐPUSH¶ÔÓ¦0x68£¬¶øCALLÖ¸Áî¶ÔÓ¦µÄ»úÆ÷ÂëΪ0xE8,¶øºóÃæµÄÔò·Ö±ð¶ÔÓ¦À¹½Øº¯ÊýµÄ²ÎÊýµØÖ·ºÍº¯ÊýµÄµØÖ·¡£×¢ÒâµÚÒ»¸öÊÇÒ»¸öÖ±½ÓµÄµØÖ·£¬¶øµÚ¶þ¸öÔòÊÇÒ»¸öÏà¶ÔµØÖ·¡£µ±È»ÄãÒ²¿ÉÒÔʹÓÃ0xFF0x15Õâ¸öCALLÖ¸ÁîÀ´½øÐÐÖ±½ÓµØÖ·µÄÌø×ª¡£
ÏÂÃæ¾ÍÊǼÆËãÕâ2¸öµØÖ·µÄÖµÁË£¬
¶ÔÓÚ²ÎÊýºÍº¯ÊýÌåµÄµØÖ·£¬Òª·ÖÇé¿ö¶ø¶¨£¬¶ÔÓÚ¶Ô±¾½ø³ÌÖÐapiµÄÀ¹½Ø£¬ÔòÖ±½ÓÈ¡µØÖ·¾Í¿ÉÒÔÁË¡£¶ÔÓÚ²ÎÊý£¬¿ÉÒÔÏȶ¨ÒåÒ»¸ö²ÎÊý±äÁ¿£¬È»ºóÈ¡±äÁ¿µØÖ·¾ÍokÁË¡£
Èç¹ûÊÇÏëÀ¹½ØÆäËû½ø³ÌÖеÄapi£¬Ôò±ØÐëʹÓÃÆäËûһЩ·½·¨£¬×îµäÐ͵ķ½·¨ÊÇÀûÓÃVirtualAllocExº¯ÊýÀ´ÔÚÆäËû½ø³ÌÖÐÉêÇëºÍÌá½»ÄÚ´æ¿Õ¼ä¡£È»ºóÓÃWriteProcessMemoryÀ´·Ö±ð°Ñº¯ÊýÌåºÍ²ÎÊý·Ö±ðдÈëÉêÇëºÍ·ÖÅäµÄÄÚ´æ¿Õ¼äÖÐÈ¥¡£È»ºóÔÙÉú³ÉÒªÐ޸ĵÄÊý¾Ý£¬×îºóÓÃWriteProcessMemoryÀ´ÐÞ¸ÄapiÈë¿Ú£¬°ÑÈë¿ÚµÄǰ10×Ö½ÚÐÞ¸ÄΪ¸Õ¸ÕÉú³ÉµÄÌø×ªÊý¾Ý¡£±ÈÈçÔÚÔ¶³Ì½ø³ÌÖÐÄãдÈëµÄ²ÎÊýºÍº¯ÊýÌåµÄÄÚ´æµØÖ··Ö±ðΪ0x00010000ºÍ0x00011000,ÔòÉú³ÉµÄÌø×ªÊý¾ÝΪ 68 00 00 01 00 E8 00 10 01 00(PUSH 00010000  CALL 00011000),ÕâÑù³ÌÐòÔËÐÐcreatefileº¯ÊýµÄʱºò½«»áÏÈÔËÐÐPUSH 00010000  CALL 00011000£¬ÕâÑù¾Í´ïµ½ÁËÌø×ªµÄÄ¿µÄ¡£´Ë¿ÌÎÒÃÇÓ¦¸Ãʱ¿Ì×¢Òâ¶ÑÕ»µÄ״̬£¬¶ÔÓÚCreateFileÓÐ
HANDLE CreateFile(
  LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile
);
¿ÉÒÔ¿´µ½ÆäÓÐ7¸ö²ÎÊý£¬ÓÚÊÇÔÚµ÷ÓÃ֮ǰ£¬¶ÑÕ»Ó¦¸ÃÒѾ­±»Ñ¹ÈëÁËÕâ7¸ö²ÎÊý£¬¶ÑÕ»µÄÑù×Ó£º
|....|    <---ESP
|createfileÖ´ÐкóµÄÏÂÒ»ÌõÖ¸ÁîµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|²ÎÊý5|
|²ÎÊý6|
|²ÎÊý7|
|..|

ÕâÊÇÖ´Ðе½ÎÒÃǵÄÌø×ªÓï¾ä£ºPUSH 00010000,ÓÚÊǶÑÕ»ÓÖ±äÁË£º

|....|    <---ESP
|00010000|
|createfileÖ´ÐкóµÄÏÂÒ»ÌõÖ¸ÁîµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|²ÎÊý5|
|²ÎÊý6|
|²ÎÊý7|
|..|

½Ó×ÅÖ´ÐÐCALL 00011000,¶ÑÕ»±äΪ£º
|...|  <---ESP
|apiÈë¿ÚÖ®ºóµÄµÚÁù¸ö×Ö½ÚµÄÖ¸ÁîµÄµØÖ·|   
|00010000|
|createfileÖ´ÐкóµÄÏÂÒ»ÌõÖ¸ÁîµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|²ÎÊý5|
|²ÎÊý6|
|²ÎÊý7|
|..|

½ÓÏÂÀ´¾Íµ½ÁËÎÒÃǵÄÀ¹½Øº¯ÊýÖÐÀ­£¬µ±È»£¬º¯Êý¿Ï¶¨Ò²»á×öһЩÀàËÆ¶¯×÷£¬°ÑEBPѹջ£¬Îª¾Ö²¿±äÁ¿·ÖÅä¿Õ¼äµÈ¡£Õâʱºò¶ÑÕ»µÄÑù×ÓÓÖ±äÁË£º

|EDI|  <---ESP
|ESI|
|EBX|
|¾Ö²¿±äÁ¿|
|EBP|    <---EBP
|apiÈë¿ÚÖ®ºóµÄµÚÁù¸ö×Ö½ÚµÄÖ¸ÁîµÄµØÖ·|   
|00010000|
|createfileÖ´ÐкóµÄÏÂÒ»ÌõÖ¸ÁîµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|²ÎÊý5|
|²ÎÊý6|
|²ÎÊý7|
|..|

Õâʱºò£¬ÄãÏë×öʲô¾Í¾¡Ç鵨×ö°É£¬»ñÈ¡²ÎÊýÐÅÏ¢£¬ÑÓ»ºÖ´ÐÐCreateFileº¯ÊýµÈµÈ¡£ÄûñÈ¡´ò¿ªÎļþ¾ä±úµÄÃû×ÖÀ´Ëµ°É£¬ÎļþÃûÊǵÚÒ»¸ö²ÎÊý£¬Ç°ÃæËµ¹ýÎÒÃÇ¿ÉÒÔÓÃ[EBP+8]À´»ñÈ¡²ÎÊý£¬µ«ÊǶÔÕÕÉÏÃæµÄ¶ÑÕ»ÐÎ×´£¬ÖмäÓÖ¼ÓÁËÁíÍâһЩÊý¾Ý£¬ËùÒÔÎÒÃÇÓÃ[EBP+16]À´»ñÈ¡µÚÒ»¸ö²ÎÊýµÄµØÖ·¡£±ÈÈ磺
char* PFileName = NULL;
__asm{
MOV EAX,[EBP+16]
MOV [szFileName], EAX
}

±ÈÈçÎÒÃÇÓÃÒ»¸ömessageboxÀ´µ¯³öÒ»¸öÐÅÏ¢£¬ËµÃ÷¸Ã³ÌÐò¼´½«´ò¿ªÒ»¸öijı·¾¶µÄÎļþ¾ä±ú¡£µ«ÊÇÓÐÒ»¸öҪעÒâµÄÊÇ£¬Èç¹ûÄãÏëÀ¹½ØÔ¶³Ì½ø³ÌµÄ»°£¬¶ÔÓÚÄǸöÀ¹½Øº¯ÊýÖÐËùʹÓõ½µÄÈκκ¯Êý»òÕßÒÔÈκÎÐÎʽµÄÏà¶ÔµØÖ·µÄµ÷Óö¼ÒªÍ£Ö¹¡£ÒòΪÿ¸ö½ø³ÌÖеĵØÖ··ÖÅä¶¼ÊǶÀÁ¢µÄ£¬±ÈÈçÉÏÃæµÄCALL MessageBoxA¸Ä³ÉÖ±½ÓµØÖ·µÄµ÷Ó᣶ÔÓÚʹÓÃmessagebox£¬ÎÒÃÇÓ¦¸Ã¶¨ÒåÒ»¸öº¯ÊýÖ¸Õ룬Ȼºó°ÑÕâ¸öÖ¸ÕëµÄÖµ¸³ÖµÎªuser32.dllÖе¼³ö¸Ãº¯ÊýµÄÖ±½ÓµØÖ·¡£È»ºóÀûÓÃÕâ¸öÖ¸ÕëÀ´½øÐк¯Êýµ÷Ó᣶ÔÓÚmessageboxº¯ÊýµÄµ÷ÓÿÉÒÔÕâÑù£¬ÔÚÔ´³ÌÐòÖж¨ÒåÒ»¸ö²ÎÊý½á¹¹Ì壬²ÎÊýÖаüº¬Ò»¸öµ¼³öº¯ÊýµÄµØÖ·,°ÑÕâ¸öµØÖ·ÉèΪMessageBoxAµÄÖ±½ÓµØÖ·£¬»ñÈ¡µØÖ·µÄ·½·¨¾Í²»ËµÁË¡£È»ºó°ÑÕâ¸ö²ÎÊý´«¸øÀ¹½Øº¯Êý£¬¾Í¿ÉÒÔʹÓÃÀ­¡£ÕâÒ²ÊÇÀûÓÃÒ»¸ö²ÎÊýµÄÔ­Òò¡£ÀàËÆ´úÂëÈçÏ£º


typedef struct _RemoteParam {
DWORD dwMessageBox;
} RemoteParam, * PRemoteParam;

typedef int (__stdcall * PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);//¶¨ÒåÒ»¸öº¯ÊýÖ¸Õë

//À¹½Øº¯Êý
void HookCreateFile(LPVOID lParam)
{
RemoteParam* pRP = (RemoteParam*)lParam;//»ñÈ¡²ÎÊýµØÖ·
char* PFileName = NULL;//¶¨ÒåÒ»¸öÖ¸Õë
__asm{
MOV EAX,[EBP+16]
MOV [szFileName], EAX //°ÑCreateFileµÚÒ»¸ö²ÎÊýµÄÖµ£¬ÎļþµÄ·¾¶µÄµØÖ·´«                       //¸øszFileName
}


PFN_MESSAGEBOX pfnMessageBox = (PFN_MESSAGEBOX)pRP->dwMessageBox;//¶¨                                                  //ÒåÒ»¸öº¯ÊýÖ¸Õë
pfnMessageBox(NULL, PFileName, PFileName, MB_ICONINFORMATION |MB_OK);
//Êä³öÒª´ò¿ªµÄÎļþµÄ·¾¶
//.....
}

¶ÔÓÚÄãҪʹÓÃµÄÆäËûº¯Êý£¬¶¼ÊÇʹÓÃͬÑùµÄ·½Ê½£¬ÀûÓÃÕâ¸ö²ÎÊýÀ´´«µÝÎÒÃÇÒª´«µÝµÄº¯ÊýµÄ¾ø¶ÔµØÖ·£¬È»ºó¶¨ÒåÕâ¸öº¯ÊýÖ¸Õ룬¾Í¿ÉÒÔʹÓÃÁË¡£


ºÃÁË£¬½ÓÏÂÀ´ÎÒÃǸÃÈñ»À¹½ØµÄapiÕý³£¹¤×÷ÁË£¬Õâ¸ö²»ÄÑ£¬°ÑËûÔ­À´µÄÊý¾Ý»Ö¸´Ò»Ï¾ͿÉÒÔÁË¡£ÄÇÈë¿ÚµÄ10¸ö×Ö½Ú¡£ÎÒÃÇÔÚ¸ÄдËûÃǵÄʱºòÓ¦¸Ã±£´æÒ»Ï£¬È»ºóÒ²°ÑËû·ÅÔÚ²ÎÊýÖд«µÝ¸øÀ¹½Øº¯Êý£¬ºÇºÇ£¬²ÎÊýµÄ×÷ÓÿɶàÁË¡£½Ó×ÅÎÒÃǾͿÉÒÔÓÃWriteProcessMemoryº¯ÊýÀ´»Ö¸´Õâ¸öapiµÄÈë¿ÚÁË£¬´úÂëÈçÏ£º
PFN_GETCURRENTPROCESS pfnGetCurrentProcess = (PFN_GETCURRENTPROCESS)pRP->dwGetCurrentProcess;
PFN_WRITEPROCESSMEMORY pfnWriteProcessMemory = (PFN_WRITEPROCESSMEMORY)pRP->dwWriteProcessMemory;
if(!pfnWriteProcessMemory(pfnGetCurrentProcess(),
                       (LPVOID)pfnConnect,
           (LPCVOID)pRP->szOldCode,
           10,
           NULL))
  pfnMessageBox(NULL, pRP->szModuleName1, pRP->szModuleName2, MB_ICONINFORMATION | MB_OK);
ÆäÖÐÕâЩº¯ÊýÖ¸ÕëµÄ¶¨ÒåºÍÉÏÃæµÄÀàËÆ¡£
¶ø²ÎÊýÖеÄszoldcodeÔòÊÇÔÚÔ´³ÌÐòÖÐÔÚÐÞ¸Äapi֮ǰ±£´æºÃ£¬È»ºó´«¸øÀ¹½Øº¯Êý£¬ÔÚÔ´³ÌÐòÖÐÊÇÓÃReadProcessMemoryº¯ÊýÀ´»ñÈ¡ËûµÄǰ10¸ö×ֽڵģº
ReadProcessMemory(GetCurrentProcess(),
            (LPCVOID)RParam.dwCreateFile,
            oldcode,
            10,
            &dwPid)
  strcat((char*)RParam.szOldCode, (char*)oldcode);


½ÓÏÂÀ´Èç¹ûÄ㻹¼ÌÐø±£³Ö¶Ô¸ÃapiµÄÀ¹½Ø£¬ÔòÓÖ¸ÃÓÃWriteProcessMemory À´ÐÞ¸ÄÈë¿ÚÁË£¬¸úÇ°ÃæµÄ»Ö¸´Èë¿ÚÊÇÒ»ÑùµÄ£¬Ö»²»¹ý°ÑszOldCode»»³ÉÁËszNewCodeÁ˶øÒÑ¡£ÕâÑùÄãÓÖÄܶÔCreateFile¼ÌÐøÀ¹½ØÁË¡£

ºÃÁË£¬½ÓÏÂÀ´¸Ã½øÐжÑÕ»µÄÇåÀíÁË£¬Ò²ÐíÄ㻹Ҫ×öµãÆäËûÊÂÇ飬¾¡¹Ü×öÈ¥¡£µ«ÊÇÇåÀí¶ÑÕ»ÊDZØÐëÒª×öµÄ£¬ÔÚº¯Êý½áÊøµÄʱºò£¬ÒòΪÔÚÎÒÃÇ·ÅÈÎapi»Ö¸´Ö´ÐÐÖ®ºó£¬ËûÓÖreturn µ½ÎÒÃǵĺ¯ÊýÖÐÀ´ÁË£¬Õâ¸öʱºòµÄ¶ÑÕ»ÊÇʲôÑù×ÓÄØ£¿
|EDI|  <---ESP
|ESI|
|EBX|
|¾Ö²¿±äÁ¿|  
|EBP|    <---EBP
|apiÈë¿ÚÖ®ºóµÄµÚÁù¸ö×Ö½ÚµÄÖ¸ÁîµÄµØÖ·|   
|00010000|
|createfileÖ´ÐкóµÄÏÂÒ»ÌõÖ¸ÁîµØÖ·|
|²ÎÊý1|
|²ÎÊý2|
|²ÎÊý3|
|²ÎÊý4|
|²ÎÊý5|
|²ÎÊý6|
|²ÎÊý7|
|..|

ÎÒÃǵÄÄ¿±êÊǰѷµ»ØÖµ¼Ç¼ÏÂÀ´·Åµ½EAX¼Ä´æÆ÷ÖÐÈ¥£¬°Ñ·µ»ØµØÖ·¼Ç¼ÏÂÀ´£¬Í¬Ê±°Ñ¶ÑÕ»»Ö¸´³ÉÔ­À´µÄÑù×Ó¡£
Ê×ÏÈÎÒÃǻָ´ÄÇЩ¼Ä´æÆ÷µÄÖµ£¬½Ó×ÅÊͷžֲ¿±äÁ¿£¬¿ÉÒÔÓÃmov esp, ebp.ÒòΪÎÒÃDz»Çå³þ¾ßÌåµÄ¾Ö²¿±äÁ¿·ÖÅäÁ˶àÉٿռ䡣ËùÒÔʹÓÃÕâ¸ö·½·¨¡£


__asm
{POP EDI
POP ESI
POP EBX   //»Ö¸´ÄÇЩ¼Ä´æÆ÷
MOV EDX, [NextIpAddr]//°Ñ·µ»ØµØÖ··Åµ½EDXÖУ¬ÒòΪ´ý»á¶ù                  //EBX±»»Ö¸´ºó£¬Ïß³ÌÖеÄËùÓоֲ¿±äÁ¿¾Í²»ÄÜÕý³£Ê¹ÓÃÁË¡£
   
MOV EAX, [RetValue]//·µ»ØÖµ·Åµ½EAXÖУ¬µ±È»Ò²¿ÉÒÔÐÞ¸ÄÕâ¸ö·µ»ØÖµ
MOV ESP, EBP//ÇåÀí¾Ö²¿±äÁ¿
POP EBP//»Ö¸´EBPµÄÖµ
ADD ESP, 28H  //ÇåÀí²ÎÊýºÍ·µ»ØµØÖ·£¬×¢ÒâÒ»¹²(7+1+1+1)*4
PUSH EDX //°Ñ·µ»ØµØÖ·Ñ¹Õ»£¬ÕâÑùÕ»ÖоÍÖ»ÓÐÕâÒ»¸ö·µ»ØµØÖ·ÁË£¬·µ»ØÖ®ºóÕ»          //¾Í¿ÕÁË
RET
}

ÕâÑù£¬Ò»ÇоÍÍê³ÉÁË£¬¶ÑÕ»»Ö¸´ÁËÓ¦¸ÃÓеÄ״̬£¬¶øÄãÏëÀ¹½ØµÄÒ²À¹½Øµ½ÁË¡£
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

sdlj8051

½ð³æ (ÖøÃûдÊÖ)

ËÄ£ººó¼Ç
    À¹½ØµÄ·½Ê½¶àÖÖ¶àÑù£¬²»¹ý´óÌåµÄ˼·ȴ¶¼Ïàͬ¡£ÒªÊ±¿Ì×¢ÒâÄãÒªÀ¹½ØµÄº¯ÊýµÄ¶Ñջ״̬ÒÔ¼°ÔÚÀ¹½Øº¯ÊýÖеĶÔÊý¾ÝµÄÒýÓúͺ¯ÊýµÄµ÷Ó㨵ØÖ·ÎÊÌ⣩¡£

//////////////////////////////////////////////////////////////////////
¸½Â¼£ºÒ»¸öÀ¹½ØCreateFileº¯ÊýµÄ¼òµ¥ÊµÏÖ
//////////////////////////////////////////////////////////////////////
#include
#include
#include

#pragma comment(lib, "psapi.lib")
#pragma comment(lib, "ws2_32.lib")

typedef struct _RemoteParam {
DWORD dwCreateFile;
DWORD dwMessageBox;
DWORD dwGetCurrentProcess;
DWORD dwWriteProcessMemory;
unsigned char szOldCode[10];
DWORD FunAddr;
} RemoteParam, * PRemoteParam;

typedef HANDLE (__stdcall * PFN_CREATEFILE)(LPCTSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
typedef int (__stdcall * PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);
typedef BOOL (__stdcall * PFN_WRITEPROCESSMEMORY)(HANDLE,LPVOID,LPCVOID,SIZE_T,SIZE_T*);
typedef HANDLE (__stdcall * PFN_GETCURRENTPROCESS)(void);

#define PROCESSNUM 128
#define MYMESSAGEBOX "MessageBoxW"
#define MYCREATEFILE "CreateFileW"

void HookCreateFile(LPVOID lParam)
{

RemoteParam* pRP = (RemoteParam*)lParam;


DWORD NextIpAddr = 0;
DWORD dwParamaAddr = 0;

HANDLE RetFpHdl = INVALID_HANDLE_VALUE;
LPCTSTR lpFileName;
DWORD dwDesiredAccess;
DWORD dwShareMode;
LPSECURITY_ATTRIBUTES lpSecurityAttributes;
DWORD dwCreationDisposition;
DWORD dwFlagsAndAttributes;
HANDLE hTemplateFile;
    PFN_CREATEFILE pfnCreatefile = (PFN_CREATEFILE)pRP->dwCreateFile;


__asm
{
  MOV EAX,[EBP+8]
  MOV [dwParamaAddr], EAX
  MOV EAX,[EBP+12]         
  MOV [NextIpAddr], EAX
  MOV EAX,[EBP+16]
  MOV [lpFileName], EAX
  MOV EAX,[EBP+20]
  MOV [dwDesiredAccess],EAX
  MOV EAX,[EBP+24]
  MOV [dwShareMode],EAX
  MOV EAX,[EBP+28]
  MOV [lpSecurityAttributes],EAX
  MOV EAX,[EBP+32]
  MOV [dwCreationDisposition],EAX
  MOV EAX,[EBP+36]
  MOV [dwFlagsAndAttributes],EAX
  MOV EAX,[EBP+40]
  MOV [hTemplateFile],EAX  
}

PFN_MESSAGEBOX pfnMessageBox = (PFN_MESSAGEBOX)pRP->dwMessageBox;
int allowFlag = pfnMessageBox(NULL, lpFileName, NULL, MB_ICONINFORMATION | MB_YESNO);

if(allowFlag == IDYES)
{
unsigned char szNewCode[10];
int PramaAddr = (int)dwParamaAddr;
szNewCode[4] = PramaAddr>>24;
szNewCode[3] = (PramaAddr<<8)>>24;
szNewCode[2] = (PramaAddr<<16)>>24;
szNewCode[1] = (PramaAddr<<24)>>24;
szNewCode[0] = 0x68;

int funaddr = (int)pRP->FunAddr - (int)pfnCreatefile - 10 ;
szNewCode[9] = funaddr>>24;
szNewCode[8] = (funaddr<<8)>>24;
szNewCode[7] = (funaddr<<16)>>24;
szNewCode[6] = (funaddr<<24)>>24;
szNewCode[5] = 0xE8;


PFN_GETCURRENTPROCESS pfnGetCurrentProcess = (PFN_GETCURRENTPROCESS)pRP->dwGetCurrentProcess;
PFN_WRITEPROCESSMEMORY pfnWriteProcessMemory = (PFN_WRITEPROCESSMEMORY)pRP->dwWriteProcessMemory;
pfnWriteProcessMemory(pfnGetCurrentProcess(),
                    (LPVOID)pfnCreatefile,
        (LPCVOID)pRP->szOldCode,
        10,
        NULL);

RetFpHdl = pfnCreatefile(lpFileName,
        dwDesiredAccess,
        dwShareMode,
        lpSecurityAttributes,
        dwCreationDisposition,
        dwFlagsAndAttributes,
        hTemplateFile);
pfnWriteProcessMemory(pfnGetCurrentProcess(),
                    (LPVOID)pfnCreatefile,
        (LPCVOID)szNewCode,
        10,
        NULL);
}


__asm
  {POP EDI
   POP ESI
   POP EBX
         MOV EDX, [NextIpAddr]
   MOV EAX, [RetFpHdl]
   MOV ESP, EBP
    POP EBP
   ADD ESP, 28H  
   PUSH EDX
   RET
  }


}


BOOL AdjustProcessPrivileges(LPCSTR szPrivilegesName)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

if(!OpenProcessToken(GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
  return FALSE;
}

if(!LookupPrivilegeValue(NULL,szPrivilegesName,
                       &tkp.Privileges[0].Luid))
{
  CloseHandle(hToken);
  return FALSE;
}

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL))
{
  CloseHandle(hToken);
  return FALSE;
}

CloseHandle(hToken);
return TRUE;
}


void printProcessNameByPid( DWORD ProcessId )
{
HANDLE pHd;
HMODULE pHmod;
char ProcessName[MAX_PATH] = "unknown";
DWORD cbNeeded;
pHd = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, FALSE, ProcessId );
if(pHd == NULL)
  return;

if(!EnumProcessModules( pHd, &pHmod, sizeof(pHmod), &cbNeeded))
  return;
if(!GetModuleFileNameEx( pHd, pHmod, ProcessName, MAX_PATH))
  return;

printf( "%d\t%s\n", ProcessId, ProcessName);
CloseHandle( pHd );
return;
}


int main(void)
{

  if(!AdjustProcessPrivileges(SE_DEBUG_NAME))
  {
   printf("AdjustProcessPrivileges Error!\n");
   return -1;
  }

  DWORD Pids[PROCESSNUM];
  DWORD dwProcessNum = 0;
  if(!EnumProcesses(Pids, sizeof(Pids), &dwProcessNum))
  {
   printf("EnumProcess Error!\n");
   return -1;
  }
  
  for( DWORD num = 0; num < (dwProcessNum / sizeof(DWORD)); num++)
   printProcessNameByPid(Pids[num]);

  printf("\nAll %d processes running. \n", dwProcessNum / sizeof(DWORD));

     DWORD dwPid = 0;
  printf("\nÇëÊäÈëÒªÀ¹½ØµÄ½ø³Ìid:");
  scanf("%d", &dwPid);
  
  HANDLE hTargetProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, dwPid);
  if(hTargetProcess == NULL)
  {
   printf("OpenProcess Error!\n");
   return -1;
  }

  DWORD dwFunAddr = (DWORD)VirtualAllocEx(hTargetProcess, NULL, 8192,
               MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  
  if((LPVOID)dwFunAddr == NULL)
  {
   printf("ÉêÇëÏß³ÌÄÚ´æÊ§°Ü!\n");
   CloseHandle(hTargetProcess);
   return -1;
  }

  DWORD dwPramaAddr = (DWORD)VirtualAllocEx(hTargetProcess, NULL, sizeof(RemoteParam),
                 MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  if((LPVOID)dwPramaAddr == NULL)
  {
   printf("ÉêÇë²ÎÊýÄÚ´æÊ§°Ü!\n");
   CloseHandle(hTargetProcess);
   return -1;
  }

  printf("\nÏß³ÌÄÚ´æµØÖ·:%.8x\n"
      "²ÎÊýÄÚ´æµØÖ·:%.8x\n",
   dwFunAddr, dwPramaAddr);
     RemoteParam RParam;
  ZeroMemory(&RParam, sizeof(RParam));
  HMODULE hKernel32 = LoadLibrary("kernel32.dll");
  HMODULE hUser32 = LoadLibrary("user32.dll");

  RParam.dwCreateFile = (DWORD)GetProcAddress(hKernel32, MYCREATEFILE);
  RParam.dwGetCurrentProcess = (DWORD)GetProcAddress(hKernel32, "GetCurrentProcess");
  RParam.dwWriteProcessMemory = (DWORD)GetProcAddress(hKernel32, "WriteProcessMemory");
  RParam.dwMessageBox = (DWORD)GetProcAddress(hUser32, MYMESSAGEBOX);
     
  unsigned char oldcode[10];
  unsigned char newcode[10];
  int praadd = (int)dwPramaAddr;
  int threadadd = (int)dwFunAddr;
  newcode[4] = praadd>>24;
  newcode[3] = (praadd<<8)>>24;
  newcode[2] = (praadd<<16)>>24;
  newcode[1] = (praadd<<24)>>24;
  newcode[0] = 0x68;

  int offsetaddr = threadadd - (int)RParam.dwCreateFile - 10 ;
  newcode[9] = offsetaddr>>24;
  newcode[8] = (offsetaddr<<8)>>24;
  newcode[7] = (offsetaddr<<16)>>24;
  newcode[6] = (offsetaddr<<24)>>24;
  newcode[5] = 0xE8;

  printf("NewCode:");
  for(int j = 0; j < 10; j++)
   printf("0x%.2x ",newcode[j]);
  printf("\n\n");


  if(!ReadProcessMemory(GetCurrentProcess(),
            (LPCVOID)RParam.dwCreateFile,
            oldcode,
            10,
            &dwPid))
  {
   printf("read error");
   CloseHandle(hTargetProcess);
   FreeLibrary(hKernel32);
   return -1;
  }

  strcat((char*)RParam.szOldCode, (char*)oldcode);
  RParam.FunAddr = dwFunAddr;

  printf(
   "RParam.dwCreateFile:%.8x\n"
   "RParam.dwMessageBox:%.8x\n"
   "RParam.dwGetCurrentProcess:%.8x\n"
   "RParam.dwWriteProcessMemory:%.8x\n"
   "RParam.FunAddr:%.8x\n",
   RParam.dwCreateFile,
   RParam.dwMessageBox,
   RParam.dwGetCurrentProcess,
   RParam.dwWriteProcessMemory,
   RParam.FunAddr);
  printf("RParam.szOldCode:");
  for( int i = 0; i< 10; i++)
   printf("0x%.2x ", RParam.szOldCode);
  printf("\n");
  
  
  if(!WriteProcessMemory(hTargetProcess, (LPVOID)dwFunAddr, (LPVOID)&HookCreateFile, 8192, &dwPid))
  {
   printf("WriteRemoteProcessesMemory Error!\n");
   CloseHandle(hTargetProcess);
   FreeLibrary(hKernel32);
   return -1;
  }

  if(!WriteProcessMemory(hTargetProcess, (LPVOID)dwPramaAddr, (LPVOID)&RParam, sizeof(RemoteParam), &dwPid))
  {
   printf("WriteRemoteProcessesMemory Error!\n");
   CloseHandle(hTargetProcess);
   FreeLibrary(hKernel32);
   return -1;
  }
  
  if(!WriteProcessMemory(hTargetProcess, (LPVOID)RParam.dwCreateFile, (LPVOID)newcode, 10, &dwPid))
  {
   printf("WriteRemoteProcessesMemory Error!\n");
   CloseHandle(hTargetProcess);
   FreeLibrary(hKernel32);
   return -1;
  }

     printf("\nThat's all, good luck :)\n");
  CloseHandle(hTargetProcess);
  FreeLibrary(hKernel32);
  return 0;
}
2Â¥2006-09-20 16:19:59
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌø×ª ÎÒÒª¶©ÔÄÂ¥Ö÷ sdlj8051 µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] 306Çó0703µ÷¼ÁÒ»Ö¾Ô¸»ªÖÐʦ·¶ +7 Ö½Óãly 2026-03-21 8/400 2026-03-23 23:31 by chixmc
[¿¼ÑÐ] 085600²ÄÁÏÓ뻯¹¤µ÷¼Á +7 A-¶ßÀ²ZÃÎ 2026-03-23 12/600 2026-03-23 23:16 by ÐÇ¿ÕÐÇÔÂ
[¿¼ÑÐ] ²ÄÁÏר˶ÕÒµ÷¼Á +3 ¹þ¹þ¹þºðºðºð¹þ 2026-03-23 3/150 2026-03-23 23:13 by peike
[¿¼ÑÐ] 265Çóµ÷¼Á +10 ÁºÁºÐ£Ð£ 2026-03-17 10/500 2026-03-23 21:17 by Ò»ÇÐOK
[¿¼ÑÐ] Ò»Ö¾Ô¸ÉÂʦ´óÉúÎïѧ071000£¬298·Ö£¬Çóµ÷¼Á +3 SYA£¡ 2026-03-23 3/150 2026-03-23 19:09 by macy2011
[¿¼ÑÐ] Ò»Ö¾Ô¸ÄϾ©Àí¹¤´óѧ085701×ÊÔ´Óë»·¾³302·ÖÇóµ÷¼Á +5 ¿ûè÷ÎÀ¶Ó 2026-03-18 7/350 2026-03-23 16:26 by lingjue
[¿¼ÑÐ] 08¹¤Ñ§µ÷¼Á +7 Óû§573181 2026-03-20 11/550 2026-03-23 15:47 by ÎÒ°®Ñ§Ï°Ñ§Ï°Ê¹Î
[¿¼ÑÐ] 298Çóµ÷¼Á +8 Éϰ¶6666@ 2026-03-20 8/400 2026-03-23 11:02 by laoshidan
[¿¼ÑÐ] ѰÕÒµ÷¼Á +4 ¾óǿâ? 2026-03-21 4/200 2026-03-22 16:14 by ľÍÐζ¶
[¿¼ÑÐ] 318Çóµ÷¼Á +4 plumÀî×Ó 2026-03-21 7/350 2026-03-22 14:17 by ColorlessPI
[¿¼ÑÐ] 085601µ÷¼Á 358·Ö +3 zzzzggh 2026-03-20 4/200 2026-03-21 10:21 by luoyongfeng
[¿¼ÑÐ] Ò»Ö¾Ô¸»ªÄÏʦ´ó 070300£¨»¯Ñ§£©304·ÖÇóµ÷¼Á +3 0703ÎäÜ·»ÛÑ©304 2026-03-18 3/150 2026-03-21 00:48 by JourneyLucky
[¿¼ÑÐ] ÄϾ©´óѧ»¯Ñ§376Çóµ÷¼Á +3 hisfailed 2026-03-19 6/300 2026-03-20 23:43 by hisfailed
[¿¼ÑÐ] 288Çóµ÷¼Á +16 ÓÚº£º£º£º£ 2026-03-19 16/800 2026-03-20 22:28 by JourneyLucky
[¿¼ÑÐ] 317Çóµ÷¼Á +5 Éê×ÓÉêÉê 2026-03-19 9/450 2026-03-20 22:26 by JourneyLucky
[¿¼ÑÐ] Çóµ÷¼Á£¬Ò»Ö¾Ô¸:ÄϾ©º½¿Õº½Ìì´óѧ´óѧ £¬080500²ÄÁÏ¿ÆÑ§Ó빤³Ìѧ˶£¬×Ü·Ö289·Ö +4 @taotao 2026-03-19 4/200 2026-03-20 22:14 by JourneyLucky
[¿¼ÑÐ] 261ÇóBÇøµ÷¼Á£¬¿ÆÑо­Àú·á¸» +3 Å£Ä̺Üæ 2026-03-20 4/200 2026-03-20 19:34 by JourneyLucky
[¿¼ÑÐ] Çóµ÷¼Á +3 eation27 2026-03-20 3/150 2026-03-20 19:32 by JourneyLucky
[¿¼ÑÐ] 085410È˹¤ÖÇÄÜר˶317Çóµ÷¼Á£¨0854¶¼¿ÉÒÔ£© +4 xbxudjdn 2026-03-18 4/200 2026-03-20 09:07 by ²»168
[¿¼²©] 26²©Ê¿ÉêÇë +3 1042136743 2026-03-17 3/150 2026-03-17 23:30 by ÇáËɲ»ÉÙËæ
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û