#include <winnt.h> #include <Windows.h> #include <stdlib.h>
HANDLE hMap = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
LPVOID lpBase = MapViemOfFile(hMap,FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); PIMAGE_DOS_HEADER pImgDosHdr = (PIMAGE_DOS_HEADER)lpBase; PIMAGE_NT_HEADERS32 pImgNtHdr = (PIMAGE_NT_HEADERS32)((DWORD)lpBase + (DWORD)pImgDosHdr->e_lfanew); PIMAGE_SECTION_HEADER pImgSecHdr = IMAGE_FIRST_SECTION(pImgNtHdr);
WORD wNum = pImgNtHdr->FileHeader.NumberOfSections;
DWORD dwSize = pImgNtHdr->OptionalHeader.FileAlignment;
PIMAGE_SECTION_HEADER pImgNewSec = (PIMAGE_SECTION_HEADER)((DWORD)pImgSecHdr + wNum *sizeof(IMAGE_SECTION_HEADER));
strcpy((char*)pImgSecHdr->Name,".new"); pImgNewSec->Misc.VirtualSize = pImgNtHdr->OptionalHeader.SectionAlignment; pImgNewSec->VirtualAddress = pImgSecHdr[wNum - 1].VirtualAddress + pImgSecHdr[wNum - 1].SizeOfRawData; pImgNewSec->SizeOfRavData = dwSize; pImgNewSec->PointerToRawData = pImgSecHdr[wNum - 1].PointerToRawData + pImgSecHdr[wNum - 1].SizeOfRawData; pImgNewSec->Characteristics = 0xE0000040;
pImgNtHdr->OptionalHeader.NumberOfSecions+=1;
pImgNtHdr->OptionalHeader.SizeOfImage += pImgNtHdr->OptionalHeader.SectionAilgnment;
UnmapVievOfFile(lpBase);
CloseHandle(hMap);
CloseHandle(hFile);
|