为什么总是从 kernel32.dll 导入某些函数?

逆向工程 视窗 聚乙烯 操作系统
2021-06-15 10:59:21

我已经注意到这一点有一段时间了。IsDebuggerPresentGetModuleHandle这样的函数总是出现在二进制文件的导入目录结构中。我假设是 Window 的动态链接器,但我在哪里可以找到有关它的信息?下面是我正在谈论的“默认”功能的屏幕截图,这些功能总是被导入。

在此处输入图片说明

2个回答

猜测(因为您没有提供太多细节),您正在查看的二进制文件是使用最新版本的 Microsoft Visual C++ 编译的。列出的 API 由其 CRT(C 运行时)库在启动或基本运行时代码引用的函数中使用,这些代码默认链接到每个可执行文件中。您可以找到(大部分)随 Visual Studio 安装的 CRT 源,并检查自己如何使用这些 API。例如,IsDebuggerPresent由在__raise_securityfailure安全 cookie 检查失败时调用函数使用(以及在某些其他情况下)。

由于除了 Visual C++ 及其旧版本之外还有其他编译器,因此肯定存在不导入所有甚至任何这些 API 的二进制文件。事实上,您可以制作一个完全不链接的程序kernel32(例如,通过仅使用来自ntdll.dll或通过动态加载 DLL 的 shellcode 样式的本机 API )。

IsDebuggerPresent 用于确定程序是否正在调试,而 GetModuleHandle 用于检索当前进程上下文中存在的特定模块(Imagebase 地址)的句柄。这些 API 可以不存在于任何程序中,并且与 windows 动态链接器没有任何关系。

还有其他程序没有导入库,将在不使用这些 API 的情况下动态解析。