vb6反编译详解_[原创]VB6反编译详解(一)

[原创]VB6反编译详解(一)

2006-7-9 16:59

23171

[原创]VB6反编译详解(一)

2006-7-9 16:59

23171

VB6反编译详解 by Kenmark-Fenix

**************************************************

最新于2006-7-13更新!

**************************************************

写本文已经惦记了好几年了,由于一直没有完整的资料和充裕的时间,所以一直没有动手。

在这里一方面是写给大家看看,另一方面是招募更多有志于反编译VB6的同志们一起来研究学习!

我的E-MAIL:ken.mingyuan@hotmail.com ken.mingyuan@gmail.com

我的BLOG: blog.csdn.net/kenmark

我的QQ:188916915

十分期待着与大家一起学习!

――Kenmark

VB6是一个半编译半解释的语言,编译后程序主要在运行库MSVBVM60.DLL下转悠,通过与MSVBVM60的互动来完成程序运行的过程。

1.引入(参考:《VB程序大揭密》我的博客上有转载http://blog.csdn.net/Kenmark/archive/2005/08/11/450985.aspx)

我们用W32DASM打开一个中型的VB程序来反汇编,我们发现程序中用到的MSGBOX÷FileCopy等理应对应API函数居然一个都没有出现在编译后程序的IMPORT TABLE里,一般VC和DEPHI都是直接出现在编译后程序的IMPORT TABLE里的,而我们的VB程序用到了如此之多的API函数居然只使用了一个DLL――MSVBVM60.DLL。

然后用工具打开MSVBVM60.DLL,一看,输出的函数还真不少,其中有用__vba和rtc开头的也有直接就是函数名的,仔细一看,哇赛,可以说完全是一个windows API的代理,应有尽有:

rtcRandomize :Randomize 函数的对应API;

rtcMidCharVar :Mid 函数的对应API;

rtcLeftCharVar、rtcRightCharVar :看出来了吧,这些是Left、Right函数的对应API;

rtcUpperCaseVar :UCase 函数的对应API;

rtcKillFiles :Kill 语句的对应API;

rtcFileCopy :FileCopy 语句的对应API;

rtcFileLength :EOF、FileLen函数的对应API;

rtcGetTimer :Randomize Timer中获取Timer的对应API;

rtcShell :Shell函数的的对应API;

rtcMakeDir :MkDir 语句的对应API;

rtcRemoveDir :RmDir 语句的对应API;

rtcDir :Dir 函数的对应API;

rtcSpaceVar :Space 函数的对应API;

原来,所有VB的操作函数都是在调用MSVBVM60.DLL里面实现

前缀是rtc的是一般的语句和函数

涉及字符串处理的都叫var,例如:

__vbaUbound : UBound 的对应API;

__vbaFileOpen :Open 语句的对应API;

__vbaStrCmp :比较两个字符串:If String1 = String2 Then ......

__vbaVarOr :Or 运算符的对应API;

__vbaRedim :Redim 语句的对应API;

__vbaRedimPreserve :Redim 语句加上 Preserve 参数的对应API;

__vbaGet、vbaPut :Get、Put语句的对应API……

我们还看到一个DLL:DllFunctionCall,这个就是我们调用其他DLL时需要向MSVBVM60申请的,…………。

可以说VB的程序是一个包裹在MSVBVM60阴影控制下的孩子,所有的操作都要直接向它请求,而MSVBVM60完全可以称得上是一个代理的机器。从程序开始,到运行中的所有操作,函数调用,错误报告等等,都是由它一手包办的。

来吧,我们这里不是来介绍它是怎么构成的我们要搞掉它虚伪的外表,把我们的代码从MSVBVM60的封建保护下救出来。

我的资料大量是参考一个开源的VB程序解析程序(居然也是用VB编写的),这个程序可以完全分析出VB程序(没有加壳)的PROJECT信息以及完全将FORM变回来,对于代码呢,可以获得SUB MAIN的汇编代码地址,但是不能返回到VB代码,里面还内置了一个假的反汇编器,以后我会说的!

我提供了它的下载,大家去看看,不知道它的资料是哪里来的十分全面,就是用VB写的比较繁!还有由于界面控制太多,代码有点乱!

2.程序初始化

我们用W32DASM打开任何VB程序,跳到ENTRY POINT之后看到的总是一个PUSH *****一个地址,然构调用MSVBVM60.DLL的ThunRTMain

而在VC程序里,我们至少要看到进程的创建什么的,其实这个VB函数是一切的开端,由它开始来解析整个编译后的程序,完成系统环境的初始化,然后找到真正的程序入口,跳转到程序的领空。

所以这个PUSH指令压入栈的是VBEXE(姑且这么称呼)初始化结构的开始。我们存下这个地址(这个是一个VA要正确地转换成文件地OFFSET先要-ImageBase然后要对照块表,可以用工具完成,熟悉了一下就能看出来),然后我们跳到那里。

看看是什么,哇赛,是VB程序的招牌也!“VB5!”是所有VB程序初始化结构入口地址指向的MAGIC字符,找到这里,开始能够读取VB初始化结构了(我们现在做的就是ThunRTMain要完成的)

我们开始了!

部分名词解读:

RVA 相对虚拟地址,一般需要使用RVA2Offset来将其转换成绝对的文件偏移                                变量前缀为pr或是a

VA 虚拟地址,减去IMAGEBASE就是RVA                                                                                                                                                                变量前缀为p或是a

offset 相对结构的偏移                                                                                                                                                                                                                变量前缀为o

1)VBHEADER

从PE文件的ENTRY POINT进入后第一个指令是压入一个指针来表示VBHEADER的位置,这个指令为

