为什么总是从 kernel32.dll 导入某些函数?
逆向工程
视窗
聚乙烯
操作系统
2021-06-15 10:59:21
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 的情况下动态解析。
其它你可能感兴趣的问题
