目录

易语言类的研究

目录

编写易语言反编译器,需要对易语言的类进行研究,在这里记录一下。

1、易语言的类,只有继承这种关系,且每个类只准继承一个类。

这样的话就不存在什么菱形继承了。。。

2、编写测试用例,类3继承类2,类2继承类1,分别编写它们的构造函数和析构函数。

可以观察到函数调用顺序如下:

类1初始化 -> 类2初始化 -> 类3初始化 -> 类3析构 -> 类2析构 -> 类1析构

继续观察测试用例,可以发现每个类都一定会有一个虚表。其中类的构造函数不会存在于虚表之内。

虚表中的第一个函数一定是析构函数,如果类含有继承,那么多个类的析构函数会被合并到这一个函数中。

虚表中的第二个函数一定是拷贝函数,虚表之后剩下的都是成员函数了。

3、再看类的成员函数调用,会发现函数总是以这种形式调用

push eax
mov eax,dword ptr ss:[esp]
mov eax,dword ptr ds:[eax]
mov eax,dword ptr ds:[eax]
call dword ptr ds:[eax+虚表偏移]

很明显,这就是把thiscall转换成了stdcall,类成员函数的第一个参数一定是this指针。写个编译器懒成这样了。。。

4、再观察类的拷贝函数,发现第一条指令总是push eax,第二条指令总是push xxx。

特征码是50 68。

5、虚表命名为vtable好了,虚表指针命名为vfptr