advapi32.dll 在导出转发期间更改函数名称

逆向工程 视窗 聚乙烯 文件格式 dll注入 接口
2021-06-23 14:46:18

我正在尝试编写手动映射器,以便将 DLL 注入其他进程。

我已经到了点,我已经写了一个简单的“Hello World”dll,我试图注入另一个进程。

我遇到了一个问题,我的示例 Hello world DLL 依赖于 user32.dll 中的函数,这意味着我也必须映射那个。user32.dll 本身依赖于其他 dll,这些 dll 是通过 API Set 架构导入的。

User32dll 通过 api set schema 导入

记下我标记的导入函数的确切命名:“EventActivityIdControl”

事实证明,这个特定 api 的函数可以在 advapi32.dll 中找到

如果我在 CFF 资源管理器中查看该 dll,您会发现有正确的导出 advapi32.dll 为 api 导出正确的函数

但是,当我手动解析 advapi32.dll 并查看导出时,我从 ntdll.dll 获得转发导出,带有前缀“Ewt”,这弄乱了我的字符串比较。 由我的代码解析的 advapi32.dll 的导出

这个前缀似乎被 CFF explorer 和其他类似的软件省略了。

我找不到有关此行为/模式的任何信息。谁能解释一下,为什么会这样,或者我可以在哪里找到更多相关信息?

1个回答

发布问题后不久,我仔细查看了解析导出的代码,并意识到我做出了错误的假设。

在导出目录条目中,如果函数条目指向导出部分,您可以在那里找到一个字符串,它描述了转发器导出名称。在我原始问题的最后一个屏幕截图中可以看到一个例子。

我的印象是,点后面的名称也是函数的名称,因为它是由转发 dll 本身导出的。

这是错误的。导出名称表 (EAT) 中仍有一个有效的导出名称条目,必须读取该条目才能完成正确的导入到导出名称映射。

我希望这个解释能帮助其他一些可怜的灵魂,他们在同样的错误假设上浪费了时间。

这是转发函数名到名称的映射图,用于导出advapi32.dll中的转发函数

将函数名转发到导出的函数名

正如您所看到的,ntdll 中的导出具有 Etw 前缀,我正在谈论这个前缀,而 advapi32 dll 中的命名导出没有这个前缀,这让我做出了最初的假设,即 CFF 资源管理器忽略了前缀。