You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.5 KiB
51 lines
1.5 KiB
4 years ago
|
#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++);
|
||
|
}
|