一、说明
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 提取选定的字符串,第二个函数使用选定的字符串来确定应打开和显示的文件名。