教你如何让VB代码调试器
评论:对P码简介这是一个新的名词术语的P也不是微软发明的,和P是一个简单的伪指令,简单地理解和执行。因此,我们不需要描述它的任何复杂的专业vocabulary.p-code可以被认为是一种常见的机器级代码(微处理器不能解释它)。之前运行代码,你需要一个翻译
对P码简介
这是一个新的名词术语的P也不是微软发明的,和P是一个简单的伪指令,简单地理解和执行。因此,我们不需要描述它的任何复杂的专业vocabulary.p-code可以被认为是一种常见的机器级代码(微处理器不能解释它)。之前运行代码,你需要一个翻译来处理并转换成机器语言代码是可以理解的,CPU。这个过程看起来有点像java。为了执行应用程序用java语言写的,我们需要一个翻译,翻译机,虚拟机Virtual Machine,富有想象力的术语实际上意味着它是一个转换机制,转换程序用java编写的代码,我们可以了解到CPU。
P码的优势是明显的,如果我们定义了一组特殊的专用指令集,并没有公布详细的定义了,所以一般人很难理解我们的代码;另一个优点是减少文件大小:通过定义一个独特的单字节指令代码,我们可以做一些伪指令执行序列操作(在大量的机器代码的工作相当完整)。这是真的,微软的Visual Basic代码是VB虚拟机代码到本地机器代码的翻译。虚拟机(以DLL形式)在代码执行程序来解释相关的VB伪指令调用。你已经猜到了,那些DLL的名字:
msvbvm50.dll msvbvm60.dll
该文件明确的名称是微软Visual Basic虚拟机(虚拟机),其次是信息的不同版本。两个版本都不是很不同:6版引入了一些新的指令,使用一个更直观的名字,在一些版本的5马克的指示。换句话说,只有6版本的变化在5版本中的指令的名称,而不是它的内在功能。
虚拟机不仅解释了Visual Basic代码文件,但它也用来执行编译后的机器代码。这是因为VB虚拟机(DLL文件)也包含API,所有VB程序调用。一个例子是rtcmsgbox,这是一个用VB实现的功能相当于标准的Windows API MessageBox。P-code程序由VB虚拟机解释,在VB中所有的功能都在这种间接的方式提供。
因此,当我们跟踪一个Windows API函数MessageBox的P-code程序,有一个严重的问题:我们必须跟踪P码伪指令。
SoftICE不能跟踪P码伪指令,它只能跟踪VB虚拟机的执行。更特别的是,SoftIce只能了解CPU处理器的机器代码,它不懂任何伪指令。我们将跟踪代码(代码伪指令会被转换成机器码这是可以理解的,我们的CPU执行)。
开始表(故事的开头)
几乎所有的事情都是这样:好奇心引发了一个新的挑战,我们的故事开始了。
我记得在讨论efnet网站VB P-code与格林先生问题(论坛)。他在工作上的时间、编译的应用程序。他告诉我,它的处理代码是非常困难的,所以我们必须做一个VB p-code.in事实调试程序的想法,布莱克先生认为这是一个有意义的思维方式。在这个项目的看法,我说,如果我们没有任何可用的资源,实现起来并不容易。我们查阅了很多资料,但没有有意义的发现,我们空手而归。好奇心使我更加努力地去探索有用的信息这是不容易啊。hellip;我和中岛幸惠先生有一些问题的讨论。他为我提供了一个msvbvm50修改的拉撒路,他描述了VB程序性能的所有可能的字符串比较。这促使我下决心做一个VB调试器。
我认为这是可能的msvbvm50运行时代码注入,注入的代码可以调用我的调试器,它是在DLL中实现的。我决定告诉中岛幸惠先生加入该项目,他负责制作代码注入(如装载机,我称之为装载机)调试(DLL)编码,即加载到调试器(DLL),就在我们俩已经做了一些工作,我们测试了它,它让人兴奋,真的很有效!调试器项目已经迈出了第一步。
我们可以控制VB虚拟机(拦截的相关操作),把我们的调试器的虚拟机和VB应用程序之间。最大的问题已经解决,但在初始阶段,我们采用的解决方案是不是最后的方法,我们采用。在我们的大目标和指导原则,我们有在不断改善直到我们完全避免虚拟机本身的修改。
*第一步
跟踪分析,控制虚拟机
让我们的调试工作,这是一个必须解决的关键问题:何时以及如何改进代码翻译转换会发生吗一旦我们认识到这,我们注入的代码将接管调试VB应用程序的控制和数据发送到我们的调试器。调试器处理操作的代码又回到VB虚拟机。我自己在调试器调试器的编码经验几乎为零,但最近我几乎完成了一个x86编译器,所以我将这些知识对我的工作的VB调试器的发展。这是我的想法:
对于拆卸/解释,代码的这一部分包含以下基本原则:
指针(指针)指向缓存区域(缓冲区),它包含要转换的数据。
控制程序读取操作指令(操作码)从缓存区和重定向程序流程使其针对我们要按照我们的意图执行程序的位置。
这项任务通常为两种形态:1、一系列控制描述语句(每个操作码);2、使用地址跳转表。我放弃了第一选择,因为有太多的不同的操作码的代码,这将需要一个巨大的条件控制结构(处理等工作将成为世界上最慢的东西)。我猜VB虚拟机使用的地址跳转表的方法来解释的p-code.this方法翻译过程中可能的操作代码也出现在我的设计中的反汇编。现在,我必须完成以下工作:
-在位置缓存区域、位置跳转地址表中解释操作代码
我设计并编译的一个VB小应用程序:
私有子form_load()
MsgBox你好这是P!!!!!
端子
我把msvbvm60.dll(VB6的虚拟机)到msvbvm60.dll(VB6的虚拟机)通过SoftICE的符号(符号装载机装载机),并设置禁止在_rtcmsgbox.when SoftICE中断,我返回的代码来调用_rtcmsgbox按F12。
电话 / / rtcmsgbox呼叫中
CMP EDI
66105595 / /锦州检查堆栈指针
XOR EAX,EAX / EAX来电登记缓存操作码下
MOV AL,{ } / /铝离子进入挂起的操作代码,演示,它为36h
添加指针偏移量(在ESI寄存器中)
JMP { EAX * 4 660fda58 } / /跳解释过程的伪指令操作码36h