概念的问题

BlackHat Asia 2019中的描述

宏不只有VBA现在有两种:

  • Visual Basic for Application (VBA)
  • Excel 4.0 macro’s (XLM, 只在Excel中)

VBA != VBA 描述说的实际上有两种

  • P-code
  • Exe-codes (第二种还没遇到过,粗略的搜了一下好像也没搜到)

使用问题

VBA相关的,经过下午的简短了解,在word文档中,可以直接右键解压,然后

  • 97-2003版的格式中Macro->VBA文件夹中就是脚本文件,但是被压缩了,标准压缩算法,oletools的olevba可以解析大部分,解压算法是正确的,可以哪天看看流程
  • 2007版的格式中是vbaProject.bin中存储P-code和代码(二者不影响,不同的情况下优先执行P-code,但是要求保存的时候编译的版本和再次开启时相同,运行一次之后会更新为相同,反编译P-code代码)

关于Excel 4.0的问题

我理解的是放在Excel单元格里执行的宏脚本,通畅如果没有做别的措施那就可以不执行然后打开直接看到脚本内容,但是看到BH的ppt上讲到一个关于Excel表单的属性{Sheetname}.Visible = xlSheetVeryHidden,除了这个Very Hidden外其实还有两个属性值。完整的如下:

Value Meaning
0x00 Visible
0x01 Hidden
0x02 Very Hidden;不仅仅是设置为hidden,同时没有办法在用户界面打开

也就是说在某个Sheet下写入Macro,然后设置ActiveSheet.Visible = xlSheetVeryHidden,同时按照之前说的VBA代码和P-code代码不影响的问题,移除VBA代码之后,就只剩下P-code执行了
还有一种是把Excel 4.0变成动态执行,适用XLM的API(ExecuteExcel4Macro)动态执行Excel4.0的代码

解决方案

  1. Python有库可以控制excel内容这些,同时经过测试,被隐藏的sheet可以正确列出来,在尝试可以修改sheet的visible属性吗,就算不修改内容也是可以读出来的
  2. (不推荐的方案) VBA应该也可以遍历一个workbook的所有sheet,然后设置visible属性,但是既然要执行我们的vba那不是得开编辑模式,这样的话会让原始文件中的Macro也执行,并不是一个比较良好的方案

Demo方案

可以使用olefile(Python的一个模块),配合阅读Microsoft xls结构的相关文档解析,Excel文件的结构。具体的结构解析就不详说了,GitHub上有个小哥(估计是写着玩)的一个脚本,解析部分还是比较完善,稍作更改就可以使用(自己找,我怎么会直接把链接给你呢)

于是通过解析Macro Sheet的单元格内容并输出,输出之后再用yara规则检测或者人工看