#include "Utils.h" BOOLEAN CheckMask(CHAR8* base, CHAR8* pattern, CHAR8* mask) { for (; *mask; ++base, ++pattern, ++mask) if (*mask == 'x' && *base != *pattern) return FALSE; return TRUE; } VOID* FindPattern(CHAR8* base, UINTN size, CHAR8* pattern, CHAR8* mask) { size -= AsciiStrLen(mask); for (UINTN i = 0; i <= size; ++i) { VOID* addr = &base[i]; if (CheckMask(addr, pattern, mask)) return addr; } return NULL; } VOID* GetExport(UINT8* ModuleBase, CHAR8* export) { EFI_IMAGE_DOS_HEADER* dosHeaders = (EFI_IMAGE_DOS_HEADER*)ModuleBase; if (dosHeaders->e_magic != EFI_IMAGE_DOS_SIGNATURE) return NULL; EFI_IMAGE_NT_HEADERS64* ntHeaders = (EFI_IMAGE_NT_HEADERS64*)(ModuleBase + dosHeaders->e_lfanew); UINT32 exportsRva = ntHeaders->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; EFI_IMAGE_EXPORT_DIRECTORY* exports = (EFI_IMAGE_EXPORT_DIRECTORY*)(ModuleBase + exportsRva); UINT32* nameRva = (UINT32*)(ModuleBase + exports->AddressOfNames); for (UINT32 i = 0; i < exports->NumberOfNames; ++i) { CHAR8* func = (CHAR8*)(ModuleBase + nameRva[i]); if (AsciiStrCmp(func, export) == 0) { UINT32* funcRva = (UINT32*)(ModuleBase + exports->AddressOfFunctions); UINT16* ordinalRva = (UINT16*)(ModuleBase + exports->AddressOfNameOrdinals); return (VOID*)(((UINT64)ModuleBase) + funcRva[ordinalRva[i]]); } } return NULL; } VOID MemCopy(VOID* dest, VOID* src, UINTN size) { for (UINT8* d = dest, *s = src; size--; *d++ = *s++); }