【文章标题】: lnn1123的crack456的破解
【文章作者】: dewar
【软件名称】: lnn1123的crack456
【下载地址】: 本论坛之初入门新手crackme博物馆7楼
【加壳方式】: 无
【编写语言】: VB
【使用工具】: OD
【操作平台】: WINXP
【软件介绍】: lnn1123的crack456
【作者声明】: 偶是菜鸟,愿意与大家一起交流!
--------------------------------------------------------------------------------
【详细过程】
这是一个很简单的crackme,可能对大多数象我一样的菜鸟来说,它难就难在,没有对话框提示,而VB的程序又找不到相应的提示字符串,所以断不下来觉得无从下手.但它必竞有提示,只不过是显示在主窗体上.我们就从这里入手吧.越是难的地方,往往就越是我们的突破口^_^.(一个臭鸡蛋扔过来,我躲!!:P)
好了,各位菜鸟和我一起拿起我们的武器:OLLYDBG,准备动手了.
首先用OD载入,前面说了,这个VB程序无对话框提示,只是在主窗体上打印出相应的出错提示,因此我们就从这个打印主窗体的函数入手.而这个函数位于VB程序特有的动态链接库MSVBVM60中,我们ALT+E打开模块窗口,找到MSVBVM6O.DLL,双击它,然后按Ctrl+N(或在MSVBVM60的领空中,右键-->查找-->当前模块中的名称(标签))就可看到MSVBVM60.DLL的所有的输入输出函数.我们找到vbaPrintObj在它对应的地址上下F2断点,然后F9运行,输入任意的注册名和注册码后点"注册"按钮,程序就被断下,我们发现断在MSVBVM60的领空,按ALT+F9就可返回主程序的领空了.
......
004021BC . FF15 44104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaPrintObj>] ; <====这就是在主窗体上打印相关信息的函数调用
004021C2 . 83C4 0C ADD ESP, 0C ; <====返回在这里,注册码的比较一定在这上面
004021C5 . 895D FC MOV DWORD PTR SS:[EBP-4], EBX
004021C8 . 68 13224000 PUSH crack456.00402213
......
可见程序注册码的计算和比较部分一定在这之前!!我们向前找
......
0040208D . 8BF8 MOV EDI, EAX
0040208F . 8D55 C0 LEA EDX, DWORD PTR SS:[EBP-40]
00402092 . 52 PUSH EDX
00402093 . 57 PUSH EDI
00402094 . 8B0F MOV ECX, DWORD PTR DS:[EDI]
00402096 . FF91 A0000000 CALL DWORD PTR DS:[ECX+A0] ; <====这里取得输入的注册名
0040209C . 3BC3 CMP EAX, EBX
0040209E . DBE2 FCLEX
004020A0 . 7D 12 JGE SHORT crack456.004020B4
004020A2 . 68 A0000000 PUSH 0A0
004020A7 . 68 C8184000 PUSH crack456.004018C8
004020AC . 57 PUSH EDI
004020AD . 50 PUSH EAX
004020AE . FF15 20104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresultChe>; MSVBVM60.__vbaHresultCheckObj
004020B4 > 8B45 C0 MOV EAX, DWORD PTR SS:[EBP-40]
004020B7 . 8D55 AC LEA EDX, DWORD PTR SS:[EBP-54]
004020BA . 8D4D DC LEA ECX, DWORD PTR SS:[EBP-24]
004020BD . 895D C0 MOV DWORD PTR SS:[EBP-40], EBX
004020C0 . 8945 B4 MOV DWORD PTR SS:[EBP-4C], EAX
004020C3 . C745 AC 08000>MOV DWORD PTR SS:[EBP-54], 8
004020CA . FF15 08104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMove>] ; MSVBVM60.__vbaVarMove
004020D0 . 8D4D BC LEA ECX, DWORD PTR SS:[EBP-44]
004020D3 . FF15 9C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeObj>] ; MSVBVM60.__vbaFreeObj
004020D9 . 8B06 MOV EAX, DWORD PTR DS:[ESI]
004020DB . 56 PUSH ESI
004020DC . FF90 08030000 CALL DWORD PTR DS:[EAX+308]
004020E2 . 8D4D BC LEA ECX, DWORD PTR SS:[EBP-44]
004020E5 . 50 PUSH EAX
004020E6 . 51 PUSH ECX
004020E7 . FF15 28104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSet>] ; MSVBVM60.__vbaObjSet
004020ED . 8BF8 MOV EDI, EAX
004020EF . 8D45 C0 LEA EAX, DWORD PTR SS:[EBP-40]
004020F2 . 50 PUSH EAX
004020F3 . 57 PUSH EDI
004020F4 . 8B17 MOV EDX, DWORD PTR DS:[EDI]
004020F6 . FF92 A0000000 CALL DWORD PTR DS:[EDX+A0] ; <====这里取得输入的注册码
004020FC . 3BC3 CMP EAX, EBX
004020FE . DBE2 FCLEX
00402100 . 7D 12 JGE SHORT crack456.00402114
00402102 . 68 A0000000 PUSH 0A0
00402107 . 68 C8184000 PUSH crack456.004018C8
0040210C . 57 PUSH EDI
0040210D . 50 PUSH EAX
0040210E . FF15 20104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresultChe>; MSVBVM60.__vbaHresultCheckObj
00402114 > 8B45 C0 MOV EAX, DWORD PTR SS:[EBP-40]
00402117 . 8D55 AC LEA EDX, DWORD PTR SS:[EBP-54]
0040211A . 8D4D C8 LEA ECX, DWORD PTR SS:[EBP-38]
0040211D . 895D C0 MOV DWORD PTR SS:[EBP-40], EBX
00402120 . 8945 B4 MOV DWORD PTR SS:[EBP-4C], EAX
00402123 . C745 AC 08000>MOV DWORD PTR SS:[EBP-54], 8
0040212A . FF15 08104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMove>] ; MSVBVM60.__vbaVarMove
00402130 . 8D4D BC LEA ECX, DWORD PTR SS:[EBP-44]
00402133 . FF15 9C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeObj>] ; MSVBVM60.__vbaFreeObj
00402139 . BA DC184000 MOV EDX, crack456.004018DC ; <====这里将正确的注册名crackerlnn送到寄存器EDX
0040213E . 8D4D D8 LEA ECX, DWORD PTR SS:[EBP-28]
00402141 . FF15 78104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
00402147 . 8B4D D8 MOV ECX, DWORD PTR SS:[EBP-28]
0040214A . 8B3D 88104000 MOV EDI, DWORD PTR DS:[<&MSVBVM60.__vbaVarCm>; MSVBVM60.__vbaVarCmpEq
00402150 . 8D55 DC LEA EDX, DWORD PTR SS:[EBP-24]
00402153 . 894D 84 MOV DWORD PTR SS:[EBP-7C], ECX
00402156 . 8D85 7CFFFFFF LEA EAX, DWORD PTR SS:[EBP-84]
0040215C . 52 PUSH EDX
0040215D . 8D4D AC LEA ECX, DWORD PTR SS:[EBP-54]
00402160 . 50 PUSH EAX
00402161 . 51 PUSH ECX
00402162 . C785 7CFFFFFF>MOV DWORD PTR SS:[EBP-84], 8008
0040216C . 66:C785 74FFF>MOV WORD PTR SS:[EBP-8C], 463 ; <====这里将正确的注册码463(H)=1123(D)压栈
00402175 . C785 6CFFFFFF>MOV DWORD PTR SS:[EBP-94], 8002
0040217F . FFD7 CALL EDI ; <====这里将输入的注册名和crackerlnn进行比较,返回一个逻辑值A
00402181 . 50 PUSH EAX
00402182 . 8D55 C8 LEA EDX, DWORD PTR SS:[EBP-38]
00402185 . 8D85 6CFFFFFF LEA EAX, DWORD PTR SS:[EBP-94]
0040218B . 52 PUSH EDX
0040218C . 8D4D 9C LEA ECX, DWORD PTR SS:[EBP-64]
0040218F . 50 PUSH EAX
00402190 . 51 PUSH ECX
00402191 . FFD7 CALL EDI ; <====这里将输入的注册码和正确的注册码463(H)=1123(D)进行比较,返回一个逻辑值B
00402193 . 8D55 8C LEA EDX, DWORD PTR SS:[EBP-74]
00402196 . 50 PUSH EAX
00402197 . 52 PUSH EDX
00402198 . FF15 54104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAnd>] ; <====这里将前面返回的两个逻辑值A和B相与得到一个逻辑值C
0040219E . 50 PUSH EAX
0040219F . FF15 34104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaBoolVarNul>; MSVBVM60.__vbaBoolVarNull
004021A5 . 66:85C0 TEST AX, AX ; <====这里测试逻辑值C的真假
004021A8 . 74 07 JE SHORT crack456.004021B1 ; <====为假就跳(爆破点)
004021AA . 68 F8184000 PUSH crack456.004018F8 ; <====注册正确提示"你真棒"压栈
004021AF . EB 05 JMP SHORT crack456.004021B6 ; <====跳去在主窗体上打印注册正确的提示
004021B1 > 68 10194000 PUSH crack456.00401910 ; <====逻辑值C为假就跳到这里,将注册失败信息"不要灰心,请再来"压栈
004021B6 > 56 PUSH ESI
004021B7 . 68 08194000 PUSH crack456.00401908
004021BC . FF15 44104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaPrintObj>] ; <====在主窗体上打印相关信息的函数调用
004021C2 . 83C4 0C ADD ESP, 0C ; <====返回在这里,注册码的比较一定在这上面
004021C5 . 895D FC MOV DWORD PTR SS:[EBP-4], EBX
004021C8 . 68 13224000 PUSH crack456.00402213
......
整个分析到这里就结束了,我们可以看到这个crackme只有一组正确的注册信息:
注册名:crackerlnn
注册码:1123
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年12月26日 20:37:00
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课