1.VB的介绍
今天我们来介绍一下Visual Basic样本的分析技巧。Visual Basic 是一种具有良好图形用户界面的程序设计语言。 Visual的意思是“可视的”,也就是直观的编程方法,在编程时不需要编写大量代码去描述界面元素的外观和位置,只需把预先建立的对象拖放到窗体上。Basic是指BASIC语言,VB使用了BASIC语言作为代码。
VB采用面向对象和事件驱动的程序设计机制,这种机制下,VB程序往往是多线程的,在分析过程中定位主线程和事件处理过程尤为重要。
在编译方式上,VB既有直接编译生成的可执行程序,也有间接编译生成的可执行程序,不同的编译方式有不同的分析方法。直接编译又被称为自然编译(Native-Compile),是编译器将高级语言转化为汇编代码,并经链接生成exe程序的过程;间接编译又被称为伪编译(Pcode-Compile),伪编译是编译器将高级语言转换为某种语言后,将其解释、执行此代码的一段程序一同链接,生成exe程序。
Visual Basic 1~4都必须将源代码编译成 VB 伪代码后解释执行,都是P-code,之前文章中介绍的python、java编译的实质也是这个。此类解释型语言,都有对应的反编译器,可以使用Dodi’s VB 3/4 Disassembler反编译VB3和VB4的VB程序。VB 1~4已经很古老了,笔者在实际工作中从来没有遇到过,在此就不作分析。
VB7以及之后的VB版本,又被称作VB.Net,可以采用.Net程序的分析方式进行分析,这在本系列之后的文章中再做介绍。
在实际工作中,遇到最多的VB程序是VB5和VB6,这也将是本文分析的重点。VB3和VB4,VB程序都是P-code 编译,单纯调用 vbrun.dll解释执行。到了VB5,微软在继续保留 P-code 编译的同时也引入了 Native 编译方式,其运行库变为msvbvm.dll。接下来就针对这两种编译方式生成的VB程序进行分析。
2.Native和PCode比较
2.1.Native自然编译
自然编译的VB程序,直接生成x86汇编代码,可以直接使用OD、IDA进行分析。 但是需要注意的是,VB函数的调用遵循 stdcall 原则,即函数入口参数按从右到左的顺序入栈,并由被调用的函数在返回前清理传送参数的内存栈。而且VB程序不是直接调用Windows API函数,而是调用VB库里的函数。如图所示的是某个VB样本的导入函数情况,所有导入函数都来自于msvbvm*.dll。 由此可见,熟悉VB库里的函数,在分析Native编译的VB样本时能够事半功倍。下图是是笔者在《加密与解密》一书中截取的VB函数列表片段,更详细的内容,可以阅读《加密与解密》一书:
同时,VB的程序中会有大量对控件属性的操作,这些操作往往是通过虚函数实现的。所以在OD动态调试时,会发现有大量call [ecx+*]形式的调用,可以通过查表迅速定位其调用的函数,下表摘自《软件加密技术内幕》:
2.2.Pcode伪编译
运行时依赖解释器将伪代码翻译为汇编代码再执行。 如图所示,是Pcode编译的VB程序反汇编得到的结果的片段,可以看到Pcode编译得到的是Pcode汇编代码,而不是直接得到x86汇编代码。
Pcode编译的VB程序,在执行时会调用msvbvm*.dll首先对Pcode汇编进行解释,翻译成x86汇编代码,然后才能由CPU执行。如果使用OD跟踪Pcode编译的VB程序,很容易迷失在伪代码解释引擎中。
Pcode指令速查https://www.52pojie.cn/forum.php?mod=viewthread&tid=70403 。
2.3.编译方式识别
①使用DetectItEasy能直接识别Native和PCode编译: ②导入函数数量上的比较,Native编译的程序往往有比Pcode编译的程序更多的导入函数: ③汇编代码比较,Native编译直接反汇编为x86汇编语言,Pcode编译反汇编为Pcode伪汇编代码:
3.分析工具和技巧:
3.1.VB Decompiler
VB Decompiler目前是VB程序逆向分析最强大的功能,支持VB5/6,同时支持Native和Pcode编译的程序。 此软件使用也很简单,直接将VB程序拖拽进VBDe即可,该软件能将VB窗体的事件处理过程识别出来,还能显示对应的反汇编和反编译代码: VB Decompiler是一款静态分析工具,没有办法动态调试。如果是Native程序,可以结合OD进行动态调试,如果是Pcode程序,就需要使用WKTVBDebugger。
3.2.WKTVBDebugger
WKTVBDebugger是一款古老的软件,也是Pcode程序最好用的调试软件。此软件的具体使用可以参考https://www.52pojie.cn/thread-33119-1-1.html。
此软件在使用中,有几个方面要注意: ①待分析的VB程序需要和复制到 WKTVBDebugger 安装目录里调试,即与 Loader.exe 同一目录; ②需要将安装目录的 WKTVBDE.dll 文件复制到系统目录里; ③需要将 MSVBVM60.DLL 替换成 2003 年以前版本。
3.3.VB程序真正的入口
如图所示,VB程序的ENTRY POINT进入后第一个指令是push指令,如果我们从这里开始分析,就会进入编译器的代码中,浪费大量的分析时间,所以我们需要定位VB程序真正的入口。 push xxxxxxxx压入的实际上是一个指针,指向VBHEADER的结构。此结构体的解析如下:
我们需要重点关注VBHEADER结构体中的成员pSubMain,这才是VB程序真正的入口。 在本例中,入口地址是0x4327b0,接下来我们可以下段直接运行到这里,然后再进行分析:
参考资料:
https://bbs.pediy.com/thread-28715.htm https://bbs.pediy.com/thread-29307.htm http://www.baike.com/wiki/VB https://r3mrum.wordpress.com/2017/06/07/defeating-the-vb5-packer/ 《加密与解密 第四版》 《软件加密技术内幕》