vba p代码反汇编程序

pcodedmp的Python项目详细描述


pcodedmp.py-VBA P代码反汇编程序

简介

它并不广为人知,但是用vba(visualbasicforapplications;microsoft office中使用的宏编程语言)编写的宏有三种不同的可执行形式,每种形式都可以是运行时实际执行的内容,具体取决于环境。这些表格是:

  • 源代码。宏模块的原始源代码被压缩并存储在模块流的末尾。这使得查找和提取宏分析所需的大多数免费DFIR工具相对容易,如oledumpolevba甚至许多专业工具反病毒工具只查看此表单。然而,大多数情况下,office完全忽略了源代码。实际上,可以删除源代码(因此使所有这些工具都认为不存在宏),但是宏仍然可以执行而不会出现任何问题。我已经创建了一个概念证明来说明这一点。大多数工具在此存档文件中看不到任何宏,但如果使用相应的Word版本(与文档名称匹配)打开,它将显示一条消息并启动calc.exe。令人惊讶的是,恶意软件作者并没有更广泛地使用这个技巧。

  • P代码。当每个vba行被输入vba编辑器时,它立即被编译成p代码(堆栈机器的伪代码),并存储在模块流中的不同位置。p代码正是大多数时候执行的代码。实际上,即使在vba编辑器中打开宏模块的源代码,显示的也不是解压缩的源代码,而是反编译为源代码的p代码。只有在使用不同于用于创建文档的vba版本的office版本下打开文档时,存储的压缩源代码才会重新编译为p代码,然后执行该p代码。这使得可以在任何支持VBA的Office版本上打开包含VBA的文档,并使其中的宏保持可执行,尽管不同版本的VBA使用不同(不兼容)的P代码指令。

  • 执行代码。当p代码至少执行了一次时,它的另一个标记形式存储在文档的其他位置(在流中,其名称以\u srp\u开头,后跟一个数字)。从那里可以执行得更快。但是,execodes的格式非常复杂,并且是特定于创建它们的特定office版本(而不是vba版本)的。这使得它们非常不便于携带。此外,它们的存在是不必要的-它们可以被删除,宏将正常运行(从p代码中)。

由于大多数情况下,p代码决定了宏到底要做什么(即使源代码和执行代码都不存在),所以有一个工具来显示它是有意义的。这就是我们创建此VBA P代码反汇编程序的原因。

安装

该脚本在Python2.6+版和Python3.x版中都可以使用。最简单的安装方法是使用pip:

pip install pcodedmp -U

上述命令将安装最新版本的pcodedmp(如果已经存在,则升级旧版本)。同时还要安装所有必需的依赖项(当前仅限于oletoolswin_unicode_控制台,但将来可能还会有其他依赖项)。

如果您希望从github存储库安装它,可以这样做:

git clone https://github.com/bontchev/pcodedmp.git
cd pcodedmp
pip install .

用法

dir流的解析记录,以及vba模块中使用并存储在

脚本支持VBA5(Office 97、MacOffice 98)、VBA6(Office 2000到Office 2009)和VBA7(Office 2010及更高版本)。

脚本还接受以下命令行选项:

-h--help显示如何使用脚本和命令行选项的简短说明。

-v--version显示脚本的版本。

-n--norecurse如果命令行中指定的名称是目录,则仅处理此目录中的文件;不处理其子目录中的文件。

-d--disasomly只有p代码将被反汇编,没有dir流的解析内容或\u vba工程中的标识符。

-b--verbose流的内容以十六进制和ascii格式转储。此外,编译成p代码vba行的每个原始字节也以十六进制和ascii格式转储。

-o输出文件--输出输出文件将结果保存到指定的输出文件,而不是发送到标准输出。

例如,对上述概念证明中的一个文档使用脚本将产生以下结果:

python pcodedmp.py -d Word2013.doc

Processing file: Word2013.doc
===============================================================================
Module streams:
Macros/VBA/ThisDocument - 1517 bytes
Line #0:
        FuncDefn (Private Sub Document_Open())
Line #1:
        LitStr 0x001D "This could have been a virus!"
        Ld vbOKOnly
        Ld vbInformation
        Add
        LitStr 0x0006 "Virus!"
        ArgsCall MsgBox 0x0003
Line #2:
        LitStr 0x0008 "calc.exe"
        Paren
        ArgsCall Shell 0x0001
Line #3:
        EndSub

作为参考,它是编译以下VBA代码的结果:

Private Sub Document_Open()
    MsgBox "This could have been a virus!", vbOKOnly + vbInformation, "Virus!"
    Shell("calc.exe")
