我是菜鸟 今天无聊就下了个 crackme 玩玩 结果给我玩出点意思来了
不是很完整 不过可是我的处女作 哈哈 下面就介绍一些 我这个菜鸟是这么破解的吧 大侠不要见笑
有兴趣的朋友也可以玩玩
用OllyICE 载入 crackme
右键【查看】---所有参考文本字窜 就看到了这个
文本字串参考位于 crackme:.text
地址 反汇编 文本字串
00401067 push 00406034 ASCII "%lu"
004010D3 push 00406034 ASCII "%lu"
00401271 push 00406080 ASCII "GOOD JOB! - CRACKED!"
00401276 push 00406050 ASCII "Send your solution to : v0id2k1@hotmail.com "
0040128B push 00406038 ASCII "Enter Registration Info"
0040147E push ebp (初始 CPU 选择)
00402D26 push 00405454 ASCII "<program name unknown>"
00402D68 push 00405450 ASCII "..."
00402D7C push 00405434 ASCII "Runtime Error!",LF,LF,"Program: "
00402D9A push 00405430 ASCII LF,LF
00402DC2 push 00405408 ASCII "Microsoft Visual C++ Runtime Library"
0040461B push 004054AC ASCII "user32.dll"
00404632 push 004054A0 ASCII "MessageBoxA"
00404643 push 00405490 ASCII "GetActiveWindow"
0040464B push 0040547C ASCII "GetLastActivePopup"
在 GOOD JOB! - CRACKED! 这行双击 就来到了下面 在00401267 下断 这里跳的话就完了 输入 yeloone y-12365 为什么是y-12365 看下面就明白了 程序就停在了00401267
0040124D . 68 306A4000 push 00406A30
00401252 . 68 30694000 push 00406930
00401257 . E8 A4FDFFFF call 00401000
0040125C . 83C4 08 add esp, 8
0040125F . 83F8 01 cmp eax, 1
00401262 . A3 646C4000 mov dword ptr [406C64], eax
00401267 . 75 65 jnz short 004012CE --------这里把jnz 改成 jz 就可以爆破了
00401269 . 8B15 28694000 mov edx, dword ptr [406928]
0040126F . 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401271 . 68 80604000 push 00406080 ; |Title = "GOOD JOB! - CRACKED!"
00401276 . 68 50604000 push 00406050 ; |Text = "Send your solution to : v0id2k1@hotmail.com "
0040127B . 52 push edx ; |hOwner => NULL
0040127C . FF15 C4504000 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
00401282 . B8 01000000 mov eax, 1
爆破不是我的目的 想找出注册码 所以我就想到了00401267上面的call 00401257 重新下断点到 00401267 按f7 进入看看 我来到了 下面
00401000 /$ 53 push ebx
00401001 |. 8B5C24 0C mov ebx, dword ptr [esp+C]
00401005 |. 55 push ebp
00401006 |. 56 push esi
00401007 |. 8B7424 10 mov esi, dword ptr [esp+10]
0040100B |. 8A0B mov cl, byte ptr [ebx]
0040100D |. 33ED xor ebp, ebp
0040100F |. 57 push edi
00401010 |. 8A06 mov al, byte ptr [esi]
00401012 |. 3AC1 cmp al, cl----------------这里是比较注册名的第一个字和注册码的第一个字是不是一样
00401014 0F85 69010000 jnz 00401183-------不一样就跳
0040101A |. 8BFE mov edi, esi
0040101C |. 83C9 FF or ecx, FFFFFFFF
0040101F |. 33C0 xor eax, eax
00401021 |. F2:AE repne scas byte ptr es:[edi]
00401023 |. F7D1 not ecx
00401025 |. 49 dec ecx
00401026 |. 83F9 05 cmp ecx, 5---------比较注册名的长度
00401029 |. 0F82 54010000 jb 00401183------小于5个字就跳
0040102F |. 807B 01 2D cmp byte ptr [ebx+1], 2D-------比较注册名的第二个字是不是 -, 2D 的十进制是45, 在acsii码里45 是 -
00401033 0F85 4A010000 jnz 00401183 -----------不是就跳
00401039 |. 8BFE mov edi, esi
下面我就不分析了 因为有些地方看不懂
不过我找到了算法
一直到下面 00401141 这里有明码校对 注册码就找到了
0040113C |. 83E1 03 and ecx, 3
0040113F |. F3:A4 rep movs byte ptr es:[edi], byte ptr>
00401141 |. BE 446B4000 mov esi, 00406B44 ; ASCII "y-E25439-50115"
00401146 |> 8A10 /mov dl, byte ptr [eax]
00401148 |. 8A1E |mov bl, byte ptr [esi]
0040114A |. 8ACA |mov cl, dl
0040114C |. 3AD3 |cmp dl, bl
0040114E |. 75 25 |jnz short 00401175
00401150 |. 84C9 |test cl, cl
00401152 |. 74 16 |je short 0040116A
00401154 |. 8A50 01 |mov dl, byte ptr [eax+1]
注册名 yeloone
注册码 y-E25439-50115
算法
注册名 yeloone
注册码 把注册名的第一个字母 y 但作 第一个注册码的第一位
第一位 y
第二位 -
第三位 注册名的最后一位字母的大写 E
接下来 是把注册名 yeloone 用acsii码表示 y e l o o n e
121 101 108 111 111 110 101
然后相加 得到 763 再把 763 转换成 16进制 得到 2FB 再把2FB 加 6064 (6064 是一个16进制固定值)得到 635F 再把 635F 转换成 十进制 得到 25439
接下来 就是 - 后面就是再把 635F 加 6064 (16进制相加)得到 C3C3 转换成 十进制 得 50115
就这样子了 写的不好 或 有些地方错得话 请多多包含