【破解工具】OD,计算器
【破解平台】WINXP
【软件简介】Difficulty: 2 - Needs a little brain (or luck)
Platform: Windows
Language: Assembler
----------------------------------------------------------------------
CRACKME很有意思,第一次见如此注册方式的CRACKME.分析一下,
根据提示信息很容易找到关键代码。
00401288 /$ 55 push ebp ; 在这里下断点
00401289 |. 8BEC mov ebp, esp
0040128B |. 81C4 FCFEFFFF add esp, -104
00401291 |. C785 FCFEFFFF>mov dword ptr [ebp-104>
0040129B |. 68 80000000 push 80 ; /Count = 80 (128.)
004012A0 |. 8D45 80 lea eax, [ebp-80] ; |
004012A3 |. 50 push eax ; |Buffer
004012A4 |. 68 ED030000 push 3ED ; |ControlID = 3ED (1005.)
004012A9 |. FF35 0C304000 push dword ptr [40300C] ; |hWnd = 00190644 (b2c_2k5,class=DLGCLASS)
004012AF |. E8 3A010000 call <jmp.&user32.GetDl>; GetDlgItemTextA
004012B4 |. 83F8 05 cmp eax, 5 ; 注册名位数与5比较
004012B7 |. 0F82 C7000000 jb 00401384 ; 小于5位就跳向失败
004012BD |. 68 80000000 push 80 ; /Count = 80 (128.)
004012C2 |. 8D85 00FFFFFF lea eax, [ebp-100] ; |
004012C8 |. 50 push eax ; |Buffer
004012C9 |. 68 EE030000 push 3EE ; |ControlID = 3EE (1006.)
004012CE |. FF35 0C304000 push dword ptr [40300C] ; |hWnd = 00190644 (b2c_2k5,class=DLGCLASS)
004012D4 |. E8 15010000 call <jmp.&user32.GetDl>; GetDlgItemTextA
004012D9 |. 83F8 08 cmp eax, 8 ; 注册码位数与8比较
004012DC |. 0F85 A2000000 jnz 00401384 ; 注册码不等于8位就跳向失败
从这里可以得知:
注册名必须大于5位
注册码必须等于8位
004012E2 |. 8D95 00FFFFFF lea edx, [ebp-100] ; 使EDX等于输入的注册码
004012E8 |. 52 push edx
004012E9 |. E8 82010000 call 00401470 ; 将输入的注册码转换成对应的大写
004012EE |. 50 push eax
004012EF |. E8 92000000 call 00401386
004012F4 |. 83F8 00 cmp eax, 0 ; 输入注册码了吗?
004012F7 |. 0F84 87000000 je 00401384 ; 没有输入注册码就跳向失败
004012FD |. 33D2 xor edx, edx ; EDX清零,准备开始计算
004012FF |. 35 33644752 xor eax, 52476433 ; XOR (输入的注册码,0x52476433),结果设为A
00401304 |. 35 56244752 xor eax, 52472456 ; XOR (A,0x52472456),结果设为B
00401309 |. 2D 00000004 sub eax, 4000000 ; B减去0x4000000结果设为C
这是对注册码的处理,先将注册码中小写的部分转换成对应的大写形式。
设输入的注册码为;CODE
则对注册码的处理过程为:XOR [XOR(CODE,0x52476433),0x52472456],
作者:逍遥风
因为XOR(0x52476433,0x52472456)=0x4065
所以:对注册码处理的过程就相当与 XOR (CODE,0x4065)结果设为B
C=B-0x4000000
0040130E |. BB 01000000 mov ebx, 1 ; 使EBX等于1
00401313 |. C1C3 10 rol ebx, 10 ; ROL (EBX,10)
00401316 |. 8D75 80 lea esi, [ebp-80] ; 使ESI等于注册名
00401319 |> 803E 00 /cmp byte ptr [esi], 0
0040131C |. 74 0D |je short 0040132B
0040131E |. 0FB616 |movzx edx, byte ptr [esi] ; 取注册名每一位的ASCII码
00401321 |. C1C2 10 |rol edx, 10 ; ROL (注册名ASCII,10)
00401324 |. 03C2 |add eax, edx ; C与注册名ASCII码累加计算
00401326 |. 2BC3 |sub eax, ebx ; 每一次计算的结果减去定值0x10000
00401328 |. 46 |inc esi ; 每计算一次ESI加1
00401329 |.^ EB EE jmp short 00401319 ; 循环计算
0040132B |&