-
-
[原创]VB P-code -- 调试器的革命
-
发表于:
2004-12-26 11:00
19392
-
*岁末大盘点*
VB P-code -- 调试器的革命
作者:cyclotron
在上一篇《VB P-code -- 虚拟机的艺术》的最后,专业的VB P-code调试器WKTVBDebugger隆重登场了。这个具有划时代意义的VB P-code调试器,掀开了解释型语言程序调试策略的崭新一页,它不仅仅给VB P-code程序的调试带来了极大的方便,其编写思想和运作机制也给人以深刻启发。在本篇中,我将为大家简要介绍这一调试器的各种特性和使用方法。
WKTVBDebugger出现以前,VB P-code程序的跟踪和逆向是一件令人烦恼的工作。我在上一篇中详细介绍了VB P-code虚拟机的运作机制以及用OllyDBG跟踪P-code程序的过程,相信大家对跟踪之困难深有体会--我们不得不花费大量的时间跟踪虚拟机的解释行为,难以将注意力集中到P-code程序本身。然而,在当时,OllyDBG和SoftICE是我们唯一的选择。
WKTVBDebugger的出现,使我们摆脱了困境。这一调试器完全以单个伪代码指令为执行单元,包括跟踪、设断、修改等各个方面都完全以伪代码为基础,彻底屏蔽了虚拟机的解释细节,使我们感觉就像是在直接调试P-code可执行文件的功能一样。举例来说,假如程序执行了一条Variant型变量的加法伪指令,我们在调试器中跟踪的不是我在上一篇文章中列出的冗长的虚拟机指令,而是AddVar这一句指令(严格地说,AddVar只是助记符),不仅操作码如此,每一条伪指令的操作数我们也可以方便地通过堆栈来观察。
WKTVBDebugger的实现,同VB P-code虚拟机运作机制以及伪指令的研究是密不可分的。
大多数朋友都知道基于本地机器码的调试器实现的基本原理,在这类调试器中,通过设置单步跟踪标志位,可以在每执行一句指令以后就产生单步调试断点,将控制权转移给调试器,于是调试器在执行下一句指令前按照特定的意图观察寄存器的状态并修改程序的执行流程;此外,调试器可以通过在指定的指令位置插入CC(int 3),在该处引起断点,捕获异常并取得控制权。特别地,在Win32环境下,这类断点在Ring 3下形成异常,由Windows系统向调试器发送异常处理信息,调试器由此获得处理异常的优先权。然而,对于由虚拟机解释执行的伪代码,因为系统并未给程序开发人员特意留出标准的调试接口,异常的处理对用户而言也是透明的,传统的调试器原理便无法在此应用。
明显地,WKTVBDebugger的作者Mr. Silver和Mr. Snow并没有就此止步,他们使用了一种类似于Hook的方法,把调试器代码插入到虚拟机和VB P-code伪代码之间,巧妙地解决了如何让调试器取得控制权的问题,这也就是我在本文开头谈到的具有启发意义的地方。大家应该还记得我曾介绍过的VB P-code虚拟机伪代码读取引擎:
XOR EAX,EAX
MOV AL,BYTE PTR DS:[ESI+2]
ADD ESI,3
JMP DWORD PTR DS:[EAX*4+6A37DA58]
Esi始终指向伪指令流,虚拟机读取下一句伪指令的操作码以后,又把esi指向次级操作码(如果是具有多级操作码的伪指令的话)或者操作数,每一句jmp指令都通过跳转地址表跳向下一句伪指令的解释单元……等等,聪明的你也许已经想到了--如果让这里的跳转地址指向我们自己的调试代码,不就可以在下一句伪指令执行前取得控制权了吗?这个想法真是绝妙,事实上,我们只要把6A37DA58指向的跳转地址表的所有地址指向我们自己的调试器代码,就可以在所有的P-code伪指令前取得控制权了!取得控制权以后,我们能干什么呢?al此时保存着伪指令的操作码,esi指向伪指令的操作数,我们可以把对应的伪指令助记符在调试器窗口中显示出来,可以判断当前的地址是否需要中断……总之,程序的流程已经尽在掌握。一旦调试器的任务完成,就恢复现场的寄存器环境,根据原来的跳转地址表跳向下一句指令的解释单元。这就是WKTVBDebugger Hook的基本原理。
调试器的基本框架有了,随之而来的是伪指令的解释问题。Microsoft定义了VB P-code指令规范,但却没有把它们公开。这不是一个大问题,无论如何,这套指令规范是可以获得的。这里要感谢Josephco,他的VB P-code反编译器Exdec在这方面做了许多先驱性的工作。另外,我推荐两款相当不错的国产VB P-code反编译器:万涛编写的VBExplorer和ljtt编写的VBParser。严格地说,VBExplorer并不是一个纯粹的反编译器,它还可以编辑修改VB控件的各种属性,但反编译功能做得还不精。相比之下,VBParser就是一个专业的反编译器了。
WKTVBDebugger是逆向工程领域的专家们共同努力的结果,当我们借助这一工具窥探VB P-code程序的精髓时,不能不心怀感激。
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!