push xxxxxxxx地址是经过基址IMAGE_BASE偏移后的地址,所以减去IMAGE_BASE后获得的就是VBHEADER开始的VA然后用PEFile类中的函数加以分析可以得到的是文件中VBHEADER的偏移量。

这个指令在机器码中是这样表示的:68 C0 11 40 00

68是PUSH的机器码,而后是内存存储方式的地址化成汇编语言就是:

push 004011c0 所以减去基址后就是11C0然后进行VA2OFFSET得到的是11c0的偏移,转向那段数据就能得到VBHEADER。

这是VBHEADER结构的C语言描述:

typedef struct

{

char Signature[4];                // 四个字节的签名符号,和PEHEADER里的那个signature是类似性质的东西,VB文件都是"VB5!"

WORD RtBuild;                                        // 运行时创立的变量(类似编译的时间)

BYTE LangDLL[14];                        // 语言DLL文件的名字(如果是0x2A的话就代表是空或者是默认的)

BYTE BakLangDLL[14];        // 备份DLL语言文件的名字(如果是0x7F的话就代表是空或者是默认的,改变这个值堆EXE文件的运行没有作用)

WORD RtDLLVer;                                // 运行是DLL文件的版本

DWORD LangID;                                        // 语言的ID

DWORD BakLangID;                        // 备份语言的ID(只有当语言ID存在时它才存在)

DWORD pSubMain;                                // RVA(实际研究下来是VA) sub main过程的地址指针(3.)(如果时00000000则代表这个EXE时从FORM窗体文件开始运行的)

DWORD pProjInfo;                        // VA 工程信息的地址指针,指向一个ProjectInfo_t结构(2.)

DWORD fMDLIntObjs;                // ?详细见"MDL 内部组建的标志表"

DWORD fMDLIntObjs2;                // ?详细见"MDL 内部组建的标志表"

DWORD ThreadFlags;                // 线程的标志

//* 标记的定义(ThreadFlags数值的含义)

//+-------+----------------+--------------------------------------------------------+

//| 值    | 名字           | 描述                                                                           |

//+-------+----------------+--------------------------------------------------------+

//|  0x01 | ApartmentModel | 特别化的多线程使用一个分开的模型                                                                                                |

//|  0x02 | RequireLicense | 特别化需要进行认证(只对OCX)                                                                                         |

//|  0x04 | Unattended     | 特别化的没有GUI图形界面的元素需要初始化                                                                |

//|  0x08 | SingleThreaded | 特别化的静态区时单线程的                         

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果vb反编译编译出的程序不能更改,可以考虑以下几种解决方案: 1. 重新编写程序:根据反编译出的代码,重新编写程序。虽然可能比较耗时,但这是最稳妥的方式,可以确保程序的稳定性和安全性。 2. 申请源代码:如果反编译得到的程序是你需要修改的程序,可以尝试与原开发者或拥有源代码的人联系,请求源代码。说明你的需求和原因,希望他们能够给予帮助或合作。 3. 使用其他工具:尝试使用其他可以修改已编译程序的工具。虽然可能不如源代码那样灵活,但仍然可以进行一些简单的修改和调整。 4. 跟踪反编译过程:对于反编译无法修改的程序,可以尝试跟踪整个反编译过程,找出限制修改的原因,也许可以通过解决这些限制来实现修改。 总之,如果vb反编译编译出的程序不能更改,需要根据具体情况选择适当的解决方案。但无论如何,都应该尊重知识产权,遵循法律法规的规定。 ### 回答2: 如果通过VB反编译编译出的程序不能更改,我们可以采取以下几个解决方法: 1. 寻找其他可编辑的源代码:尝试找到原始的VB源代码文件,如果能够找到并且确保源代码的合法性,我们可以进行修改和重新编译。 2. 使用逆向工程方法:利用逆向工程技术,我们可以通过分析和理解程序的功能特征,重新编写一个类似的程序,以满足我们的需求。这需要有一定的编程知识和经验。 3. 与开发者或作者沟通:联系程序的开发者或作者,向他们询问如何更改程序。他们可能会提供一些方法或资源,帮助我们进行修改。 4. 尝试使用其他工具或语言:如果VB编译程序无法进行修改,我们可以尝试使用其他编程语言或工具,将程序重新实现。这可能需要学习新的语言和平台,或者请专业的开发人员帮助完成。 总之,当通过VB反编译编译的程序无法更改时,我们需要寻找其他的解决方案,如寻找源代码、逆向工程、与开发者沟通或使用其他工具或语言来重新实现程序。 ### 回答3: 如果使用VB反编译和编译出的程序无法更改,我们可以尝试以下几种解决方法: 1. 检查程序是否有保护机制:有些程序在编译时会加入保护机制来防止被修改。如果程序使用了保护机制,我们需要了解具体的保护方法,然后解除或者绕过这些保护机制。 2. 使用特殊的工具或技术:在反编译和编译过程中,我们可以尝试使用一些特殊的工具或技术来绕过或解决无法修改的问题。这些工具和技术可能需要一定的专业知识和技能,需要具备相关的编程经验才能进行操作。 3. 重新编写程序:如果无法修改已经编译好的程序,我们可以考虑重新编写一个具有相同功能的程序。这样我们就可以完全控制程序的代码,可以根据需要进行修改和调整。 4. 寻求开发者的协助:如果我们无法解决无法修改的问题,我们可以联系程序的开发者,说明我们的需求并寻求他们的协助。开发者可能能够为我们提供解决方案,或者根据我们的需求进行定制修改。 无论采取何种方法,我们都应该遵守相关的法律法规,尊重知识产权,遵守合法的使用规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值