好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

8页
  • 卖家[上传人]:碎****木
  • 文档编号:234647765
  • 上传时间:2022-01-04
  • 文档格式:DOCX
  • 文档大小:23.98KB
  • / 8 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 关于 VB 中数据的存储格式和寻址方式前言:大家最喜欢破什么语言写的软件?相信没人会回答 VB,好像一种语言越是“高级”,越是“傻瓜”,编译系统自动加入的代码就越多,会把源程序的意图隐藏起来,破解的难度反而越大(我指的是完全破解出算法,写出注册机)用 ASM 直接写的程序,反汇编的结果和源程序相似得可怕,用 VC 写的也比较容易读懂, 用 DELPHI 写的就有一定难度了,不过毕竟还有一个好用的DEDE,VB 写的呢?冗长的代码,复杂的存储方式,铺天盖地的 DLL,足以让人崩溃以前大概用VB 的还都是些菜鸟级的程序员,加的保护也非常简单, 破解 VB 程序还不算太困难,到了现在,好像VB 已经成了一种把代码复杂化的加壳软件,纷纷被各路编程好手采用,把高难度的算法用超复杂的代码保护起来,呜呼哀哉!最近连遇几个软件,全是AsProtect+VB(好像还是 P-CODE),令人郁闷的组合,几天破解未果,想从头把关于VB 的一些东东仔细研究一下,于是就有了这篇文章我想高手们大概早就研究过了,也许是不屑写出来而己,还请各位多多指点先看看 VB 常用的数据类型有哪些: 代码:Byte 1 个字节 0 到 255Boolean 2 个字节 True 或 False Integer 2 个字节 -32,768 到 32,767Long(长整型) 4 个字节 -2,147,483,648 到 2,147,483,647Single(单精度浮点型) 4 个字节 负数时从-3.402823E38 到-1.401298E-45 正数时从 1.401298E-45 到 3.402823E38Double(双精度浮点型) 8 个字节 负数时从-1.79769313486232E308 到-4.94065645841247E-324 正数时从 4.94065645841247E-324 到 1.79769313486232E308Currency(变比整型) 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.0000000000000000000000000001Date 8 个字节 100 年 1 月 1 日到 9999 年 12 月 31 日Object 4 个字节 任何 Object 引用String(变长) 10 字节+串长度 0 到大约 20 亿String(定长) 字符串长度 1 到大约 65,400Variant(数字) 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 ThenMsgBox "Well done!", vbOKOnly, "Crack" End IfEnd Sub用 W32DASM 反汇编,查找字串,很容易找到下面: 代码::00401D49 8D45DC lea eax, dword ptr [ebp-24]:00401D4C 8D4DCC lea ecx, dword ptr [ebp-34]:00401D4F50push eax;变量a:00401D5051push 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!"|:00401DA0C7857CFFFFFFE0174000mov dword ptr [ebp+FFFFFF7C],004017E0:00401DAA899D74FFFFFFmov dword ptr [ebp+FFFFFF74],ebx:00401DB0FFD7call edi:00401DB28D5584lea edx, dword ptr [ebp-7C]:00401DB58D4594lea eax, dword ptr [ebp-6C]:00401DB852push edx:00401DB98D4DA4lea ecx, dword ptr [ebp-5C]:00401DBC50push eax:00401DBD51push ecx:00401DBE8D55B4lea edx, dword ptr [ebp-4C]:00401DC156push esi:00401DC252push edx* Reference To: MSVBVM60.rtcMsgBox, Ord:0253h|:00401DC3 FF1528104000 Call dword ptr [00401028] ;出现成功对话框很明显的比较方式,用SoftICE 跟一下,胡乱输入 1111,中断在 401D51 处,可是当D eax,D ecx 时只能看到 08:d eax016F:0063F3EC0800000000004A21-CC0F510086726F17......J!..Q..ro.016F:0063F3FCF4F86300B6104000-34F36300A0104000..c...@.4.c...@.016F:0063F40C010000001CF46300-73AD0266CC055100......c.s..f..Q.:d ecx016F:0063F3DC080000003618768B-E00F51000C000D00....6.v...Q.....016F:0063F3EC0800000000004A21-CC0F510086726F17......J!..Q..ro.016F:0063F3FCF4F86300B6104000-34F36300A0104000..c...@.4.c...@.当然不可能是把两个 08 比较,实际的UNICODE 字串地址是在 8 个字节后的地方。

      即 510FCC 和 510FE0:d 510fcc016F:00510FCC52006F。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.