Visual Basic 内部结构

逆向工程 文件格式 视觉基础
2021-07-08 06:13:05

我正在分析一些 Visual Basic 6.0 恶意软件(在 .NET 之前),我对格式的内部结构有几个问题。我拥有的样本都已编译p-code或已native code编译(取决于恶意软件版本)。在过去的几天里,我阅读了 Alex Ionescu 的论文以及关于该主题的一篇论文,我对格式有几个问题。此外,如果您有更多资源,我可以在其中获得有关 Visual Basic 内部结构的更多信息,请随时在此处发布。

所以问题是:

  1. ProjectInformation结构中有一个0x20名为 的偏移量字段lpNativeCode根据亚历克斯的论文,描述说Pointer to .DATA section在分析我的样本时,我注意到以下字段0x0用于p-code编译样本,并包含编译样本的地址native code所以,我的问题是:使用以下字段来确定样本是否已编译p-code或已native-code编译是否安全?

  2. ObjectInfo结构内部有偏移量0x200x24称为wMethodCount和的字段lpMethods对于已p-code编译的示例,我注意到该lpMethods字段指向该对象的一组方法。我不明白的是出现在数组中实际方法地址之前的零字节。为了更清楚,我附上了以下图片:

    p 代码示例的 ObjectInfo 结构

    ObjectInfo 中的方法数组

第一张图片是ObjectInfo结构的转储视图,而第二张图片是lpMethods字段指向的方法数组请注意实际方法地址之前的 8 个零字节(在其他一些示例中,有超过 8 个零字节,因此并不总是那个数字)。我想知道的是那些零字节是什么?

  1. 最后我的最后一个问题。在该PublicObjectDescriptor结构中,存在在偏移的场0x1C称为dwMethodCount带的描述Number of methods in Object此外,内部ObjectInfo结构有一个叫做字段wMethodCount,并在OptionalObjectInfo有字段称为wEventCountdwControlCount我想知道的是这些领域之间的关系是什么。

    我注意到对于p-code编译样本 PublicObjectDescriptor.dwMethodCount等于ObjectInfo.wMethodCount,而对于native-code编译样本,以下关系不成立。

1个回答

免责声明:由于 VB 文件结构仍未记录,我们无法在没有完全逆向工程格式的情况下提供有保证的答案。正如您和其他人所提到的,Ionescu 和其他人已经尝试过这种方法并取得了一些成功。

我将尝试在不打开任何逆向工程工具的情况下尽我所能回答您的问题。如果您想询问某人如何对 VB 文件格式和相关的可执行文件进行逆向工程,我建议专门针对该主题打开另一个问题。

现在,不用多说,我的答案(阅读:有根据的猜测):

  1. 作为一种未记录的格式,我们不仅不能保证“是”,而且格式和/或这些假设在未来版本中可能会发生变化。对于像 VB6 这样古老的格式,这种情况不太可能发生,自从它被放弃以来,就更是如此。在这种情况下,这似乎是一个公平的假设。

  2. 由于ObjectInfos 和PublicObjectDescriptor结构体是分开的,我可以假设数组中的nullObjectInfo.lpMethods表示一个方法(由 中的名称定义PublicObjectDescriptor)不是由 实现的ObjectInfo这同样是一个有根据的猜测,应该进行进一步的逆向工程来验证它。

  3. 我认为,由于PublicObjectDescriptor承担了面向外部的对象描述的角色,因此它用于完整地描述对象。ObjectInfo对于p-code对象的各个部分而言,它更具有外部性和特定性因此,而这在完全执行对象p-code将有它ObjectInfo.wMethodCount等于它的PublicObjectDescriptor.dwMethodCount同时本身中实现的对象,它是部分地(或全部地)将具有较高的PublicObjectDescriptor.dwMethodCountObjectInfo.wMethodCount