首页
社区
课程
招聘
[原创:vb crackme
发表于: 2011-7-29 11:29 7259

[原创:vb crackme

2011-7-29 11:29
7259
刚刚学一天vb,就忍不住写了两个crackme,质量不好......新手可以看看
能写出crackme2的注册机,那我就真的感谢,因为我自己写不出来.....⊙﹏⊙b汗

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
crackme.rar
.text:0040296D                 jnz     short loc_40299C ;
.text:0040299A                 jz      short loc_402A08
.text:0040299A                 jz      short loc_402A08
.text:00402B56                 jz      short loc_402BA8
.text:00402CF6                 jz      short loc_402D2B
.text:00402DD4                 jz      short loc_402E25
.text:00402EB6                 jz      short loc_402EF3
关键的跳转怎么这么多,郁闷
我这个菜鸟不行...
继续弄
2011-7-31 10:53
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
vb的反汇编看着始终没有理解,郁闷..
2011-7-31 10:58
0
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个crackme.rar真变态,输入在一定条件下竟然能让自己死循环了.
六个要求的关键跳转见前面回帖
结果:
第一个要求:
输入用户名长度要大于8,(就算8位)
输入密码长度要大于9,(就算9位)
第二个要求:
用户名第三位的ASCII码要大于用户名第一位ASCII码5,
第三个要求:
用户名第二位ASCII码要比用户名第四位ASCII码小2
第四个要求:
用户名第四位要等于用户名第八位
第五个要求:
密码第一位ASCII码要等于密码右数第四位ASCII码
第六个要求:
用户名第一位等于密码第一位

比如用户名:abfdefgd
密码:a234567a234

第一次弄crackme,庆祝:cool
2011-8-1 15:22
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
希望楼上写一篇破文分析分析,让我等菜鸟学习
2011-8-1 15:28
0
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Crakcme2.rar:
今天才分析完程序好慢
过程是:
程序用了variant的数组3个,一个是最终结果数组var_88array(0 to 7),8个值是
VAR_88Array(1) = &H71
VAR_88Array(2) = &H18
VAR_88Array(3) = &H59
VAR_88Array(4) = &H1B
VAR_88Array(5) = &H79
VAR_88Array(6) = &H42
VAR_88Array(7) = &H45
VAR_88Array(8) = &H4C

输入的密码要求8位字符,假定放在数组ps(0 to 8)as integer里面
然后ps的每个元素和asc("2") xor,分别房子ps和temp(0 to 8) as integer里面

然后
ps1=ps1 xor ps2
ps2=ps3 xor ps4
ps3=ps5 xor ps6
ps4=ps7 xor ps8

然后
ps1=ps1 xor ps2
ps2=ps3 xor ps4
ps1=ps1 xor ps2

然后ps1和temp数组的所有元素xor,结果放在ps数组

ps数组和var_88array数组完全相等就算验证通过.

好像是个比较经典的算法...数学不好,还没想怎么算密码.

昨天上面写的有错误,今天编辑修改了...
密码是Z3r0Ring

开始写2个程序的破解过程...

2个程序回头再写破文...
2011-8-3 17:36
0
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这两个crackme都是vb程序,快速到打代码位置,需要对vb5/6编译的exe有比较好的了解,要是有能够直接分析exe结构的脚本就最好了.
Vb5/6编程的exe文件结构,请参照: http://bbs.pediy.com/showthread.php?t=28715
Vb5/6程序分析的ida脚本:http://bbs.pediy.com/showthread.php?t=82591,
这里的脚本解析了程序的结构,但是对个对象的事件没有完好解析,就是知道这个过程是属于那个对象,但是属于这个对象的什么事件处理没有解析出来…
Crackme.rar
打开crackme.exe,要输入用户名和密码…
用IDA打开crack.exe,显示程序入口点,典型的vb5/6程序:
.text:0040124C                 public start
.text:0040124C start:
.text:0040124C                 push    offset byte_401870
.text:00401251                 call    ThunRTMain
去401870看看:
.text:00401870 VBHead          db 'VB5!6&vb6chs.dll',0 ; DATA XREF: .text:start o
.text:00401870                                         ; VBHEAD
.text:00401881                 align 4
.text:00401884                 dd 2Ah                  ; LanguageDll1
.text:00401888                 dd 2 dup(0)
.text:00401890                 dd 0A0000h
.text:00401894                 dd 804h                 ; LanguageID0
.text:00401898                 dd 0                    ; BackLanguageID
.text:0040189C                 dd 0                    ; pSubMain
.text:004018A0                 dd offset ProjectInfo   ; pProjectInfo
.text:004018A4                 dd 30F014h              ; fMDLIntObjs
.text:004018A8                 dd 0FFFFFF00h           ; fMDLIntObjs1
.text:004018AC                 dd 8                    ; ThreadFlags
.text:004018B0                 dd 1                    ; ThreadCount
.text:004018B4                 dw 1                    ; frmCount
.text:004018B6                 dw 0                    ; ExternalComponentCount
.text:004018B8                 dd 0E9h                 ; extComCount
.text:004018BC                 dd offset GUITable_Form1 ; pGUITable
.text:004018C0                 dd offset GUITable_Form1 ; pExternalComponentTable
.text:004018C4                 dd offset Project       ; pComRegData
.text:004018C8                 dd 78h                  ; oProjExename
.text:004018CC                 dd 80h                  ; oProjTitle
.text:004018D0                 dd 88h                  ; oHelpFile
.text:004018D4                 dd 89h                  ; oProjName
.text:004018D8                 dd 0
.text:004018DC                 dd 0
.text:004018E0                 dd 0
.text:004018E4                 dd 0
.text:004018E8 aCrackme        db 'crackme',0
.text:004018F0 aCrackme_0      db 'crackme',0
.text:004018F8                 db 0
.text:004018F9 aD1             db '工程1',0
.text:004018FF                 db    0
这里是一个完整的vbhead,按前面说的vb5/6编译的exe的程序结构的,发现这个exe只有1个form,挺好,活比较少啊
去看看ProjectInfo:
.text:00401900 ProjectInfo     dd 1F4h                 ; DATA XREF: .text:004018A0 o
.text:00401900                                         ; Signature
.text:00401904                 dd offset ObejctTable   ; ObjectTable
.text:00401908                 dd 0                    ; --------
.text:0040190C                 dd offset StartOfCode   ; pStartOfCode
.text:00401910                 dd offset EndOfCode     ; --------
.text:00401914                 dd 9E8h                 ; ***Flags
.text:00401918                 dd offset dword_404008  ; --------
.text:0040191C                 dd offset _vbaExceptHandler ; p__vbaExceptHandler
.text:00401920                 dd offset NativeCode    ; 数据段地址
.text:00401924                 dw 0                    ; ***Flags
.text:00401926                 dw 0                    ; ***Flags
.text:00401928                 dw 0                    ; ***Flags其实我是想找到代码的位置,以及这个form里面有多少过程,这些过程都在什么地方,我好去下断点,可别说去下消息断点,那样会断在msvbvm60里面,半天都绕不出来的,在call上面要是直接运行跳过,很可能就跳过了用户代码,要是每个call都进去看看,累死我的…
,去看看ObejctTable,整个exe的所有模块的总表哦:
.text:00401B3C ObejctTable     dd 0                    ; DATA XREF: .text:00401904 o
.text:00401B3C                                         ; .text:00401E94 o ...
.text:00401B3C                                         ; no use
.text:00401B40                 dd offset VbFunct       ; pExecProj
.text:00401B44                 dd offset ProjectInfo2  ; pProjectInfo2
.text:00401B48                 dd 0FFFFFFFFh
.text:00401B4C                 dd 0
.text:00401B50                 dd offset unk_40401C    ; pProjectObject
.text:00401B54                 dd 0DFE5B7FDh
.text:00401B58                 dd 4F2FD846h
.text:00401B5C                 dd 5CD06080h
.text:00401B60                 dd 0EA46AB8Dh
.text:00401B64                 dw 0Ah                  ; fCompileType
.text:00401B66                 dw 1                    ; iObjectCount
.text:00401B68                 dw 1                    ; iCompiledObjects
.text:00401B6A                 dw 1                    ; iObjectsInUse
.text:00401B6C                 dd offset Object_Form1  ; pObject
.text:00401B70                 dd 0
.text:00401B74                 dd 0
.text:00401B78                 dd 0
.text:00401B7C                 dd offset ProjectName   ; pProject Name
.text:00401B80                 dd 409h                 ; Language ID1
.text:00401B84                 dd 804h                 ; Language ID2
.text:00401B88                 dd 0
.text:00401B8C                 dd 2
去这里顺便看看.text:00401B6C                 dd offset Object_Form1  ; pObject
Object_form1这里是个数组,放的是整个exe所有的模块,类模块,窗体的信息.这个crackme只有一个窗体,名字是form1:
.text:00401B90 Object_Form1    dd offset ObjectInfoForm1 ; DATA XREF: .text:00401B6C o
.text:00401B90                                         ; .text:00401EA8 o
.text:00401B90                                         ; pObjectInfo
.text:00401B94                 dd 0FFFFFFFFh
.text:00401B98                 dd offset Object_Form1PbulicBytes ; pPbulicBytes
.text:00401B9C                 dd 0                    ; pStaticBytes
.text:00401BA0                 dd 0                    ; pModulePublic
.text:00401BA4                 dd 0                    ; pModulePublic
.text:00401BA8                 dd offset sForm1        ; pObjectName
.text:00401BAC                 dd 3                    ; ProcessCount
.text:00401BB0                 dd offset Obj_Form1_ProNameArry ; pProcessNameArray
.text:00401BB4                 dd 0FFFFh               ; pStaticVar
.text:00401BB8                 dd 18083h               ; ObjectType
.text:00401BBC                 dd 0
然后,去看ObjectInfoForm1,这里能到这个窗体定义的细节了,在这个结构的后面是OptionalInfo结构了,那可是好东西,我关心的地方:
.text:00401E90 ObjectInfoForm1 dw 1                    ; DATA XREF: .text:Object_Form1 o
.text:00401E90                                         ; .text:00401FEC o ...
.text:00401E90                                         ; Flag
.text:00401E92                 dw 0                    ; ObjectIndex
.text:00401E94                 dd offset ObejctTable   ; ObjectTable
.text:00401E98                 dd 0
.text:00401E9C                 dd offset Form1SmallRecord ; ObjectSmallRecord
.text:00401EA0                 dd 0FFFFFFFFh
.text:00401EA4                 dd 0
.text:00401EA8                 dd offset Object_Form1  ; Object
.text:00401EAC                 dd offset dword_404008
.text:00401EB0                 dd 0
.text:00401EB4                 dd 1747D8h, 3 dup(0)
.text:00401EC4                 dd offset pGuidObj_Form1
.text:00401EC8 OptObjInfo_Form1 dd 1                   ; fDesigner
.text:00401ECC                 dd 401BECh              ; pObjCLSID
.text:00401ED0                 dd 0
.text:00401ED4                 dd offset pGuidObj_Form1 ; pGuidObjectGUI
.text:00401ED8                 dd 1                    ; pObjectDefaultIIDCount
.text:00401EDC                 dd offset Form1_Ctrl_Text1 ; pObjectEventsIIDTable
.text:00401EE0                 dd 0                    ; pObjectEventsIIDCount
.text:00401EE4                 dd offset pObjectDefaultIIDTable_Form1 ; pObjectDefaultIIDTable
.text:00401EE8                 dd 5                    ; ControlCount
.text:00401EEC                 dd offset Form1_Ctrl_Text1 ; pControlArray
.text:00401EF0                 dw 3                    ; iEventCount
.text:00401EF0                                         ; 系统提供的事件的数量
.text:00401EF2                 dw 1B7h                 ; iPCodeCount
.text:00401EF2                                         ; 系统提供的接口过程数量
.text:00401EF4                 dw 68h                  ; iInitializeEvent
.text:00401EF6                 dw 6Ch                  ; iTerminateEvent
.text:00401EF8                 dd offset Form1_ProcLinkArray ; pProcLinkArray
.text:00401EFC                 dd offset Form1_BasicClassObject ; pBasicClassObject
.text:00401F00                 dd 0                    ; -
.text:00401F04                 dd 1F3834h              ; -
从OptObjInfo_Form1的可以连接到Form1_ProcLinkArray,在Form1_ProcLinkArray这个数组里面,有form1定义的所有过程,比如写的事件处理,公共过程,公共函数这些…这样就找到这个form里面所有的如果地址了.看看这个数组:
.text:00401FD8 Form1_ProcLinkArray dd offset jForm1_01 ; DATA XREF: .text:00401EF8 o
.text:00401FDC                 dd offset Form1_Command1_Click_1
.text:00401FE0                 dd offset Form1_Command2_Click_1
因为我用的脚本编写的太垃圾,处理的过程名字不好.
在.text:00401EEC                 dd offset Form1_Ctrl_Text1 ; pControlArray这里,指向另外一个数组,是form使用的所有控件了,去看看:
.text:00401F10 Form1_Ctrl_Text1 dw 40h                 ; DATA XREF: .text:00401EDC o
.text:00401F10                                         ; .text:00401EEC o ...
.text:00401F10                                         ; Flag1
.text:00401F12                 db  18h                 ; EventCount
.text:00401F13                 db    0
.text:00401F14                 dd 34h                  ; Flag2
.text:00401F18                 dd offset CLSID_Ctrl_TextBox ; aGUID
.text:00401F1C                 dw 4                    ; index
.text:00401F1E                 dw 3                    ; Const1
.text:00401F20                 dd 0                    ; Null1
.text:00401F24                 dd 0                    ; Null2
.text:00401F28                 dd offset Form1_Text1_EventTable ; EventTable
.text:00401F28                                         ; Type:TextBox
.text:00401F2C                 db 0C0h                 ; Flag3
.text:00401F2D                 db 10h                  ; Const2
.text:00401F2E                 dw 1Fh                  ; Const3
.text:00401F30                 dd offset Cntr_Text1    ; pName
.text:00401F34                 dw 4                    ; Index2
.text:00401F36                 dw 3                    ; Const1Copy
.text:00401F38 Form1_Ctrl_Form dw 40h                  ; DATA XREF: .text:00402060 o
.text:00401F38                                         ; Flag1
.text:00401F3A                 db  1Fh                 ; EventCount
.text:00401F3B                 db    0
.text:00401F3C                 dd 38h                  ; Flag2
.text:00401F40                 dd offset CLSID_Ctrl_Form ; aGUID
.text:00401F44                 dw 0FFFFh               ; index
.text:00401F46                 dw 0FFFFh               ; Const1
.text:00401F48                 dd 0                    ; Null1
.text:00401F4C                 dd 0                    ; Null2
.text:00401F50                 dd offset Form1_Form_EventTable ; EventTable
.text:00401F50                                         ; Type:Form
.text:00401F54                 db 0D0h                 ; Flag3
.text:00401F55                 db 10h                  ; Const2
.text:00401F56                 dw 1Fh                  ; Const3
.text:00401F58                 dd offset Cntr_Form     ; pName
.text:00401F5C                 dw 0FFFFh               ; Index2
.text:00401F5E                 dw 0FFFFh               ; Const1Copy
.text:00401F60 Form1_Ctrl_Command1 dw 40h              ; DATA XREF: .text:004020F4 o
.text:00401F60                                         ; Flag1
.text:00401F62                 db  11h                 ; EventCount
.text:00401F63                 db    0
.text:00401F64                 dd 3Ch                  ; Flag2
.text:00401F68                 dd offset CLSID_Ctrl_CommandButton ; aGUID
.text:00401F6C                 dw 2                    ; index
.text:00401F6E                 dw 3                    ; Const1
.text:00401F70                 dd 0                    ; Null1
.text:00401F74                 dd 0                    ; Null2
.text:00401F78                 dd offset Form1_Command1_EventTable ; EventTable
.text:00401F78                                         ; Type:CommandButton
.text:00401F7C                 db 0E0h                 ; Flag3
.text:00401F7D                 db 10h                  ; Const2
.text:00401F7E                 dw 1Fh                  ; Const3
.text:00401F80                 dd offset Cntr_Command1 ; pName
.text:00401F84                 dw 2                    ; Index2
.text:00401F86                 dw 3                    ; Const1Copy
.text:00401F88 Form1_Ctrl_Text2 dw 40h                 ; DATA XREF: .text:00402150 o
.text:00401F88                                         ; Flag1
.text:00401F8A                 db  18h                 ; EventCount
.text:00401F8B                 db    0
.text:00401F8C                 dd 40h                  ; Flag2
.text:00401F90                 dd offset CLSID_Ctrl_TextBox ; aGUID
.text:00401F94                 dw 3                    ; index
.text:00401F96                 dw 3                    ; Const1
.text:00401F98                 dd 0                    ; Null1
.text:00401F9C                 dd 0                    ; Null2
.text:00401FA0                 dd offset Form1_Text2_EventTable ; EventTable
.text:00401FA0                                         ; Type:TextBox
.text:00401FA4                 db 0C0h                 ; Flag3
.text:00401FA5                 db 10h                  ; Const2
.text:00401FA6                 dw 1Fh                  ; Const3
.text:00401FA8                 dd offset Cntr_Text2    ; pName
.text:00401FAC                 dw 3                    ; Index2
.text:00401FAE                 dw 3                    ; Const1Copy
.text:00401FB0 Form1_Ctrl_Command2 dw 40h              ; DATA XREF: .text:004021C8 o
.text:00401FB0                                         ; Flag1
.text:00401FB2                 db  11h                 ; EventCount
.text:00401FB3                 db    0
.text:00401FB4                 dd 44h                  ; Flag2
.text:00401FB8                 dd offset CLSID_Ctrl_CommandButton ; aGUID
.text:00401FBC                 dw 1                    ; index
.text:00401FBE                 dw 3                    ; Const1
.text:00401FC0                 dd 0                    ; Null1
.text:00401FC4                 dd 0                    ; Null2
.text:00401FC8                 dd offset Form1_Command2_EventTable ; EventTable
.text:00401FC8                                         ; Type:CommandButton
.text:00401FCC                 db 0E0h                 ; Flag3
.text:00401FCD                 db 10h                  ; Const2
.text:00401FCE                 dw 1Fh                  ; Const3
.text:00401FD0                 dd offset Cntr_Command2 ; pName
.text:00401FD4                 dw 1                    ; Index2
.text:00401FD6                 dw 3                    ; Const1Copy
这里可以看到form1里面有form(就是窗体自己了),command1,command2,text1,text2。
看这里.text:00401F78                 dd offset Form1_Command1_EventTable ; EventTable
这里是command1的事件处理列表:
.text:004020F0 Form1_Command1_EventTable dd 0          ; DATA XREF: .text:00401F78 o
.text:004020F4                 dd offset Form1_Ctrl_Command1
.text:004020F8                 dd offset ObjectInfoForm1
.text:004020FC                 dd offset _EVENT_SINK_QueryInterface
.text:00402100                 dd offset _EVENT_SINK_AddRef
.text:00402104                 dd offset _EVENT_SINK_Release
.text:00402108 Event Jumptable for Command1
.text:00402108                 dd offset Form1_Command1_Click ;
.text:0040210C                 dd 0                    ; DragDrop
.text:00402110                 dd 0                    ; DragOver
.text:00402114                 dd 0                    ; GotFocus
.text:00402118                 dd 0                    ; KeyDown
.text:0040211C                 dd 0                    ; KeyPress
.text:00402120                 dd 0                    ; KeyUp
.text:00402124                 dd 0                    ; LostFocus
.text:00402128                 dd 0                    ; MouseDown
.text:0040212C                 dd 0                    ; MouseMove
.text:00402130                 dd 0                    ; MouseUp
.text:00402134                 dd 0                    ; OLEDragOver
.text:00402138                 dd 0                    ; OLEDragDrop
.text:0040213C                 dd 0                    ; OLEGiveFeedback
.text:00402140                 dd 0                    ; OLEStartDrag
.text:00402144                 dd 0                    ; OLESetData
.text:00402148                 dd 0                    ; OLECompleteDrag
可以看到只处理了command1的click事件.同样的发现form,text1,text2都没有事件处理,command2也只有click事件.
到command1的事件处理过程:
.text:0040222D Form1_Command1_Click:                   ; DATA XREF: .text:00402108 o
.text:0040222D                 sub     dword ptr [esp+4], 3Bh
.text:00402235
.text:00402235 Form1_Command1_Click_1:                 ; DATA XREF: .text:00401FDC o
.text:00402235                 jmp     Form1_Command1_Click_2
继续跟下去,到这里Form1_Command1_Click_2:
.text:00402310 Form1_Command1_Click_2 proc near        ; CODE XREF: .text:Form1_Command1_Click_1 j
.text:00402310
.text:00402310 var_130         = dword ptr -130h
.text:00402310 var_11C         = dword ptr -11Ch
.text:00402310 var_114         = dword ptr -114h
.text:00402310 var_10C         = dword ptr -10Ch
.text:00402310 var_104Msg      = dword ptr -104h
.text:00402310 var_FC          = dword ptr -0FCh
.text:00402310 var_F4          = dword ptr -0F4h
.text:00402310 var_EC          = dword ptr -0ECh
.text:00402310 var_E4          = dword ptr -0E4h
.text:00402310 var_DCVariant   = dword ptr -0DCh
.text:00402310 var_D4          = dword ptr -0D4h
.text:00402310 var_CC          = dword ptr -0CCh
.text:00402310 var_C8str       = dword ptr -0C8h
.text:00402310 var_C4          = dword ptr -0C4h
.text:00402310 var_B4          = dword ptr -0B4h
.text:00402310 var_A4          = dword ptr -0A4h
.text:00402310 var_94          = dword ptr -94h
.text:00402310 var_84          = dword ptr -84h
.text:00402310 var_74          = dword ptr -74h
.text:00402310 var_64          = dword ptr -64h
.text:00402310 var_54          = dword ptr -54h
.text:00402310 var_44          = dword ptr -44h
.text:00402310 var_34          = dword ptr -34h
.text:00402310 var_24          = dword ptr -24h
.text:00402310 var_14          = dword ptr -14h
.text:00402310 var_C           = dword ptr -0Ch
.text:00402310 var_8           = dword ptr -8
.text:00402310 var_4           = dword ptr -4
.text:00402310 arg_0           = dword ptr  8
.text:00402310
.text:00402310                 push    ebp
.text:00402311                 mov     ebp, esp
.text:00402313                 sub     esp, 0Ch
.text:00402316                 push    offset _vbaExceptHandler
.text:0040231B                 mov     eax, large fs:0
.text:00402321                 push    eax
.text:00402322                 mov     large fs:0, esp
.text:00402329                 sub     esp, 140h
.text:0040232F                 push    ebx
.text:00402330                 push    esi
.text:00402331                 push    edi
.text:00402332                 mov     [ebp+var_C], esp
.text:00402335                 mov     [ebp+var_8], offset dword_4010E0
.text:0040233C                 mov     edi, [ebp+arg_0]
.text:0040233F                 mov     eax, edi
.text:00402341                 and     eax, 1
.text:00402344                 mov     [ebp+var_4], eax
.text:00402347                 and     edi, 0FFFFFFFEh
.text:0040234A                 push    edi
.text:0040234B                 mov     [ebp+arg_0], edi
.text:0040234E                 mov     ecx, [edi]
.text:00402350                 call    dword ptr [ecx+4]
.text:00402353                 mov     esi, ds:__vbaVarCopy ; 复制(edx:源, ecx:目的)
.text:00402359                 xor     ebx, ebx
.text:0040235B                 mov     [ebp+var_10C], ebx
.text:00402361                 lea     edx, [ebp+var_10C] ; 源
.text:00402367                 lea     ecx, [ebp+var_B4] ; 目的
.text:0040236D                 mov     [ebp+var_24], ebx
.text:00402370                 mov     [ebp+var_34], ebx
.text:00402373                 mov     [ebp+var_44], ebx
.text:00402376                 mov     [ebp+var_54], ebx
.text:00402379                 mov     [ebp+var_64], ebx
.text:0040237C                 mov     [ebp+var_74], ebx
.text:0040237F                 mov     [ebp+var_84], ebx
.text:00402385                 mov     [ebp+var_94], ebx
.text:0040238B                 mov     [ebp+var_A4], ebx
.text:00402391                 mov     [ebp+var_B4], ebx
.text:00402397                 mov     [ebp+var_C4], ebx
.text:0040239D                 mov     [ebp+var_C8str], ebx
.text:004023A3                 mov     [ebp+var_CC], ebx
.text:004023A9                 mov     [ebp+var_DCVariant], ebx
.text:004023AF                 mov     [ebp+var_EC], ebx
.text:004023B5                 mov     [ebp+var_FC], ebx
.text:004023BB                 mov     [ebp+var_11C], ebx
.text:004023C1                 mov     [ebp+var_104Msg], offset aSorryYouFailed ; "sorry, you failed!"
.text:004023CB                 mov     [ebp+var_10C], 8
.text:004023D5                 call    esi ; __vbaVarCopy ; 复制(edx:源, ecx:目的)
.text:004023D7                 lea     edx, [ebp+var_10C] ; 源
.text:004023DD                 lea     ecx, [ebp+var_74] ; 目的
.text:004023E0                 mov     [ebp+var_104Msg], offset aGoodJobYouAreT ; "Good job :) you are the real man!"
.text:004023EA                 mov     [ebp+var_10C], 8
.text:004023F4                 call    esi ; __vbaVarCopy ; 复制(edx:源, ecx:目的)
.text:004023F6                 mov     edx, [edi]
.text:004023F8                 push    edi
.text:004023F9                 call    dword ptr [edx+308h]
.text:004023FF                 push    eax
.text:00402400                 lea     eax, [ebp+var_CC]
.text:00402406                 push    eax
.text:00402407                 call    ds:__vbaObjSet
到click的处理里面,差不多能看出来是处理用户名密码了,同样去看看command2_click,里面直接就退出了,end,呵呵.
到这里就找到关系的处理过程了,在402310下断点,程序跑起来,点下注册按钮,理想的断点出来了…
下来就是动态跟踪了.这两个crackme都用了很多的variant变量,先普及下variant的结构:
Varian是个长度16字节的结构,4个long类型,第一个域代表variant的类型,第三个域代表variant的数值,如果variant类型是8(字符串),值域就放的是个指针,指向字符串.如果类型是2,值域就直接是数值了.其他的类型细节,要去看看http://bbs.pediy.com/showthread.php?t=28715,里面说的更多.所以看到
mov     [ebp+var_104Msg], offset aSorryYouFailed ; "sorry, you failed!"
mov     [ebp+var_10C], 8
就知道这是给一个临时variant变量赋值了,这个变量是个字符串(8),值为一个指针,指向字符串"sorry, you failed!".
在说一般事件处理过程,先是堆栈处理,留出局部变量的空间,然后就是this(me)的存储,局部变量的初始化.

看到:
.text:00402361                 lea     edx, [ebp+var_10C] ; 源
.text:00402367                 lea     ecx, [ebp+var_B4] ; 目的
……
.text:004023C1                 mov     [ebp+var_104Msg], offset aSorryYouFailed ; "sorry, you failed!"
.text:004023CB                 mov     [ebp+var_10C], 8
.text:004023D5                 call    esi ; __vbaVarCopy ; 复制(edx:源, ecx:目的)
.text:004023D7                 lea     edx, [ebp+var_10C] ; 源
.text:004023DD                 lea     ecx, [ebp+var_74] ; 目的
.text:004023E0                 mov     [ebp+var_104Msg], offset aGoodJobYouAreT ; "Good job :) you are the real man!"
.text:004023EA                 mov     [ebp+var_10C], 8
.text:004023F4                 call    esi ; __vbaVarCopy ; 复制(edx:源, ecx:目的)
这里就是给变量赋值了,成功,失败的提示字符串都有了,失败的字符串先放在ebp+var_10C这个variant里,然后用调用__vbaVarCopy,相当于于ebp+var_B4变量=ebp+var_10C变量…
这样我们要注意ebp+var_B4变量(失败信息), ebp+var_74变量,失败信息.
这个程序失败,成功都是弹个msbox出来,直接去处理过程的结尾部分,….处理过程也没多少,拉拉鼠标都到了…找到2个调用msgbox的地方…下2个断点做标记:
.text:00402EB8 loc_402EB8:                             ; CODE XREF: Form1_Command1_Click_2+A16 j
.text:00402EB8                 lea     eax, [ebp+var_FC] ; __context
.text:00402EBE                 lea     ecx, [ebp+var_EC] ; __helpfile
.text:00402EC4                 push    eax             ; context
.text:00402EC5                 lea     edx, [ebp+var_DCVariant] ; __标题
.text:00402ECB                 push    ecx             ; helpfile
.text:00402ECC                 push    edx             ; 标题
.text:00402ECD                 lea     eax, [ebp+var_B4] ; __消息
.text:00402ED3                 push    30h             ; buttons
.text:00402ED5                 push    eax             ; 消息
.text:00402ED6                 call    ds:rtcMsgBox    ; MsgBox(消息, buttons, 标题, helpfile, context)
这个地方使用了ebp+var_B4变量…失败啊.失败信息,程序到这里就完蛋了
.text:00402EF3 loc_402EF3:                             ; CODE XREF: Form1_Command1_Click_2+BA6 j
.text:00402EF3                 lea     ecx, [ebp+var_FC] ; __context
.text:00402EF9                 lea     edx, [ebp+var_EC] ; __helpfile
.text:00402EFF                 push    ecx             ; context
.text:00402F00                 lea     eax, [ebp+var_DCVariant] ; __标题
.text:00402F06                 push    edx             ; helpfile
.text:00402F07                 push    eax             ; 标题
.text:00402F08                 push    40h             ; buttons
.text:00402F0A                 lea     ecx, [ebp+var_74] ; __消息
.text:00402F0D
.text:00402F0D loc_402F0D:                             ; CODE XREF: Form1_Command1_Click_2+893 j
.text:00402F0D                 push    ecx             ; 消息
.text:00402F0E                 call    ds:rtcMsgBox    ; MsgBox(消息, buttons, 标题, helpfile, context)
这里又用到了msgbox,用的不过是ebp+var_74变量,嘿嘿,这里不是成功信息吧,目标找到了,程序一定要运行到这里….
下来可以偷懒了,ida提供的过程图形比较不错,按下空格,把整个处理过程用图形方式显示出来了.

Ida已经给通过交叉参考,给程序分成块了,分块都是按各种jmp分的,嘿嘿,我们从最后的2个msgbox开始,往上分析,凡是能去失败信息的跳转,都要防止,凡是去成功方向的跳转,都要满足.在给这些程序块分个类,做上标记,我笨,脑子不好用,分了颜色才能清楚…
一句一句看程序,6个关键的跳转:
.text:0040296D                 jnz     short loc_40299C ; 反响 6 关键跳转
.text:0040299A                 jz      short loc_402A08 ; 反响 5 关键跳转
.text:00402B56                 jz      short loc_402BA8 ; 反响 4 关键跳转
.text:00402CF6                 jz      short loc_402D2B ; 反响 3 关键跳转
.text:00402DD4                 jz      short loc_402E25 ; 反响 2 关键跳转
.text:00402EB6                 jz      short loc_402EF3 ; 一个关键跳转
因为有2个地方都会显示错误信息,而且多个位置能跳转到错误信息,这个程序要爆破就麻烦了,要改多个地方…要是吧上面6个跳转都改成相反的跳转,随便输入个注册码,肯定成功.这都流程了,就慢慢看处理过程…
Vb每次访问一个对象的属性之前,都会获取这个对象call    dword ptr [edx+308h],然后                 call    ds:__vbaObjSet,在然后是调用对象过程,获取数值…这个call    dword ptr [edx+308h]当然不是每次都是ebx和308h,具体俺不清楚…反正看见__vbaObjSet就差不多了.
.text:004024A7                 mov     ecx, [eax]
.text:004024A9                 lea     edx, [ebp+var_C8str]
.text:004024AF                 push    edx
.text:004024B0                 push    eax
.text:004024B1                 mov     [ebp+var_130], eax
.text:004024B7                 call    dword ptr [ecx+0A0h]
__vbaObjSet之后就是访问控件了,push进去的参数总是控件地址,返回值存放的地址,调用控件的对应过程….比如call    dword ptr [ecx+0A0h] 这里,不是每次都是ecx,不过0A0H这个对textbox控件总是获取text属性,就是[ebp+var_C8str]=text1.text
后面访问了属性,就是错误检查:
.text:004024BD                 cmp     eax, ebx
.text:004024BF                 fnclex
.text:004024C1                 jge     short loc_4024DB
.text:004024C3                 mov     ecx, [ebp+var_130]
.text:004024C9                 push    0A0h
.text:004024CE                 push    offset dword_401D5C
.text:004024D3                 push    ecx
.text:004024D4                 push    eax
.text:004024D5                 call    ds:__vbaHresultCheckObj
这样的类似程序快太多,就不需要看了.
后面就是操作了
.text:00402505                 call    ds:rtcRightTrimVar ; RTrim(Variant)
.text:00402514                 call    esi ; __vbaVarMove ; 复制(edx:源, ecx:目的)
释放对象,错误检查,
.text:004025A3                 call    ds:rtcTrimVar   ; Trim(Variant)
.text:004025E3                 lea     ecx, [ebp+var_34] ; =Lcase(trim(username))
用户名小写.
.text:004025F9                 call    ds:__vbaObjSet
获取密码框里面的密码.
.text:00402601                 lea     ecx, [ebp+var_C8str] ; =password
.text:0040260F                 call    dword ptr [edx+0A0h]
然后这个作者不知道怎么要多次去除用户名里面的空格,哎,故意的吧
到这个:
.text:004027C7                 lea     ecx, [ebp+var_34]
.text:004027CA                 lea     edx, [ebp+var_DCVariant] ; =len(username)=6
.text:004027D2                 call    edi ; __vbaLenVar

.text:004027EC call    edi ; __vbaLenVar
取用户名和密码长度,放在[ebp+var_DC]变量,是个variant,要看后面第三个dword..
然后检查,长度:
.text:00402936 call    ds:__vbaVarCmpLt                ; var_DC=var_10C>var_C4
.text:0040294F call    ds:__vbaVarCmpLt
2个条件检查的结果and…
.text:0040295D call    ds:__vbaVarAnd
根据and结果,准备跳转:
.text:00402964 call    ds:__vbaBoolVarNull             ; if Variant then ...
.text:0040296A test    ax, ax
.text:0040296D jnz     short loc_40299C                ; 反响 6 关键跳转
用vb描述就差不多是:if len(username)>8 and len(password)>9
这里有:
.text:004028FC mov     eax, 8002h
.text:00402907 mov     [ebp+var_10C], eax
.text:0040290D mov     [ebp+var_11C], eax
.text:00402922 mov     [ebp+var_104Msg], 8
.text:0040292C mov     [ebp+var_114], 9
正是给2个variant赋值8,9,这两个变量是ebp+var_10C和ebp+var_11C,至于类型是8002H是什么,我不知道,全当他是long吧…
后面的处理就是
.text:00402A30 call    ds:rtcMidCharVar
取中间字符mid().
.text:00402A44 call    edi ; __vbaStrVarVal
.text:00402A46 push    eax
.text:00402A47 call    ebx ; rtcAnsiValueBstr
返回asc()值..
判断asc值是不是和其他asc值相等….
整个程序没有循环什么的,就比较了长度,几个特定位置的字符,按意图,修改我们的输入,很快就能通过验证了.
2011-8-4 16:23
0
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
按前面vb5/6程序结构,发现这个程序只有1个form,上面控件放了不少,不过只有一个按钮里面有click事件处理,下断点,跑程序(或者ida直接跑到代码段…要是万一没注意到其他的程序段,没下好断点就亏了,还是看看有多少个程序过程,都给下上断点)…
要直接输入密码,随便输入(要是直接就正确了就成大神了…),点注册按钮,先不管断点了,看看出错有提示没…
提示“兄弟,加油啊!”…有提示就是好,呵呵.
在按下按钮,去断点看看细节:
00404DC0 Form1_Command1_Click_2 proc near        ;
00404DC0 var_15C= dword ptr -15Ch
….
….
00404DC0 var_14= dword ptr -14h
00404DC0 var_C= dword ptr -0Ch
00404DC0 var_8= dword ptr -8
00404DC0 var_4= dword ptr -4
00404DC0 arg_0= dword ptr  8
00404DC0 arg_40102C= dword ptr  401034h
00404DC0
00404DC0 push    ebp


00404E0A lea     eax, [ebp+var_5CArray1]
00404E0D xor     ebx, ebx
00404E0F push    offset array1
00404E14 push    eax
00404E15 mov     [ebp+var_24], ebx
...
00404E08 push    0Ch
....
00404E7B call    esi ; __vbaAryConstruct2
00404E7D push    0Ch
00404E7F lea     ecx, [ebp+var_88Array2]
00404E85 push    offset array2
00404E8A push    ecx
00404E8B call    esi ; __vbaAryConstruct2
00404E8D push    0Ch
00404E8F lea     edx, [ebp+var_B4Array3]
00404E95 push    offset array2
00404E9A push    edx
00404E9B call    esi ; __vbaAryConstruct2
00404E9D mov     eax, [ebp+var_7C]
00404E7B call    esi ; __vbaAryConstruct2看起来…,
没做过几个破解,算上前面那个,这个才是第四个…还是google看看.
6cdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6u0r3j5X3u0K6K9s2c8E0L8q4)9J5c8V1u0n7f1K6k6Q4x3V1k6H3k6h3c8A6P5e0j5^5y4K6S2Q4x3X3g2Z5N6r3#2Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0W2Q4z5o6N6Q4z5p5y4Q4c8e0k6Q4z5f1y4Q4z5o6W2Q4c8e0g2Q4z5o6W2Q4z5p5c8Q4c8e0c8Q4b7V1q4Q4b7V1q4Q4c8e0N6Q4b7V1u0Q4z5e0W2Q4c8e0k6Q4z5o6S2Q4z5e0q4Q4c8e0c8Q4b7V1u0Q4b7f1y4Q4c8e0g2Q4z5o6N6Q4z5o6k6Q4c8e0g2Q4b7e0c8Q4z5o6N6Q4c8e0g2Q4b7e0g2Q4b7V1c8Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0S2Q4b7U0g2Q4z5o6c8Q4c8e0k6Q4z5e0k6Q4z5e0W2Q4x3V1y4Q4c8e0k6Q4z5o6c8Q4z5f1k6Q4c8e0S2Q4b7U0m8Q4b7e0u0y4k6h3&6Y4e0r3!0F1k6H3`.`.
调用几个esi ; __vbaAryConstruct2之后,看看之前入栈的参数: ebp+var_5C, ebp+var_88, ebp+var_B4,正是__vbaAryConstruct2调用前最好入栈的,vb一般的返回值哦,按MengLong说的,去这些变量看看,正是数组的结构: 你看到的地址也许和这个不同…堆栈嘛…每次都不一样
Stack[000006C8]:0012F4AC dd 8920001h
Stack[000006C8]:0012F4B0 dd 10h                                ;MengLong没说这里是什么..我觉得是元素长度,元素可以是type呀
Stack[000006C8]:0012F4B4 dd 0
Stack[000006C8]:0012F4B8 dd offset unk_1588C8
Stack[000006C8]:0012F4BC dd 0Bh
Stack[000006C8]:0012F4C0 dd 0
Stack[000006C8]:0012F4C4 dd 0
其实那里就是元素的字节长度,因为后面的操作可以看出来,定义的就是3个variant数组…
几下数组的结构,知道ebp+var_5C的地址+C就是数组的数据了,那么这些数组的数据地址分别是ebp+var_50,ebp+var_7C, ebp+var_A8,这几个地址后面会用到….额,给这几个地址起个名字不错,寄存器会显示名字的…又懒一次…
.text:00404E9D mov     eax, [ebp+var_7C] ;额,访问数组了,数组数据地址到eax
.text:00404EA0 mov     esi, ds:__vbaVarMove
.text:00404EA6 mov     edi, 2
.text:00404EAB lea     edx, [ebp+var_104]
.text:00404EB1 lea     ecx, [eax+10h]; 这里,这里,数组元素下标是0开始的,一个元素是16字节(10H),所以
.text:00404EB4 mov     [ebp+var_FC], 71h
.text:00404EBE mov     [ebp+var_104], edi
.text:00404EC4 call    esi ; __vbaVarMove
ecx, [eax+10h]; 这里,这里,数组元素下标是0开始的,一个元素是16字节(10H),所以eax+10H的地址正是下标1的元素
看mov     [ebp+var_FC], 71h和mov     [ebp+var_104], edi
varian变量赋值类型2,integer类型,值71H,然后用__vbaVarMove给数组里面下标1元素赋值…
8次赋值之后,去看看这个数组的内容,是:
Dim var88(0 to 8) as variant
var88(1) = &H71
var88(2) = &H18
var88(3) = &H59
var88(4) = &H1B
var88(5) = &H79
var88(6) = &H42
var88(7) = &H45
var88(8) = &H4C
继续…F8:
.text:00404F9B lea     edx, [ebp+var_104]
.text:00404FA1 lea     ecx, [ebp+var_C8]
.text:00404FA7 mov     [ebp+var_FC], offset string_wrong ; 兄弟啊,加油啊
.text:00404FB1 mov     [ebp+var_104], 8
.text:00404FBB call    ds:__vbaVarCopy
.text:00404FC1 lea     edx, [ebp+var_104]
.text:00404FC7 lea     ecx, [ebp+var_44]
.text:00404FCA mov     [ebp+var_FC], offset string_OK  ; 你成功了!能写出注册机吗? 发给我 a474528738@163.com
.text:00404FD4 mov     [ebp+var_104], 8
.text:00404FDE call    ds:__vbaVarCopy
注意var_104和var_fc,正是给variant赋值类型8,string,值是个地址…开始ida显示不是汉字…后来连猜带蒙带去vb严重,才弄了注释的字符串出来…ida不好好干活…
好吧, ebp+var_C8和ebp+var_44这两个变量是我们控制的重点..
出现:
.text:00404FF8 call    ds:__vbaObjSet
.text:00405000 lea     edx, [ebp+var_CC]
….
.text:0040500E call    dword ptr [ecx+0A0h]
看看var_cc,是输入的密码.var_cc也是个string变量,地址指向的地方是个unicode字符串…
.text:00405032 mov     eax, [ebp+var_CC]
.text:00405038 lea     edx, [ebp+var_E4]
.text:0040503E lea     ecx, [ebp+var_34]
.text:00405041 mov     [ebp+var_CC], ebx
.text:00405047 mov     [ebp+var_DC], eax
.text:0040504D mov     [ebp+var_E4], 8
.text:00405057 call    esi ; __vbaVarMove
先eax=字符串地址,然后[ebp+var_DC]= eax,并且有[ebp+var_E4], 8
前面说过variant是16字节,4个dword,第一个dd是类型,第三个dd是值,..DC和E4相差正好C…var_E4是个variant,值=var_cc, __vbaVarMove把variant值做了传递,var_34=var_e4=var_cc(类型转换不说了..)
.text:00405065 lea     edx, [ebp+var_34]
.text:00405068 lea     eax, [ebp+var_E4]
.text:0040506E push    edx
.text:0040506F push    eax
.text:00405070 mov     [ebp+var_FC], 8
.text:0040507A mov     [ebp+var_104], 8002h
.text:00405084 call    ds:__vbaLenVar
取var_34,就是密码了.长度,注意又给var_104赋值了,看着又是variant,=8
后面:
.text:0040508A lea     ecx, [ebp+var_104]
.text:00405090 push    eax
.text:00405091 push    ecx
.text:00405092 call    ds:__vbaVarTstNe; var_104=var_e4=len(password)=8???
call    ds:__vbaLenVar的返回值,放在var_e4里面,var_e4的地址也同时在eax,后面直接就push eax了
.text:0040509B jz      short loc_405106                ; 条件1 长度>8
如果长度不等于8就跳了…还是回去,输个长度是8的密码…继续下去:
.text:0040515A call    ds:__vbaVarForInit
到这里…这个.FroInit,看着好像for …next,自己去vb写个for…next,然后在看看编译的程序…
开始也不知道入栈那么多参数做什么,后面看到了这个:
.text:0040528F lea     ecx, [ebp+var_15C]
.text:00405295 lea     edx, [ebp+var_14C]
.text:0040529B push    ecx
.text:0040529C lea     eax, [ebp+var_24]
.text:0040529F push    edx
.text:004052A0 push    eax.text:004052A1 call    ds:__vbaVarForNext              ; var_15c=8,var_14c=1
.text:004052A1                                         ; for var_24=var14c to var_15c
.text:004052A1                                         ; netx var_24
.text:004052A1                                         ; 如果循环就另eax=1
总算能明白些了.
下来的程序当时做了太多注释…直接贴:
.text:00405160 loc_405160:                             ; CODE XREF: Form1_Command1_Click_2+4E9 j
.text:00405160 cmp     eax, ebx
.text:00405162 jz      loc_4052AE                      ; if eax=0 then   exit for else  继续循环
.text:00405168 lea     eax, [ebp+var_E4]
.text:0040516E lea     ecx, [ebp+var_24]
.text:00405171 push    eax
.text:00405172 push    ecx
.text:00405173 mov     [ebp+var_DC], 1
.text:0040517D mov     [ebp+var_E4], edi               ; var_e4=1
.text:00405183 call    ds:__vbaI4Var
.text:00405189 push    eax
.text:0040518A lea     edx, [ebp+var_34]
.text:0040518D lea     eax, [ebp+var_F4]
.text:00405193 push    edx
.text:00405194 push    eax
.text:00405195 call    ds:rtcMidCharVar                ; var_f4=mid(var_34,var_24,var_e4)
.text:0040519B push    edi
.text:0040519C call    ds:__vbaStrI2                   ; eax=cstr(edi)=cstr(2)
.text:004051A2 mov     edx, eax
.text:004051A4 lea     ecx, [ebp+var_D0]
.text:004051AA call    ds:__vbaStrMove                 ; var_D0=eax
.text:004051B0 push    eax
.text:004051B1 call    ds:rtcAnsiValueBstr             ; eax=asc(var_D0)
.text:004051B7 lea     ecx, [ebp+var_F4]
.text:004051BD lea     edx, [ebp+var_CC]
.text:004051C3 push    ecx
.text:004051C4 push    edx
.text:004051C5 mov     bx, ax                          ; bx=ax=asc(var_D0)=asc(Cstr(2))
.text:004051C8 call    ds:__vbaStrVarVal
.text:004051CE push    eax
.text:004051CF call    ds:rtcAnsiValueBstr             ; eax=asc(var_F4)
.text:004051D5 xor     ebx, eax                        ; ebx=ebx xor eax
.text:004051D5                                         ;    =asc(cstr(2)) xor asc(mid(var_34,var_24,1))
.text:004051D7 lea     eax, [ebp+var_24]
.text:004051DA push    eax
.text:004051DB mov     word ptr [ebp+var_10C], bx      ; var_114=bx= ... xor ...
.text:004051E2 mov     [ebp+var_114], edi
.text:004051E8 call    ds:__vbaI4Var
.text:004051EE mov     ebx, eax
.text:004051F0 cmp     ebx, 0Bh                        ; 下标是不是超出范围了
.text:004051F3 jb      short loc_4051FB                ; ecx=ebx=eax=var_24
.text:004051F5 call    ds:__vbaGenerateBoundsError
.text:004051FB
.text:004051FB loc_4051FB:                             ; CODE XREF: Form1_Command1_Click_2+433 j
.text:004051FB mov     ecx, ebx                        ; ecx=ebx=eax=var_24
.text:004051FD mov     ebx, [ebp+var_50]               ; ebx=var_5CArray1Dat
.text:00405200 shl     ecx, 4
.text:00405203 lea     edx, [ebp+var_114]
.text:00405209 add     ecx, ebx
.text:0040520B call    esi ; __vbaVarMove              ; var_5Carray1(var_24)=var_114
.text:0040520D lea     ecx, [ebp+var_D0]
.text:00405213 lea     edx, [ebp+var_CC]
.text:00405219 push    ecx
.text:0040521A push    edx
.text:0040521B push    edi
.text:0040521C call    ds:__vbaFreeStrList
.text:00405222 lea     eax, [ebp+var_F4]
.text:00405228 lea     ecx, [ebp+var_E4]
.text:0040522E push    eax
.text:0040522F push    ecx
.text:00405230 push    edi
.text:00405231 call    ds:__vbaFreeVarList
.text:00405237 add     esp, 18h
.text:0040523A lea     edx, [ebp+var_24]
.text:0040523D push    edx
.text:0040523E call    ds:__vbaI4Var
.text:00405244 mov     ebx, eax                        ; EBX=EAX=VAR_24
.text:00405246 cmp     ebx, 0Bh                        ; 是不是超出下标范围
.text:00405249 jb      short loc_405251
.text:0040524B call    ds:__vbaGenerateBoundsError
.text:00405251
.text:00405251 loc_405251:                             ; CODE XREF: Form1_Command1_Click_2+489 j
.text:00405251 lea     eax, [ebp+var_24]
.text:00405254 push    eax
.text:00405255 call    ds:__vbaI4Var
.text:0040525B cmp     eax, 9                          ; EAX=VAR_24
.text:0040525E mov     [ebp+var_134], eax              ; VAR_134=VAR_24
.text:00405264 jb      short loc_405272                ; ECX=VAR_5CARRAY_DATA
.text:00405266 call    ds:__vbaGenerateBoundsError
.text:0040526C mov     eax, [ebp+var_134]
.text:00405272
.text:00405272 loc_405272:                             ; CODE XREF: Form1_Command1_Click_2+4A4 j
.text:00405272 mov     ecx, [ebp+var_50]               ; ECX=VAR_5CARRAY_DATA
.text:00405275 mov     edx, ebx                        ; EDX=EBX=VAR_24
.text:00405277 mov     ebx, [ebp+var_A8]               ; EBX=VAR_B4ARRAY_DATA
.text:0040527D shl     edx, 4
.text:00405280 add     edx, ecx                        ; edx=addressof var_5cArray1(var_24)
.text:00405282 mov     ecx, eax                        ; ECX=EAX=VAR_24
.text:00405284 shl     ecx, 4
.text:00405287 add     ecx, ebx                        ; ecx=addressof var_b4array1(var_24)
.text:00405289 call    ds:__vbaVarCopy                 ; var_B4Array(var_24)=var_5CArray(var_24)
.text:0040528F lea     ecx, [ebp+var_15C]
.text:00405295 lea     edx, [ebp+var_14C]
.text:0040529B push    ecx
.text:0040529C lea     eax, [ebp+var_24]
.text:0040529F push    edx
.text:004052A0 push    eax
.text:004052A1 call    ds:__vbaVarForNext              ; var_15c=8,var_14c=1
.text:004052A1                                         ; for var_24=var14c to var_15c
.text:004052A1                                         ; netx var_24
.text:004052A1                                         ; 如果循环就另eax=1
.text:004052A7 xor     ebx, ebx
.text:004052A9 jmp     loc_405160
一个完整的for..next循环:不解释了,
For i = 1 To 8
            var5C(i) = Asc(Mid(strPs, i, 1))
            var5C(i) = var5C(i) Xor int2
            varB4(i) = var5C(i)
Next i

.text:004052AE loc_4052AE:                             ; CODE XREF: Form1_Command1_Click_2+3A2 j
.text:004052AE mov     ebx, 1
.text:004052B3 lea     edx, [ebp+var_104]
.text:004052B9 lea     ecx, [ebp+var_24]
.text:004052BC mov     [ebp+var_FC], ebx
.text:004052C2 mov     [ebp+var_104], edi              ; VAR_104=1
.text:004052C8 call    esi ; __vbaVarMove              ; VAR24=VAR_104=1
.text:004052CA lea     edx, [ebp+var_104]
.text:004052D0 lea     ecx, [ebp+var_9C]
.text:004052D6 mov     [ebp+var_FC], ebx
.text:004052DC mov     [ebp+var_104], edi
.text:004052E2 call    esi ; __vbaVarMove              ; VAR_9C=VAR_104=1
.text:004052E4
.text:004052E4 loc_4052E4:                             ; CODE XREF: Form1_Command1_Click_2+660 j
.text:004052E4 mov     ebx, ds:__vbaI4Var
.text:004052EA lea     ecx, [ebp+var_24]
.text:004052ED push    ecx
.text:004052EE call    ebx ; __vbaI4Var                ; EAX=VAR_24
.text:004052F0 cmp     eax, 0Bh
.text:004052F3 mov     [ebp+var_138], eax              ; VAR_138=EAX=VAR_24
.text:004052F9 jb      short loc_405301
.text:004052FB call    ds:__vbaGenerateBoundsError
.text:00405301
.text:00405301 loc_405301:                             ; CODE XREF: Form1_Command1_Click_2+539 j
.text:00405301 lea     edx, [ebp+var_24]
.text:00405304 lea     eax, [ebp+var_104]
.text:0040530A push    edx
.text:0040530B lea     ecx, [ebp+var_E4]
.text:00405311 push    eax
.text:00405312 push    ecx
.text:00405313 mov     [ebp+var_FC], 1
.text:0040531D mov     [ebp+var_104], edi              ; VAR_104=1
.text:00405323 call    ds:__vbaVarAdd                  ; VAR_E4=VAR_104+VAR_24
.text:00405329 push    eax
.text:0040532A call    ebx ; __vbaI4Var
.text:0040532C mov     ebx, eax                        ; EBX=EAX=VAR_24+VAR_104
.text:0040532E cmp     ebx, 0Bh
.text:00405331 jb      short loc_405339
.text:00405333 call    ds:__vbaGenerateBoundsError
.text:00405339
.text:00405339 loc_405339:                             ; CODE XREF: Form1_Command1_Click_2+571 j
.text:00405339 lea     edx, [ebp+var_9C]
.text:0040533F push    edx
.text:00405340 call    ds:__vbaI4Var                   ; EAX=VAR_9C
.text:00405346 cmp     eax, 0Bh
.text:00405349 mov     [ebp+var_134], eax              ; VAR_134=EAX=VAR_9C
.text:0040534F jb      short loc_405357                ; ECX=VAR_138
.text:00405351 call    ds:__vbaGenerateBoundsError
.text:00405357
.text:00405357 loc_405357:                             ; CODE XREF: Form1_Command1_Click_2+58F j
.text:00405357 mov     ecx, [ebp+var_138]              ; ECX=VAR_138
.text:0040535D mov     eax, [ebp+var_50]               ; EAX=VAR_5CVARRAY1DAT
.text:00405360 shl     ecx, 4                          ; VAR_138
.text:00405363 shl     ebx, 4                          ; EBX=VAR_24+VAR_104
.text:00405366 add     ecx, eax                        ; ecx=VAR_5CARRAY(VAR_138)
.text:00405368 add     ebx, eax                        ; EBX=VAR_5CARRAY(VAR_24+VAR_104)
.text:0040536A push    ecx                             ; ECX=ADDRESSOF VAR_5CARRAY1(VAR_138)
.text:0040536B lea     eax, [ebp+var_F4]
.text:00405371 push    ebx                             ; EBX=ADDRESSOF VAR_5CARRAY1(VAR_24+VAR_104)
.text:00405372 push    eax
.text:00405373 call    ds:__vbaVarXor                  ; VAR_F4= VAR_5CARRAY1(VAR_138) XOR VAR_5CARRAY1(VAR_24+VAR_104)
.text:00405373                                         ; EAX=VAR_F4
.text:00405379 mov     ecx, [ebp+var_134]              ; ECX=VAR_134
.text:0040537F mov     ebx, [ebp+var_50]               ; EBX=VAR_5CARRAY1
.text:00405382 shl     ecx, 4
.text:00405385 mov     edx, eax                        ; EDX=EAX=VAR_F4
.text:00405387 add     ecx, ebx                        ; ECX=ADDRESSOF VAR_5CARRAY1(VAR_134)
.text:00405389 call    esi ; __vbaVarMove              ; VAR_5CARRAY1(VAR_134)=VAR_F4
.text:0040538B lea     ecx, [ebp+var_E4]
.text:00405391 call    ds:__vbaFreeVar
.text:00405397 mov     ebx, ds:__vbaVarAdd
.text:0040539D lea     ecx, [ebp+var_24]
.text:004053A0 lea     edx, [ebp+var_104]
.text:004053A6 push    ecx
.text:004053A7 lea     eax, [ebp+var_E4]
.text:004053AD push    edx
.text:004053AE push    eax
.text:004053AF mov     [ebp+var_FC], edi               ; VAR_104=2
.text:004053B5 mov     [ebp+var_104], edi
.text:004053BB call    ebx ; __vbaVarAdd               ; VAR_E4=VAR_24 + VAR_104
.text:004053BD mov     edx, eax                        ; EDX=VAR_E4
.text:004053BF lea     ecx, [ebp+var_24]
.text:004053C2 call    esi ; __vbaVarMove              ; VAR_24=VAR_E4
.text:004053C4 lea     ecx, [ebp+var_9C]
.text:004053CA lea     edx, [ebp+var_104]
.text:004053D0 push    ecx
.text:004053D1 lea     eax, [ebp+var_E4]
.text:004053D7 push    edx
.text:004053D8 push    eax
.text:004053D9 mov     [ebp+var_FC], 1                 ; VAR_104=1
.text:004053E3 mov     [ebp+var_104], edi
.text:004053E9 call    ebx ; __vbaVarAdd               ; VAR_E4=VAR_9C + VAR_104
.text:004053EB mov     edx, eax
.text:004053ED lea     ecx, [ebp+var_9C]
.text:004053F3 call    esi ; __vbaVarMove              ; VAR_9C=VAR_E4
.text:004053F5 lea     ecx, [ebp+var_9C]
.text:004053FB lea     edx, [ebp+var_104]
.text:00405401 push    ecx
.text:00405402 push    edx
.text:00405403 mov     [ebp+var_FC], 4
.text:0040540D mov     [ebp+var_104], 8002h            ; VAR_104=4
.text:00405417 call    ds:__vbaVarTstGt                ; VAR_104>VAR_9C?
.text:0040541D test    ax, ax
.text:00405420 jz      loc_4052E4
.text:00405426 mov     eax, [ebp+var_50]               ; EAX=VAR_5CARRAY
.text:00405429 mov     ebx, ds:__vbaVarXor
.text:0040542F lea     edx, [ebp+var_E4]
.text:00405435 lea     ecx, [eax+10h]                  ; ECX=VAR_5CARRAY(1)
.text:00405438 add     eax, 20h                        ; EAX=VAR_5CARRAY(2)
.text:0040543B push    ecx
.text:0040543C push    eax
.text:0040543D push    edx
.text:0040543E call    ebx ; __vbaVarXor               ; VAR_E4=VAR_5CARRAY(1) XOR VAR_5CARRAY(2)
.text:00405440 mov     edx, eax                        ; EDX=EAX=VAR_E4
.text:00405442 mov     eax, [ebp+var_50]
.text:00405445 lea     ecx, [eax+10h]                  ; ECX=VAR_5CARRAY(1)
.text:00405448 call    esi ; __vbaVarMove              ; VAR_5CARRAY(1)=VAR_E4
.text:0040544A mov     eax, [ebp+var_50]
.text:0040544D lea     edx, [ebp+var_E4]
.text:00405453 lea     ecx, [eax+30h]                  ; ECX=VAR_5CARRAY(3)
.text:00405456 add     eax, 40h                        ; EAX=VAR_5CARRAY(4)
.text:00405459 push    ecx
.text:0040545A push    eax
.text:0040545B push    edx
.text:0040545C call    ebx ; __vbaVarXor               ; VAR_E4=VAR_5CARRAY(4) XOR VAR_5CARRAY(3)
.text:0040545E mov     edx, eax                        ; VAR_E4
.text:00405460 mov     eax, [ebp+var_50]
.text:00405463 lea     ecx, [eax+20h]                  ; VAR_5CARRAY(2)
.text:00405466 call    esi ; __vbaVarMove              ; VAR_5CARRAY(2)=VAR_E4
.text:00405468 mov     eax, [ebp+var_50]
.text:0040546B lea     edx, [ebp+var_E4]
.text:00405471 lea     ecx, [eax+10h]
.text:00405474 add     eax, 20h
.text:00405477 push    ecx
.text:00405478 push    eax
.text:00405479 push    edx
.text:0040547A call    ebx ; __vbaVarXor               ; VAR_E4=VAR_5CARRAY(1) XOR VAR_5CARRAY(2)
.text:0040547C mov     edx, eax                        ; EAX=VAR_E4
.text:0040547E lea     ecx, [ebp+var_70]
.text:00405481 call    esi ; __vbaVarMove              ; VAR_70=VAR_E4
.text:00405483 lea     edx, [ebp+var_104]
.text:00405489 lea     ecx, [ebp+var_24]
.text:0040548C mov     [ebp+var_FC], 1
.text:00405496 mov     [ebp+var_104], edi              ; VAR_104=1
.text:0040549C call    esi ; __vbaVarMove              ; VAR_24=VAR_104=1
.text:0040549E
.text:0040549E loc_40549E:                             ; CODE XREF: Form1_Command1_Click_2+796 j
.text:0040549E lea     eax, [ebp+var_24]
.text:004054A1 push    eax
.text:004054A2 call    ds:__vbaI4Var
.text:004054A8 mov     ebx, eax                        ; EBX=EAX=VAR_24
.text:004054AA cmp     ebx, 9                          ; VAR_24<9
.text:004054AD jb      short loc_4054B5
.text:004054AF call    ds:__vbaGenerateBoundsError
.text:004054B5
.text:004054B5 loc_4054B5:                             ; CODE XREF: Form1_Command1_Click_2+6ED j
.text:004054B5 lea     ecx, [ebp+var_24]
.text:004054B8 push    ecx
.text:004054B9 call    ds:__vbaI4Var
.text:004054BF cmp     eax, 0Bh                        ; VAR_24<&HB
.text:004054C2 mov     [ebp+var_134], eax              ; var_134=var_24
.text:004054C8 jb      short loc_4054D0                ; EAX=VAR_B4ARRAY3
.text:004054CA call    ds:__vbaGenerateBoundsError
.text:004054D0
.text:004054D0 loc_4054D0:                             ; CODE XREF: Form1_Command1_Click_2+708 j
.text:004054D0 mov     eax, [ebp+var_A8]               ; EAX=VAR_B4ARRAY3
.text:004054D6 lea     edx, [ebp+var_70]
.text:004054D9 shl     ebx, 4                          ; ebx=var_24
.text:004054DC add     ebx, eax                        ; VAR_B4ARRAY3(VAR_70)
.text:004054DE push    edx
.text:004054DF lea     eax, [ebp+var_E4]
.text:004054E5 push    ebx
.text:004054E6 push    eax
.text:004054E7 call    ds:__vbaVarXor                  ; VAR_E4=VAR_B4ARRAY3(VAR_24) XOR VAR_70
.text:004054E7                                         ; EAX=VAR_E4
.text:004054ED mov     ecx, [ebp+var_134]
.text:004054F3 mov     ebx, [ebp+var_50]
.text:004054F6 shl     ecx, 4
.text:004054F9 mov     edx, eax                        ; EDX=EAX=VAR_E4
.text:004054FB add     ecx, ebx                        ; ECX=VAR_5CARRAY1(VAR_134)
.text:004054FD call    esi ; __vbaVarMove              ; VAR_5CARRAY1(VAR_134)=VAR_E4
.text:004054FF lea     ecx, [ebp+var_24]
.text:00405502 lea     edx, [ebp+var_104]
.text:00405508 push    ecx
.text:00405509 lea     eax, [ebp+var_E4]
.text:0040550F push    edx
.text:00405510 push    eax
.text:00405511 mov     [ebp+var_FC], 1
.text:0040551B mov     [ebp+var_104], edi              ; VAR_104=1
.text:00405521 call    ds:__vbaVarAdd                  ; VAR_E4=VAR_104 + VAR_24
.text:00405527 mov     edx, eax
.text:00405529 lea     ecx, [ebp+var_24]
.text:0040552C call    esi ; __vbaVarMove              ; VAR_24=VAR_E4
.text:0040552E lea     ecx, [ebp+var_24]
.text:00405531 lea     edx, [ebp+var_104]
.text:00405537 push    ecx
.text:00405538 push    edx
.text:00405539 mov     [ebp+var_FC], 8                 ; VAR_104=8
.text:00405543 mov     [ebp+var_104], 8002h
.text:0040554D call    ds:__vbaVarTstGt                ; VAR_104>VAR_24?
.text:00405553 test    ax, ax
.text:00405556 jz      loc_40549E
.text:0040555C lea     edx, [ebp+var_104]
.text:00405562 lea     ecx, [ebp+var_24]
.text:00405565 mov     [ebp+var_FC], 1
.text:0040556F mov     [ebp+var_104], edi
.text:00405575 call    esi ; __vbaVarMove              ; VAR_24=VAR_104=1
.text:00405577 lea     edx, [ebp+var_104]
.text:0040557D lea     ecx, [ebp+var_70]
.text:00405580 mov     [ebp+var_FC], 0
.text:0040558A mov     [ebp+var_104], edi
.text:00405590 call    esi ; __vbaVarMove              ; VAR_70=VAR_104=0
.text:00405592
.text:00405592 loc_405592:                             ; CODE XREF: Form1_Command1_Click_2+8AD j
.text:00405592 mov     ebx, ds:__vbaI4Var
.text:00405598 lea     eax, [ebp+var_24]
.text:0040559B push    eax
.text:0040559C call    ebx ; __vbaI4Var
.text:0040559E cmp     eax, 0Bh                        ; VAR_24>B?
.text:004055A1 mov     [ebp+var_134], eax              ; VAR_134=VAR_24
.text:004055A7 jb      short loc_4055AF
.text:004055A9 call    ds:__vbaGenerateBoundsError
.text:004055AF
.text:004055AF loc_4055AF:                             ; CODE XREF: Form1_Command1_Click_2+7E7 j
.text:004055AF lea     ecx, [ebp+var_24]
.text:004055B2 push    ecx
.text:004055B3 call    ebx ; __vbaI4Var
.text:004055B5 mov     ebx, eax
.text:004055B7 cmp     ebx, 9                          ; EBX=VAR_24>9?
.text:004055BA jb      short loc_4055C2                ; EAX=VAR_134
.text:004055BC call    ds:__vbaGenerateBoundsError
.text:004055C2
.text:004055C2 loc_4055C2:                             ; CODE XREF: Form1_Command1_Click_2+7FA j
.text:004055C2 mov     eax, [ebp+var_134]              ; EAX=VAR_134
.text:004055C8 mov     ecx, [ebp+var_50]               ; ECX=VAR_5CARRAY
.text:004055CB shl     eax, 4
.text:004055CE add     eax, ecx                        ; EAX=VAR_5CARRAY(VAR_134)
.text:004055D0 push    eax
.text:004055D1 mov     eax, [ebp+var_7C]               ; EAX=VAR_88ARRAY
.text:004055D4 shl     ebx, 4                          ; EBX=VAR_24
.text:004055D7 add     ebx, eax                        ; EBX=VAR_88ARRY(VAR_24)
.text:004055D9 push    ebx
.text:004055DA call    ds:__vbaVarTstNe                ; VAR_5CARRY(VAR_134)=VAR88ARRY(VAR_24)?
.text:004055E0 test    ax, ax
.text:004055E3 jnz     loc_405673
.text:004055E9 mov     ebx, ds:__vbaVarAdd
.text:004055EF lea     edx, [ebp+var_24]
.text:004055F2 lea     eax, [ebp+var_104]
.text:004055F8 push    edx
.text:004055F9 lea     ecx, [ebp+var_E4]
.text:004055FF push    eax
.text:00405600 push    ecx
.text:00405601 mov     [ebp+var_FC], 1
.text:0040560B mov     [ebp+var_104], edi              ; VAR_104=1
.text:00405611 call    ebx ; __vbaVarAdd               ; VAR_E4=VAR_24 ADD VAR_104
.text:00405613 mov     edx, eax
.text:00405615 lea     ecx, [ebp+var_24]
.text:00405618 call    esi ; __vbaVarMove              ; VAR_24=VAR_E4
.text:0040561A lea     edx, [ebp+var_70]
.text:0040561D lea     eax, [ebp+var_104]
.text:00405623 push    edx
.text:00405624 lea     ecx, [ebp+var_E4]
.text:0040562A push    eax
.text:0040562B push    ecx
.text:0040562C mov     [ebp+var_FC], 1                 ; VAR_104=1
.text:00405636 mov     [ebp+var_104], edi
.text:0040563C call    ebx ; __vbaVarAdd               ; VAR_E4=VAR_70 + VAR_104
.text:0040563E mov     edx, eax
.text:00405640 lea     ecx, [ebp+var_70]
.text:00405643 call    esi ; __vbaVarMove              ; VAR_70=VAR_E4
.text:00405645 lea     edx, [ebp+var_24]
.text:00405648 lea     eax, [ebp+var_104]
.text:0040564E push    edx
.text:0040564F push    eax
.text:00405650 mov     [ebp+var_FC], 8
.text:0040565A mov     [ebp+var_104], 8002h            ; VAR_104=8
.text:00405664 call    ds:__vbaVarTstGt                ; VAR_104>VAR_24
.text:0040566A test    ax, ax
.text:0040566D jz      loc_405592
.text:00405673
.text:00405673 loc_405673:                             ; CODE XREF: Form1_Command1_Click_2+823 j
.text:00405673 lea     ecx, [ebp+var_70]
.text:00405676 lea     edx, [ebp+var_104]
.text:0040567C push    ecx
.text:0040567D push    edx
.text:0040567E mov     [ebp+var_FC], 8
.text:00405688 mov     [ebp+var_104], 8002h
.text:00405692 call    ds:__vbaVarTstEq
.text:00405698 test    ax, ax
.text:0040569B mov     eax, [ebp+arg_0]
.text:0040569E jz      short loc_4056D9
.text:004056A0 mov     ecx, [eax]
.text:004056A2 push    eax
.text:004056A3 call    dword ptr [ecx+308h]
.text:004056A9 lea     edx, [ebp+var_D4]
.text:004056AF push    eax
.text:004056B0 push    edx
.text:004056B1 call    ds:__vbaObjSet
.text:004056B7 mov     esi, eax
.text:004056B9 lea     eax, [ebp+var_44]               ; success msgbox
.text:004056BC lea     ecx, [ebp+var_CC]
.text:004056C2 push    eax
.text:004056C3 mov     edi, [esi]
.text:004056C5 push    ecx
.text:004056C6 call    ds:__vbaStrVarVal
.text:004056CC push    eax
.text:004056CD push    esi
.text:004056CE call    dword ptr [edi+54h]
整个程序对应的vb,不完全和原程序相同,只追求逻辑相同..
Dim str2 As String
str2 = "2"
Dim var5C(1 To 8) As Integer
Dim var88(1 To 8) As Integer
Dim varB4(1 To 8) As Integer
Dim i As Long
Dim int2 As Integer
int2 = Asc(str2)

var88(1) = &H71
var88(2) = &H18
var88(3) = &H59
var88(4) = &H1B
var88(5) = &H79
var88(6) = &H42
var88(7) = &H45
var88(8) = &H4C
For i = 1 To 8
            var5C(i) = ps(i) ' Asc(Mid(strPs, i, 1))
            var5C(i) = var5C(i) Xor int2
            varB4(i) = var5C(i)
Next i
Dim j, k

For i = 1 To 4
j = (i - 1) * 2 + 1
k = (i - 1) * 2 + 2
var5C(i) = var5C(j) Xor var5C(k)
Next i

var5C(1) = var5C(1) Xor var5C(2)
var5C(2) = var5C(3) Xor var5C(4)
var5C(1) = var5C(1) Xor var5C(2)
Dim var70 As Integer
var70 = var5C(1)
For i = 1 To 8
            var5C(i) = varB4(i) Xor var70
Next i
然后就是比较var5C和var88是不是完全相同,完全相同就成功…
写注册程序就…
假定注册码的8个位分别是abcdefgh.
我们知道,
a xor b=b xor a
a xor b xor c=c xor b xor a
a xor a=0
0 xor a=a
通过xor的特性,做下面的表格,表格是excel的,懒的输入xor了,用.代替xor…表格里面的数值都是hex

最后的等式是a.32=18.59.1b.79.42.45.4c,等式的右边少了&H71,就是var88(1)
最后,假设 temp= &H71 xor &H18 xor &H59 xor &H1B xor &H79 xor &H42 xor &H45 xor &H4C
那么就有:
int2=asc("2")
a = temp Xor var88(1) Xor int2
b = temp Xor var88(2) Xor int2
c = temp Xor var88(3) Xor int2
d = temp Xor var88(4) Xor int2
e = temp Xor var88(5) Xor int2
f = temp Xor var88(6) Xor int2
g = temp Xor var88(7) Xor int2
h = temp xor var88(8) Xor int2
这样注册码就算出来是Z3r0Ring
int2=asc("2")
var70 = 0: For j = 1 To 8: var70 = var70 Xor var88(j): Next j: Debug.Print Hex(var70)

For i = 1 To 8
            ps(i) = var70 Xor var88(i) Xor int2
Next i
For i = 1 To 8
Debug.Print Chr(ps(i));
Next i
2011-8-4 17:43
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
感谢大牛,这样我可以好好学习学习了
2011-8-4 17:55
0
雪    币: 517
活跃值: (74)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
为什么不用VB Decompiler
2011-8-4 22:03
0
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
牛啊。。。。。。。。。
2011-8-4 22:13
0
雪    币: 588
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我下载的VB Decompiler仅仅能输出程序结构,用户程序一点没有输出...

也许版本太低了...

另外工具crack太没技术含量了,没什么技术提高,不过倒是能节约时间,提高速度....

要是每天都玩收费破解,多弄写工具也不错
2011-8-5 09:10
0
游客
登录 | 注册 方可回帖
返回