bool peLoader(const char *exePath, const wchar_t* cmdline)
{
LONGLONG fileSize = -1;
BYTE *data = MapFileToMemory(exePath, fileSize);
BYTE* pImageBase = NULL;
LPVOID preferAddr = 0;
IMAGE_NT_HEADERS *ntHeader = (IMAGE_NT_HEADERS *)getNtHdrs(data);
if (!ntHeader)
{
printf("[+] File %s isn't a PE file.", exePath);
return false;
}
IMAGE_DATA_DIRECTORY* relocDir = getPeDir(data, IMAGE_DIRECTORY_ENTRY_BASERELOC);
preferAddr = (LPVOID)ntHeader->OptionalHeader.ImageBase;
printf("[+] Exe File Prefer Image Base at %x\n", preferAddr);
HMODULE dll = LoadLibraryA("ntdll.dll");
((int(WINAPI*)(HANDLE, PVOID))GetProcAddress(dll, "NtUnmapViewOfSection"))((HANDLE)-1, (LPVOID)ntHeader->OptionalHeader.ImageBase);
pImageBase = (BYTE *)VirtualAlloc(preferAddr, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!pImageBase && !relocDir)
{
printf("[-] Allocate Image Base At %x Failure.\n", preferAddr);
return false;
}
if (!pImageBase && relocDir)
{
printf("[+] Try to Allocate Memory for New Image Base\n");
pImageBase = (BYTE *)VirtualAlloc(NULL, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!pImageBase)
{
printf("[-] Allocate Memory For Image Base Failure.\n");
return false;
}
}
puts("[+] Mapping Section ...");
ntHeader->OptionalHeader.ImageBase = (size_t)pImageBase;
memcpy(pImageBase, data, ntHeader->OptionalHeader.SizeOfHeaders);
IMAGE_SECTION_HEADER * SectionHeaderArr = (IMAGE_SECTION_HEADER *)(size_t(ntHeader) + sizeof(IMAGE_NT_HEADERS));
for (int i = 0; i < ntHeader->FileHeader.NumberOfSections; i++)
{
printf(" [+] Mapping Section %s\n", SectionHeaderArr[i].Name);
memcpy
(
LPVOID(size_t(pImageBase) + SectionHeaderArr[i].VirtualAddress),
LPVOID(size_t(data) + SectionHeaderArr[i].PointerToRawData),
SectionHeaderArr[i].SizeOfRawData
);
}
// for demo usage:
// masqueradeCmdline(L"C:\\Windows\\RunPE_In_Memory.exe Demo by aaaddress1");
masqueradeCmdline(cmdline);
fixIAT(pImageBase);
if (pImageBase != preferAddr)
if (applyReloc((size_t)pImageBase, (size_t)preferAddr, pImageBase, ntHeader->OptionalHeader.SizeOfImage))
puts("[+] Relocation Fixed.");
size_t retAddr = (size_t)(pImageBase)+ntHeader->OptionalHeader.AddressOfEntryPoint;
printf("Run Exe Module: %s\n", exePath);
((void(*)())retAddr)();
}