End Sub

已知问题

  • 仅限Office 2016 64位:当反汇编声明为自定义类型的变量时(例如,dim somevar as sometype),类型(as sometype)不会反汇编。

  • 仅限Office 2016 64位:不反汇编sub函数属性声明的私有属性。

  • 仅限Office 2016 64位:外部函数声明的declare部分(例如,private declare ptrsafe function somefunc lib"somelib"alias"somename"()只要)不被反汇编。

  • Office 2000及更高版本:未正确反汇编paramarray类型的子例程或函数参数的类型。例如,子foo(paramarray arg())将被反汇编为子foo(arg)

  • office的所有版本:外部函数声明的别名"somename"部分(例如,只要私有声明ptrsafe function somefunc lib"somelib"alias"somename"()就不会被反汇编。

  • Office的所有版本:自定义类型定义(例如,public type sometype)的public属性不被反汇编。

  • Office的所有版本:子例程或函数参数的自定义类型未正确反汇编,而是使用了custom type。例如,sub foo(arg为bar)将被反汇编为sub foo(arg为customtype)

  • 如果程序的输出被发送到一个文件,而不是控制台(使用-o选项或通过重定向stdout),任何非ascii字符串(如模块名、宏中使用的texst等)都可能无法正确编码。

无法访问64位Office 2016,而且由此版本的Office生成的少数文档样本(我已经获得)不足以让我找出相应的信息所在。我知道它在其他版本的office中的位置,但它在64位office 2016中已被移到其他位置,旧算法不再工作。

待办事项

  • 实现对vba3(excel95)的支持。

  • 虽然脚本应该支持由macoffice创建的文档,但这还没有经过测试(而且您知道未经测试的代码通常工作得有多好)。应该对其进行测试,并修复与之相关的任何错误。

  • 我不是一个有经验的python程序员,代码很难看。比我更熟悉python的人可能应该重写脚本,使其看起来更好。

更改日志

版本1.2.6:

  • 更改为不需要win_unicode_控制台模块(当它不可用时-例如,当它不在Windows计算机上运行或在python的pypy实现下运行时),这要归功于philippe lagadec

版本1.2.5:

  • 添加了健全性检查以避免在分析对象声明时出错
  • 生成输出的函数现在将输出文件(默认值为stdout)作为参数,以便更好地与其他工具集成,这要归功于philippe lagadec

版本1.2.4:

  • 实现了对名称中包含非ascii字符的模块名称的支持。感谢Philippe Lagadec的帮助。
  • 修复了反汇编对象声明时的分析错误。
  • 删除了一些未使用的变量。
  • 对文档做了一些改进。

版本1.2.3:

  • 修复了一些崩溃,并更好地记录了一些拆卸失败。
  • 将脚本转换为可使用pip安装的包。使用命令pip install pcodedmp

版本1.2.2:

  • 实现了对以开放XML格式(Office 2007及更高版本的默认格式)保存的文档的处理—.docm.xlsm.pptm

版本1.2.1:

  • 现在也在python 3.x下运行。
  • 改进了对64位Office文档的支持。
  • 实现了对某些VBA7特定功能的支持(friendptrsafelongtpr)。
  • 改进了dim声明的反汇编。

1.2.0版:

  • 分解各种声明(newtypedimredimsubfunctionproperty)。

1.1.0版:

  • 以更有效的方式存储操作码。
  • 实现了VBA7支持。
  • 实现了对64位版本Office创建的文档的支持。

1.0.0版:

  • 初始版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java附加两个数组   java如何在Extjs的不同页面中使用相同的存储   java Jung,大顶点的布局重叠,图形出现在奇怪的位置   java如何在Android中通过画布绘制圆?   java验证库设计模式选择   java研磨机未知标记“timedTests”   java Android领域子类实例方法   java使用resteasy/jaxrs从请求负载接收两种类型的数据   缓冲策略Java缓冲策略有时不能正确绘制   java跟踪棋子   密度无关像素如何在java中锐化图像缩略图?   java如何在MongoDB更新查询中编写(或)更新   java A*寻路游戏系统退出问题   java在安卓中读取xml的最佳方式是什么?   通过反射调用的方法的java抑制警告   安卓 java。语言错误:信号11(SIGSEGV),代码10(?),故障地址006e006f   java lombok 1.18.2使用DexBuilderForDebug抛出TransformClasses   java JOptionPane CD对话框按钮?   java只返回json中的一些值,而不是完整实体对象   java包不存在错误,请稍后重试