下了个VB6写的crack练练(听说VB的不好弄:),本想参考OD教程去试试能不能破解(目前会用字符串和函数参考,埃~~我真TM菜)
结果弄了好久也只是个爆破,还有好多不懂的,请教大家。
下载地址http://bbs.pediy.com/upload/2005/37/files/crack456.rar_469.rar
先看看crack456.exe的特点,2个输入框,没注册成功就显示“别灰心,再来”,这几个字不是用窗口弹出来的。
1、用OD打开---》参考文本字串,得到一堆没用的东西:
00401010 dd MSVBVM60.__vbaEnd ASCII "hh?
0040102C dd MSVBVM60._adj_fdiv_m16i ASCII "P哙%"
00401030 dd MSVBVM60._adj_fdivr_m16i ASCII "P哙%"
0040103C dd MSVBVM60.__vbaChkstk ASCII "QWP=" <----
-什么东西?乱码?请指点
00401070 dd MSVBVM60._adj_fdiv_m32i ASCII "P哙%"
00401074 dd MSVBVM60._adj_fdivr_m32i ASCII "P哙%"
004014B8 dd 复件_cra.00402440 ASCII "??l$"
……………………很多代码 省略了 反正没有价值的……………………………
004019F4 ascii "__vbaEnd",0
00401AA0 dd 复件_cra.004017D8 ASCII "Form"
00401AC8 dd 复件_cra.00401864 ASCII "Text2"
00401AF0 dd 复件_cra.0040186C ASCII "Text1"
00401B18 dd 复件_cra.00401884 ASCII "Label1"
2个输入框款,2个按钮,2个提示,1个窗口
00401B40 dd 复件_cra.0040188C ASCII "Label2"
00401B68 dd 复件_cra.004018A4 ASCII "Command1"
00401B90 dd 复件_cra.004018B0 ASCII "Command2"
00402139 mov edx, 复件_cra.004018DC UNICODE "crackerlnn"
再用W32Dasm打开,字符数据参考 ,仅仅看到"VB5!"
看来用字符串参考找是不行的。
2、试试CCDebuger教我们的第二招(碰碰运气:)--函数参考
查找----当前模块中的名称:
地址 区段 类型 名称
00401084 .text 输入 MSVBVM60.#100
……………………省略了一些……………………………
0040108C .text 输入 MSVBVM60._CIatan
00401000 .text 输入 MSVBVM60._CIcos
00401098 .text 输入 MSVBVM60._CIexp
0040106C .text 输入 MSVBVM60._CIlog <-------三角函数
不会用这些做算法把!
00401038 .text 输入 MSVBVM60._CIsin 是不是太残忍了
00401050 .text 输入 MSVBVM60._CIsqrt
00401094 .text 输入 MSVBVM60._CItan
00401040 .text 输入 MSVBVM60.EVENT_SINK_AddRef
00401058 .text 输入 MSVBVM60.EVENT_SINK_QueryInterface
0040104C .text 输入 MSVBVM60.EVENT_SINK_Release
00401034 .text 输入 MSVBVM60.__vbaBoolVarNull
0040103C .text 输入 MSVBVM60.__vbaChkstk
00401010 .text 输入 MSVBVM60.__vbaEnd
0040105C .text 输入 MSVBVM60.__vbaExceptHandler
00401068 .text 输入 MSVBVM60.__vbaFPException
0040109C .text 输入 MSVBVM60.__vbaFreeObj -------
004010A0 .text 输入 MSVBVM60.__vbaFreeStr -------没
学过VB,不知道这几个做什么的
0040100C .text 输入 MSVBVM60.__vbaFreeVar --------
00401014 .text 输入 MSVBVM60.__vbaFreeVarList-------
00401020 .text 输入 MSVBVM60.__vbaHresultCheckObj
00401028 .text 输入 MSVBVM60.__vbaObjSet
00401044 .text 输入 MSVBVM60.__vbaPrintObj <------应
该是显示什么的,如成功失败
00401078 .text 输入 MSVBVM60.__vbaStrCopy <----用这
个获得我们输的用户名 序列号
00401054 .text 输入 MSVBVM60.__vbaVarAnd
00401088 .text 输入 MSVBVM60.__vbaVarCmpEq <----测试
变量是否相等,觉得比较重要,下个断点
00401008 .text 输入 MSVBVM60.__vbaVarMove
(在vbaStrCopy vbaVarCmpEq vbaPrintObj这3个地方下断点,程序停止的地方相差不太远,都在0040214A附近。)
在vbaVarCmpEq下断点,提示有2个断点。运行程序,程序停止在0040214A:
00402141 . FF15 78104000 call [<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
问题:调用字串复制,字串复制到哪儿去了?
00402147 . 8B4D D8 mov ecx, [ebp-28]
0040214A . 8B3D 88104000 mov edi, [<&MSVBVM60.__vbaVarCmpEq>] ; MSVBVM60.__vbaVarCmpEq
00402150 . 8D55 DC lea edx, [ebp-24]
00402153 . 894D 84 mov [ebp-7C], ecx
00402156 . 8D85 7CFFFFFF lea eax, [ebp-84]
0040215C . 52 push edx
0040215D . 8D4D AC lea ecx, [ebp-54]
00402160 . 50 push eax
00402161 . 51 push ecx
00402162 . C785 7CFFFFFF>mov dword ptr [ebp-84], 8008
0040216C . 66:C785 74FFF>mov word ptr [ebp-8C], 463
00402175 . C785 6CFFFFFF>mov dword ptr [ebp-94], 8002
0040217F . FFD7 call edi ; <&MSVBVM60.__vbaVarCmpEq>
问题:调用比较,它把什么和什么比较了,在哪儿比较的?
00402181 . 50 push eax
00402182 . 8D55 C8 lea edx, [ebp-38]
00402185 . 8D85 6CFFFFFF lea eax, [ebp-94]
0040218B . 52 push edx
0040218C . 8D4D 9C lea ecx, [ebp-64]
0040218F . 50 push eax
00402190 . 51 push ecx
00402191 . FFD7 call edi 又调用了一次
00402193 . 8D55 8C lea edx, [ebp-74]
00402196 . 50 push eax
00402197 . 52 push edx
00402198 . FF15 54104000 call [<&MSVBVM60.__vbaVarAnd>] ; MSVBVM60.__vbaVarAnd
0040219E . 50 push eax
0040219F . FF15 34104000 call [<&MSVBVM60.__vbaBoolVarNull>] ; MSVBVM60.__vbaBoolVarNull
004021A5 . 66:85C0 test ax, ax 这个重要,比较结果直接
影响输出显示什么
004021A8 . 74 07 je short crack456.004021B1 相等,把
00401910压入堆栈
004021AA . 68 F8184000 push crack456.004018F8 不等则把
004018F8压入堆栈
004021AF . EB 05 jmp short crack456.004021B6
004021B1 > 68 10194000 push crack456.00401910
004021B6 > 56 push esi
004021B7 . 68 08194000 push crack456.00401908
004021BC . FF15 44104000 call [<&MSVBVM60.__vbaPrintObj>] ; MSVBVM60.__vbaPrintObj
004021C2 . 83C4 0C add esp, 0C
看了很久发现004021A8 je short crack456.004021B1应该是关键,用HIEW把7407 该成7507,即jne。保存,运行,随便输入用户名
序列号,提示"你真棒",日,暴破
看了很久,就是不知道它把我输入的序列号和真正的序列号是怎么在比较的,在哪儿比较的。就看不出来它的算法和正确的序列号。高手指点一下。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)