170605 逆向-Delphi和VB的理论

来源:互联网 发布:深思考人工智能北京 编辑:程序博客网 时间:2024/05/16 18:50

1625-5 王子昂 总结《2017年6月5日》 【连续第247天总结】

A.Delphi程序和VB程序

B.Delphi和C++ Builder除了语言不通,其余几乎都相同

Delphi和C++ Builder采用的是VCL(可视化组件库)技术,环境使用一种特殊的资源格式RCDATA。

RCDATA中含有Delphi的窗体,所有对窗口设计的信息都包含在内。当一个典型的Delphi程序开始运行时,其初始化代码建立这种窗体,并从资源中读取所需要的信息。DFM文件是Delphi编码的二进制文件,编译时存储于RCDATA中。因此利用eXeScope等工具可以对它查看、编辑,或者改变程序的某些运行方式

DeDe利用上述原理进行反编译,获取相关信息,将界面与事件联系关系还原,但事件的汇编代码不能还原。

动态调试时会发现不能通过API函数来拦截文本框的数据,因为Delphi是通过向文本框发送WM_GETTEXT消息来获得文本框的内容的(直接调用WndProc,而没有使用消息函数),整个过程没有调用任何WIN32 API函数。

因此常用的API断点都是没办法的。

可以通过DeDe找到按钮的事件地址,在该地址处下断来跟踪(之前也就是这样做的)


程序运行时,首先会将类完成初始化,然后开始执行代码。

存在一个初始化表,其中包含了各个控件的信息。

程序的入口点就在初始化表后,因此在以后脱壳的时候,可以用这种方法确定入口点。同时一些壳会加密初始化表,需要还原。


VB3和4是典型的解释语言,它们都有相应的反编译器存在。而VB5和VB6则在继续保留P-code编译(即伪代码编译)的同时也引入了Native编译方式,使得生成本地二进制代码成为可能。

VB32位版本的字符串处理采用Unicode编码。因此当需要处理ASCII的时候常常要调用API(rtcAnsiValueBstr)转换;

VB4和以前的VB字符串格式很复杂,使用连续指针的方式,源指针指向一个由字符串长度和字符串首地址指针组合而成的结构,其中的字符串首地址指针再指向字符串。

VB5及以后的版本则是单指针方式,源指针指向一个复合字符串。开头的4个字节组成一个长整数,指示此字符串的长度,其后是字符串;另外字符串以“00”结尾,且不计算在长度之内。

编译器的编译技术可以分为Native-Compile自然编译与Pcode-Compile伪编译两种

自然编译是指编译器将高级语言转换为汇编代码,并经链接生成EXE程序的过程

伪编译是编译器将高级语言转换为某种编码,将能解释、执行此编码的一段程序一同连接, 生成EXE程序

由于伪代码实际只是“变形的源代码”,因此反编译起来比较容易

C.明日计划

VB的自然编译和伪编译的针对处理

原创粉丝点击