VB可执行体内部数据结构浅析① VB头结构

第一次分析VB可执行体内部数据结构是几年前的事了,当时代码写的很混乱,现在刚好了解相关知识的时候,发现之前的代码可读性太差,所以一边重构代码,一边写篇文章复习下以前的成果。

一般使用反汇编工具来分析VB程序的入口点,结果都是以下形式:

首先push一个地址到栈里,紧接着调用MSVBVM60库里的ThunRTMain函数,并且不会立即返回。

这个地址指向的数据结构,我就管它叫做VB_HEADER,该数据结构是VB程序运行时至关重要的。

根据该结构,VB运行时(MSVBVM60)可以枚举该项目有多少个对象,对象有多少控件,控件又有多少的事件。程序该从何处执行,代码是否为P-Code等等。

下图简示了从VB_HEADER开始枚举每个对象的流程:

vb_01

这里说的’对象‘就是指原VB项目中的每个编译单元(frm/bas/ctl/cls/…),在编译完成后,都会以’对象‘的形式存在于最终二进制文件中。

而窗体对象进而会指出一个数据结构来描述所拥有的控件表,控件又会指出一个数据结构来描述所拥有的事件表。

下面是用C语言写的上图相关的数据结构:

因为VB内部的数据结构众多且较为复杂,所以本文只摘取相关的数据结构来讲解。

Print Friendly, PDF & Email

留下评论

1 × 5 =

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

%d 博主赞过: