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

所以问题是:


ProjectInformation结构中,在偏移量0x20处存在一个称为lpNativeCode的字段。根据Alex的论文,描述为Pointer to .DATA section。分析样本时,我注意到以下字段是0x0编译样本的p-code,并包含native code编译样本的地址。因此,我的问题是:使用以下字段确定样本是p-code还是native-code是否安全?

ObjectInfo结构内部,存在偏移量0x200x24的字段,分别称为wMethodCountlpMethods。对于p-code编译的样本,我注意到lpMethods字段指向该对象的方法数组。我不明白的是出现在数组中实际方法地址之前的零字节。为了更清楚起见,我包括以下图片: ObjectInfo结构,而第二张图片是lpMethods字段指向的方法数组。注意实际方法地址之前的8个零字节(在其他一些示例上,有8个以上的零字节,因此它并不总是那个数字)。我想知道的是那些零字节?



最后是我的最后一个问题。在PublicObjectDescriptor结构中,在偏移量0x1C处有一个名为dwMethodCount的字段,其描述为Number of methods in Object。同样,在ObjectInfo结构内部有一个名为wMethodCount的字段,在OptionalObjectInfo中有一​​个称为wEventCountdwControlCount的字段。我想知道的是这些领域之间的关系。

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



评论

您尝试过VB反编译器吗?以下是修改VB可执行文件的两个示例:-remkoweijnen.nl/blog/2013/01/02/…-remkoweijnen.nl/blog/2012/08/04/…

#1 楼

免责声明:由于VB文件结构仍未记录,因此,如果不对格式进行完全反向工程,我们将无法提供保证的答案。正如您和其他人所提到的那样,Ionescu和其他人已经尝试了这种方法。

我将尽我所能尝试回答您的问题,而无需打开任何反向工程工具。如果您想问别人如何对VB文件格式和相关的可执行文件进行逆向工程,我建议您专门针对该主题提出另一个问题。有根据的猜测):


作为未记录的格式,我们不仅不能提供保证的“是”,而且格式和/或那些假设可能会在将来的版本中更改。对于像VB6一样古老的格式,这种情况不太可能发生,因为这种格式已被废弃,所以非常不可能。在这种情况下,这似乎是一个合理的假设。
由于ObjectInfoPublicObjectDescriptor结构是分开的,所以我可以假设null数组中的ObjectInfo.lpMethods值表示未实现方法(在PublicObjectDescriptor中由名称定义)通过ObjectInfo。再次,这是一个有根据的猜测,应进行进一步的逆向工程来验证它。
我相信,由于PublicObjectDescriptor承担着面向外部的对象描述的作用,因此它被用来完整地描述对象。 ObjectInfo在对象的p-code部分上更为外部和特定。因此,在p-code中完全实现的对象的ObjectInfo.wMethodCount等于其PublicObjectDescriptor.dwMethodCount,而部分(或完全)本地实现的对象的PublicObjectDescriptor.dwMethodCountObjectInfo.wMethodCount更高。