转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
关于VB中数据的存储格式和寻址方式         ★★★★

关于VB中数据的存储格式和寻址方式

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1573 更新时间:2009/4/23 15:42:23

关于VB中数据的存储格式和寻址方式

前言:
大家最喜欢破什么语言写的软件?相信没人会回答VB,好像一种语言越是“高级”,越是“傻瓜”,编译系统自动加入的代码就越多,会把源程序的意图隐藏起来,破解的难度反而越大(我指的是完全破解出算法,写出注册机)。用ASM直接写的程序,反汇编的结果和源程序相似得可怕,用VC写的也比较容易读懂,用DELPHI写的就有一定难度了,不过毕竟还有一个好用的DEDE,VB写的呢?冗长的代码,复杂的存储方式,铺天盖地的DLL,足以让人崩溃。以前大概用VB的还都是些菜鸟级的程序员,加的保护也非常简单,破解VB程序还不算太困难,到了现在,好像VB已经成了一种把代码复杂化的加壳软件,纷纷被各路编程好手采用,把高难度的算法用超复杂的代码保护起来,呜呼哀哉!最近连遇几个软件,全是AsProtect+VB(好像还是P-CODE),令人郁闷的组合,几天破解未果,想从头把关于VB的一些东东仔细研究一下,于是就有了这篇文章。我想高手们大概早就研究过了,也许是不屑写出来而己,还请各位多多指点。

先看看VB常用的数据类型有哪些:

代码:
Byte    1个字节    0到255   Boolean    2个字节    True或False Integer    2个字节    -32,768到32,767 Long(长整型)  4个字节    -2,147,483,648到2,147,483,647 Single(单精度浮点型)  4个字节    负数时从-3.402823E38到-1.401298E-45           正数时从1.401298E-45到3.402823E38 Double(双精度浮点型)  8个字节    负数时从-1.79769313486232E308到-4.94065645841247E-324           正数时从4.94065645841247E-324到1.79769313486232E308 Currency(变比整型)  8个字节    从-922,337,203,685,477.5808到922,337,203,685,477.5807 Decimal    14个字节  没有小数点时为+/-79,228,162,514,264,337,593,543,950,335           而小数点右边有28位数时为+/-7.9228162514264337593543950335           最小的非零值为+/-0.0000000000000000000000000001 Date    8个字节    100年1月1日到9999年12月31日 Object    4个字节    任何Object引用 String(变长)  10字节+串长度  0到大约20亿 String(定长)  字符串长度1到大约65,400 Variant(数字)  16个字节  任何数字值,最大可达Double的范围 Variant(字符)  22个字节+串长度  与变长String有相同的范围

像Integer,Long,Single,Double等“直接”的类型比较容易,和其他的语言一样直接看内存就可以了。
比较特殊的是Currency,他的值要除10000才是真正的值,不过这个用的不多。
最麻烦的是Variant类型,因为VB是设计成一种傻瓜式的语言,对数据类型没有严格的规定,甚至可以不用声明变量而直接使用,所以在反汇编后的VB程序中,关于类型转换的语句占了很大一部分,只要一涉及数据计算,总会看到一堆数来回转换,其中许多函数的参数,还有未经声明直接使用的变量等,都是Variant类型。这种类型在VB中到处要用到,十分重要,但又常常使人困惑。它在内存中的寻址方式很特殊,为此VB还专门为其提供了一组函数(多带有Var字样),这些函数其实大多放在Oleaut32.dll中,但往往再由msvbvm60.dll来调用,比如__vbaVarTstEq,__vbaVarTstNe,__vbaVarMove,__vbaVarAdd,__vbaVarSub,VarBstrCmp等等。Variant变量的寻址方式在看雪的书中略有提及但不详细,我在这里补充一些:

首先我们必须明白,那些未声明类型的Variant变量并不是真的没有数据类型,只不过是VB编译系统将这些变量的“类型信息”也包含在变量的数据中了,等到程序运行时根据对该变量所进行的操作来灵活地决定变量属于什么类型,比如有这么几句
代码:
Dim roba As Variant roba=4321 Text1.Text=roba

程序声明了一个Variant变量roba(或者干脆什么也没声明)又给它赋了一个值4321,那么编译器就知道这时候roba是一个Integer型变量,可是下面呢又把它赋值给了Text1.Text(也就是在一个文本框里把4321显示出来)这时候编译器马上又插入语句使roba变为字符串型变量。(真是难为M$那帮人了)

那么这种变量究竟是怎样存储的呢?看下面的例子:
代码:
Private Sub Command1_Click() Dim a, b As Variant a = "RoBa" b = Text1.Text If a = b Then MsgBox "Well done!", vbOKOnly, "Crack" End If End Sub

用W32DASM反汇编,查找字串,很容易找到下面:
代码:
:00401D49 8D45DC                  lea eax, dword ptr [ebp-24] :00401D4C 8D4DCC                  lea ecx, dword ptr [ebp-34] :00401D4F 50                      push eax      ;变量a :00401D50 51                      push ecx      ;变量b * Reference To: MSVBVM60.__vbaVarTstEq, Ord:0000h                                   | :00401D51 FF1540104000            Call dword ptr [00401040]  ;比较 :00401D57 6685C0                  test ax, ax :00401D5A 0F8484000000            je 00401DE4      ;不同就跳走了 * Reference To: MSVBVM60.__vbaVarDup, Ord:0000h                                   | :00401D60 8B3D7C104000            mov edi, dword ptr [0040107C] :00401D66 B904000280              mov ecx, 80020004 :00401D6B 894D8C                  mov dword ptr [ebp-74], ecx :00401D6E B80A000000              mov eax, 0000000A :00401D73 894D9C                  mov dword ptr [ebp-64], ecx :00401D76 8D9564FFFFFF            lea edx, dword ptr [ebp+FFFFFF64] :00401D7C 8D4DA4                  lea ecx, dword ptr [ebp-5C] :00401D7F 894584                  mov dword ptr [ebp-7C], eax :00401D82 894594                  mov dword ptr [ebp-6C], eax * Possible StringData Ref from Code Obj ->"CCrack"                                   | :00401D85 C7856CFFFFFFFC174000    mov dword ptr [ebp+FFFFFF6C], 004017FC :00401D8F 899D64FFFFFF            mov dword ptr [ebp+FFFFFF64], ebx :00401D95 FFD7                    call edi :00401D97 8D9574FFFFFF            lea edx, dword ptr [ebp+FFFFFF74] :00401D9D 8D4DB4                  lea ecx, dword ptr [ebp-4C] * Possible StringData Ref from Code Obj ->"WWell done!"                                   | :00401DA0 C7857CFFFFFFE0174000    mov dword ptr [ebp+FFFFFF7C], 004017E0 :00401DAA 899D74FFFFFF            mov dword ptr [ebp+FFFFFF74], ebx :00401DB0 FFD7                    call edi :00401DB2 8D5584                  lea edx, dword ptr [ebp-7C] :00401DB5 8D4594                  lea eax, dword ptr [ebp-6C] :00401DB8 52                      push edx :00401DB9 8D4DA4                  lea ecx, dword ptr [ebp-5C] :00401DBC 50                      push eax :00401DBD 51                      push ecx :00401DBE 8D55B4                  lea edx, dword ptr [ebp-4C] :00401DC1 56                 &nbs

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台