首页
社区
课程
招聘
[原创]lnn1123的crack456的破解
发表于: 2006-12-26 20:38 10320

[原创]lnn1123的crack456的破解

2006-12-26 20:38
10320

【文章标题】: 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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
2
倒,记得他发给我的时候,我还不知道咋回事呢?
没想到这里看到教程!!!

顶楼主,牛啊!!!
2006-12-26 22:30
0
雪    币: 318
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害啊楼主,佩服佩服!!
2007-2-18 11:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
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

请问大侠..这里的=1123 是怎样算出来的,请据体说明一下吧..谢谢!
2007-2-23 05:46
0
雪    币: 215
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
看过学习一下,
2007-2-23 17:22
0
雪    币: 297
活跃值: (21)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
6
最初由 xinjing 发布
请问大侠..这里的=1123 是怎样算出来的,请据体说明一下吧..谢谢!

十六进制数463转为十进制数就是1123啊
2007-2-25 19:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请问一下  这里的crackerlnn 是怎么算出来的   不好意思啊  
麻烦了
2007-5-1 23:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问一下  这里的crackerlnn 是怎么算出来的   不好意思啊  
麻烦了
2007-5-2 00:10
0
雪    币: 212
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
其实这里用万能断点也可以断下来的。不过楼主可真是牛哦!分析的这么透彻。
2007-9-11 17:22
0
雪    币: 125
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
不错,很好的学习资料啊
2007-9-16 02:46
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
有两个地方看不懂,请问下
1.为什么正确的注册码是放在[ebp-8c],但是后面与输入注册码比较的却是[ebp-94]
2.为什么注册名比较的结果逻辑值A进栈后的地址,和后面与逻辑值B比较时的地址不一样
2009-6-25 12:40
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
问下:
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

楼主怎么判断出来这句的立即数是注册码?能具体分析下么?
0040216C   .  66:C785 74FFF>MOV     WORD PTR SS:[EBP-8C], 463
2009-7-17 11:53
0
游客
登录 | 注册 方可回帖
返回
//