thumbnail

一、说明

msdocviewer 插件 🧲 由 CrowdStrike 的 Alexander Hanel 编写,在使用插件时遇到的问题请直接联系插件作者。

二、介绍

msdocviewer 是一个能够要查看微软技术规范 (Win32 API驱动) 的简单工具。在对可执行二进制文件进行逆向工程时,看到调用了 API,但有时会忘记它的作用,这时往往会另外打开浏览器去查找此 API 的作用,包括参数,返回值是什么意思。Microsoft 的文档 (通常称为 MSDN) 描述了 API 如何与操作系统交互。通过各个 API 组合可以让分析人员推断二进制文件中的功能。如果在 IDA 中就包含此类 API 文档,可有助于加快逆向工程进度,因为无需切换到浏览器或其他第三方文档查看器。下图是 msdocviewer IDA 插件的示例,突出显示的 GetProcessHeap API 可以在左侧看到,右侧可以看到相应的文档。

工具由三部分组成

  • 两个 Git 存储库
  • 解析器
  • IDA 插件

第一部分使用 Microsoft Doc 的两个存储库,一个是 Win32 API 文档,另一个是 Windows 驱动程序 DDI 参考文档。

第二部分是一个 Python 脚本,用它是用来解析文档存储库,查找与 API 函数相关的所有文档,一旦找到,便将文档复制到目录,重新排列一些文本,然后将文档重命名为其相应 API 名称,例如,文件名 nf-fileapi-createfilea.md 重命名为 CreateFileA.md。

第三部分是用 IDAPython 编写的 IDA 插件,它利用 PyQt 的 Markdown 查看器来显示 API 文档。

三、安装 msdocviewer

从 Github 克隆存储库

git clone https://github.com/alexander-hanel/msdocsviewer.git

克隆存储库后,需要下载托管文档的存储库子模块,可通过执行以下命令来下载

cd msdocviewer
git submodule update --init --recursive

子模块存储库大小超过 2GB,因此下载可能需要一段时间。如果 git 子模块命令引发异常,则重新执行第二个命令会处理该异常。

下载后,需要通过执行 python run_me_first.py 来解析文档存储库。

注意

此 Python 脚本需要 pyyaml 库,可通过执行 pip install -r requirements.txt 来安装

以下是 run_me_first.py 的输出:

在解析过程中,某些函数名称是无效文件,因此不会创建。要查看跳过哪些文件和函数,可以添加可选的命令行参数 –log 或 -l。它将日志存储到名为 debug-parser.log 的文件中。还有一个命令行选项 –overwrite 或 -o 来覆盖当前文档。如果存在旧版本的 msdocviewer 或 Microsoft 更新了其文档存储库,则建议覆盖。因为我这里是第一次安装,所以没加 -overwrite 参数,根据上图提示,需要在 msdocviewer.py 文件中修改 API_MD 变量

修改保存后再复制粘贴到 IDA 插件目录下,插件可以通过 编辑 -> 插件 -> msdocviewer 或使用热键 ctrl + shift + z 来激活。

四、编写自己的文档工具

总的来说,用于制作 msdocviewer 的代码很简单。如果去除日志记录功能,解析器和 IDA 插件均包含不到 100 行 Python 代码。虽然 msdocviewer 对于 Windows 二进制文件逆向工程很有用,但它对于 Linux 或其他平台几乎没有价值。msdocviewer 的有用之处在于文档。因此,要为自己的平台编写有价值的工具,所需要的只是文档。一旦找到文档并将其转换为支持的格式 (PyQt 支持 Markdown、HTML 或纯文本格式),就可以轻松使用 IDAPython 制作自己的文档工具。如果不想从头开始,请随意使用 msdocviewer IDA 插件作为模板,函数 get_selected_api_name 和 load_markdown 包含插件的核心逻辑。第一个函数使用 ida_kernwin.get_highlight 提取选定的字符串,第二个函数使用选定的字符串来确定应打开和显示的文件名。