IAT Hiding - Custom GetProcAddress
IAT Hiding - Custom GetProcAddress
IAT Hiding - Custom GetProcAddress
Custom-GetProcAddress.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <Windows.h>
#include <stdio.h>
#include <winternl.h>
FARPROC CustomGetProcAddress(_In_ HMODULE hModule, _In_ LPCSTR lpApiName) {
PBYTE pBase = (PBYTE)hModule;
// Getting DOS Header
PIMAGE_DOS_HEADER pImgheader = (PIMAGE_DOS_HEADER)pBase;
if (pImgheader->e_magic != IMAGE_DOS_SIGNATURE)
return NULL;
// Gettting NT Header
PIMAGE_NT_HEADERS pImgNTheader = (PIMAGE_NT_HEADERS)(pBase + pImgheader->e_lfanew);
if (pImgNTheader->Signature != IMAGE_NT_SIGNATURE)
return NULL;
// Getting Optional Header
PIMAGE_OPTIONAL_HEADER pImgOptheader = &pImgNTheader->OptionalHeader;
if (!pImgOptheader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
return NULL;
// Getting Image Export Table
PIMAGE_EXPORT_DIRECTORY pImgExportDir = (PIMAGE_EXPORT_DIRECTORY)(pBase + pImgOptheader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
// Getting function's array pointers
PDWORD FuncNameArray = (PDWORD)(pBase + pImgExportDir->AddressOfNames);
// Getting functions address array pointer
PDWORD FuncAddressArray = (PDWORD)(pBase + pImgExportDir->AddressOfFunctions);
// Getting ordinal array pointer
PWORD FuncOrdinalArray = (PDWORD)(pBase + pImgExportDir->AddressOfNameOrdinals);
// Find correct function
for (DWORD i = 0; i < pImgExportDir->NumberOfNames; i++) {
// Getting function name
CHAR* pFuncName = (CHAR*)(pBase + FuncNameArray[i]);
// Getting Address of function through ordinal
PVOID pFuncAddress = (PVOID)(pBase + FuncAddressArray[FuncOrdinalArray[i]]);
// compare provided functionname with the export
if (strcmp(lpApiName, pFuncName) == 0) {
printf("[ %0.4d ] NAME: %s -\t ADDRESS: 0x%p -\t ORDINAL: %d \n", i, pFuncName, FuncAddressArray, FuncOrdinalArray[i]);
return pFuncAddress;
}
}
return NULL;
}
int main() {
printf("[+] Original GetProcAddress 0x%p \n", GetProcAddress(GetModuleHandleA("NTDLL.DLL"), "NtAllocateVirtualMemory"));
printf("[+] GetProcAddress Replacement : 0x%p \n", CustomGetProcAddress(GetModuleHandleA("NTDLL.DLL"), "NtAllocateVirtualMemory"));
return 0;
}
This post is licensed under
CC BY 4.0
by the author.