分享
分销 收藏 举报 申诉 / 8
播放页_导航下方通栏广告

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

  • 上传人:二***
  • 文档编号:4542430
  • 上传时间:2024-09-27
  • 格式:DOC
  • 页数:8
  • 大小:79KB
  • 下载积分:5 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    关于 VB 数据 存储 格式 寻址 方式
    资源描述:
    关于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                      push esi :00401DC2 52                      push edx * Reference To: MSVBVM60.rtcMsgBox, Ord:0253h                                   | :00401DC3 FF1528104000            Call dword ptr [00401028]  ;出现成功对话框 很明显的比较方式,用SoftICE跟一下,胡乱输入1111,中断在401D51处,可是当D eax,D ecx时只能看到08 :d eax 016F:0063F3EC 08 00 00 00 00 00 4A 21-CC 0F 51 00 86 72 6F 17  ......J!..Q..ro. 016F:0063F3FC F4 F8 63 00 B6 10 40 00-34 F3 63 00 A0 10 40 00  ..c...@.4.c...@. 016F:0063F40C 01 00 00 00 1C F4 63 00-73 AD 02 66 CC 05 51 00  ......c.s..f..Q. :d ecx 016F:0063F3DC 08 00 00 00 36 18 76 8B-E0 0F 51 00 0C 00 0D 00  ....6.v...Q..... 016F:0063F3EC 08 00 00 00 00 00 4A 21-CC 0F 51 00 86 72 6F 17  ......J!..Q..ro. 016F:0063F3FC F4 F8 63 00 B6 10 40 00-34 F3 63 00 A0 10 40 00  ..c...@.4.c...@. 当然不可能是把两个08比较,实际的UNICODE字串地址是在8个字节后的地方。即510FCC和510FE0 :d 510fcc 016F:00510FCC 52 00 6F 00 42 00 61 00-00 00 00 00 14 00 00 A0  R.o.B.a......... 016F:00510FDC 08 00 00 00 31 00 31 00-31 00 31 00 00 00 00 00  ....1.1.1.1..... 016F:00510FEC 11 00 00 A0 1C 00 41 00-0C 00 41 00 EC 0F 51 00  ......A...A...Q. :d 510fe0 016F:00510FE0 31 00 31 00 31 00 31 00-00 00 00 00 11 00 00 A0  1.1.1.1......... 016F:00510FF0 1C 00 41 00 0C 00 41 00-EC 0F 51 00 02 00 00 A0  ..A...A...Q..... 016F:00511000 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ................ 那么08是什么意思呢?为什么EAX,ECX要指向这么一个莫名其妙的值呢?我猜想那个08就是表示Varient的实际类型,换一个类型试试: 代码: Private Sub Command1_Click() Dim b As Variant b = Text1.Text If b = 5678 Then MsgBox "Well done!", vbOKOnly, "Crack" End If End Sub 代码: :00401D13 50                      push eax :00401D14 51                      push ecx :00401D15 C7857CFFFFFF2E160000    mov dword ptr [ebp+FFFFFF7C], 0000162E ;162Eh=5678 :00401D1F C78574FFFFFF02800000    mov dword ptr [ebp+FFFFFF74], 00008002 ;类型值 * Reference To: MSVBVM60.__vbaVarTstEq, Ord:0000h                                   | :00401D29 FF1540104000            Call dword ptr [00401040] :00401D2F 6685C0                  test ax, ax :00401D32 0F8484000000            je 00401DBC 在401D29时,d eax仍然看到08,d *(eax+8)可以看到我们随意输入的字符串,而d ecx时看到 :d ecx 016F:0063F384 02 80 00 00 66 24 27 06-2E 16 00 00 B0 00 DD 00  ....f$'......... 016F:0063F394 00 00 00 00 00 00 00 00-00 00 00 00 00 00 08 00  ................ 016F:0063F3A4 00 00 00 00 10 DB 01 00-0E 84 D7 3A 00 00 00 00  ...........:.... 可以看到02,那么按上面方面类推,ecx+8处是什么呢?162E,呵~~~~,不就是5678的十六进制吗,那么02当然就表示Integer了.(高位的80不知道什么作用,改成00似乎也没有影响) 问题清楚一些了,Variant变量的第一个字节表示数据的实际类型,后面七个字节不知有什么用,在第九个字节处才是数据的值或数据的地址。 我整理出的Variant变量的各种实际类型的代码: 代码: 02  Integer    用d eax+8可以看到,占两字节 03  Long    用d eax+8可以看到,占四字节 04  Single    用ds eax+8可以看到 05  Double    用dl eax+8可以看到 08  String    用d *(eax+8)可以看到 0B  Boolean    用d eax+8可以看到,True为FFFFFFFF 11  Byte    用d eax+8可以看到,占一字节 以后当你D出一个05,08这样的数字时不会再感到莫名其妙了吧。 还是有许多不明白的地方,比如中间的七位到底有什么用,在那些有Var字样的函数内部实现的过程究竟是怎样(我跟进了一个vbaVarAdd发现极其复杂)等等,还请各位大大指出来,帮助我们这些在黑暗中摸索的菜鸟们。 标 题: 发信人:小楼 时 间:2004-07-02,21:34 详细信息: 多谢RoBa文章对此的研究。我因此也看了一下。 用oleview查看msvbvm60.dll,可以看到这样定义 代码: typedef [uuid(ED822010-6D7F-11CF-B949-00AA004455EA), helpcontext(0x0010fe25)] enum {     vbEmpty                  = 0,     vbNull                   = 1,     vbInteger                = 2,     vbLong                   = 3,     vbSingle                 = 4,     vbDouble                 = 5,     vbCurrency               = 6,     vbDate                   = 7,     vbString                 = 8,     vbObject                 = 9,     vbError                  = 10,     vbBoolean                = 11,     vbVariant                = 12,     vbDataObject             = 13,     vbDecimal                = 14,     vbByte                   = 17,     vbUserDefinedType        = 36,     vbArray                  = 8192 } VbVarType; 上述这些应该是vb数据类型的十进制索引值 引用: Variant变量的第一个字节表示数据的实际类型,后面七个字节不知有什么用,在第九个字节处才是数据的值或数据的地址。 关于“中间的7个字节”,我这样认为 代码: +00          数据类型索引值   01          00或80                    引用: :00401D1F C78574FFFFFF02800000    mov dword ptr [ebp+FFFFFF74], 00008002 ;类型值                    注意这句,80由此赋值   03           "00"   04           "00", 03、04位置应该都是00,这或许是编译器为了数据对齐而自动生成的   05 -- 08      这里我想是无关数据 发信人:小楼 时 间:2004-07-02,22:23 详细信息: 关于数据“80”,跟踪到一点代码,对80进行一些校验 以下来自msvbvm60.dll 6.0.8964版本 代码: ENGINE:6610ABCE                 public __vbaVarTstEq ENGINE:6610ABCE __vbaVarTstEq: ENGINE:6610ABCE                 push    dword ptr [esp+8] ENGINE:6610ABD2                 push    dword ptr [esp+8] ENGINE:6610ABD6                 push    0 ENGINE:6610ABD8                 call    sub_66100017    // enter 代码: ENGINE:66100017                 push    ebp ENGINE:66100018                 mov     ebp, esp ENGINE:6610001A                 sub     esp, 38h ENGINE:6610001D                 mov     edx, [ebp+arg_8] ENGINE:66100020                 mov     ecx, [ebp+arg_4] ENGINE:66100023                 push    ebx ENGINE:66100024                 push    esi ENGINE:66100025                 mov     si, [ecx] ENGINE:66100028                 push    edi ENGINE:66100029                 mov     di, [edx] ENGINE:6610002C                 mov     eax, 7FFFh ENGINE:66100031                 and     edi, eax ENGINE:66100033                 and     esi, eax    // esi=8002H, eax=7FFFH ENGINE:66100035                 cmp     di, 9 ENGINE:66100039                 jz      loc_66107812 ENGINE:6610003F                 cmp     si, 9 ENGINE:66100043                 jz      loc_66107812
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:关于VB中数据的存储格式和寻址方式.doc
    链接地址:https://www.zixin.com.cn/doc/4542430.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork