我正在为 Windows 10 编写 x86 手动地图注入器。
在编写负责解析导入的代码时,我发现了
kernel32.dll
(windows\syswow64\kernel32.dll
) 中的一个名为 "SleepConditionVariableSRW"
的函数,它是 "api-ms-win-core-synch-l1-2-0.SleepConditionVariableSRW"
的转发器。我一直在测试我的注入器的 DLL 依赖于它并从 kernel32.dll
导入它。
当我加载模块(从
windows\syswow64\downlevel
)并查看导出时,SleepConditionVariableSRW
再次成为转发器,但又变为 kernel32.dll
。如果是常规反向转发并且 API 设置转发到 kernelbase.dll
或其他什么,我会理解,但这对我来说毫无意义。
我正在测试的 DLL,从
kernel32.dll
导入函数:
kernel32.dll
将函数作为转发器导出到 API 集:
将函数作为转发器导出回
kernel32.dll
的API集,它首先转发到API集:
我查看了整个驱动器上该 API 集的每个副本,并检查了导出,看看其中是否有任何一个(甚至是 x64)将该函数转发到除
kernel32.dll
之外的任何模块。他们没有。
我使用
LoadLibraryA
注入了我一直在测试的 DLL,并检查了对该函数的引用,它从 SleepConditionVariableSRW
调用了 kernelbase.dll
。 Windows 图像加载器如何确定它位于哪个模块中?我认为函数的转发器名称总是包含正确的模块来查找导出。
Windows\System32\ApiSetSchema.dll 有一个名为 .apiset 的部分,其中包含将所有 API 集映射到其主机模块的数据。更多信息请访问 https://www.geoffchappell.com/studies/windows/win32/apisetschema/index.htm