【文章标题】: HappyTown的第21个CrackMe 分析
【文章作者】: 叶飘萍
【下载地址】:
【使用工具】: OD、MD5_force
【操作平台】: WinXP
【作者声明】: 主要是新兵训练场第三期第三题的分析。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
随便输入:
Name:dcqypp
Serial:3237896548976345
前面的就不多说了,静态分析一下,就能轻易找到如下代码处:
00401080 . 56 push esi
00401081 . E8 AA000000 call 00401130 此处是关键
00401086 . 83C4 04 add esp, 4
00401089 . 85C0 test eax, eax
0040108B . 5E pop esi
0040108C . 0F84 8D000000 je 0040111F
按F7进入00401130
0040120C |. FFD7 call edi ; \GetDlgItemTextA
0040120E |. 8BE8 mov ebp, eax
00401210 |. 3BEB cmp ebp, ebx 看Name是否大于等于4位
00401212 |. 7D 0D jge short 00401221
00401214 |> 5F pop edi
00401215 |. 5E pop esi
00401216 |. 5D pop ebp
00401217 |. 33C0 xor eax, eax 小于4位则返回0,退出此Call,就Over了
00401219 |. 5B pop ebx
0040121A |. 81C4 CC030000 add esp, 3CC
00401220 |. C3 retn
00401221 |> \8D4424 40 lea eax, dword ptr [esp+40]
00401225 |. 68 C9000000 push 0C9
0040122A |. 50 push eax
0040122B |. 68 E9030000 push 3E9
00401230 |. 56 push esi
00401231 |. FFD7 call edi
00401233 |. 83F8 10 cmp eax, 10 看Serial是否等于16位,不等就Over
00401236 |. 74 0D je short 00401245
……
00401316 |.^ 7C 81 \jl short 00401299
00401318 |. 8D9424 080100>lea edx, dword ptr [esp+108]
0040131F |. 52 push edx
00401320 |. E8 5B080000 call 00401B80 进入此处看看,可以看到这里就是MD5算法的四个变量的初始化
进入
00401B80 /$ 8B4424 04 mov eax, dword ptr [esp+4]
00401B84 |. 33C9 xor ecx, ecx
00401B86 |. C700 01234567 mov dword ptr [eax], 67452301 这里是MD5算法的四个初始化变量
00401B8C |. C740 04 89ABC>mov dword ptr [eax+4], EFCDAB89
00401B93 |. C740 08 FEDCB>mov dword ptr [eax+8], 98BADCFE
00401B9A |. C740 0C 76543>mov dword ptr [eax+C], 10325476
00401BA1 |. 8948 10 mov dword ptr [eax+10], ecx
00401BA4 |. 8948 14 mov dword ptr [eax+14], ecx
00401BA7 |. 8948 58 mov dword ptr [eax+58], ecx
00401BAA |. B8 01000000 mov eax, 1
00401BAF \. C3 retn
00401325 |. 8D8424 680100>lea eax, dword ptr [esp+168]
0040132C |. 55 push ebp
0040132D |. 8D8C24 100100>lea ecx, dword ptr [esp+110]
00401334 |. 50 push eax
00401335 |. 51 push ecx
00401336 |. E8 35040000 call 00401770
0040133B |. 8D9424 180100>lea edx, dword ptr [esp+118]
00401342 |. 8D4424 38 lea eax, dword ptr [esp+38]
00401346 |. 52 push edx
00401347 |. 50 push eax
00401348 |. E8 F3060000 call 00401A40 这个Call就是对姓名的MD5运算 保存在堆栈中
0012F6C4 C74B88DD
0012F6C8 BC560A68
0012F6CC 7BCAB33C
0012F6D0 1B96EE2E
……
00401385 |. 51 push ecx
00401386 |. E8 25000000 call 004013B0 这个Call就是对serial的运算 保存在堆栈中
进入
004013B0 /$ B8 08000000 mov eax, 8
004013B5 |. E8 461A0000 call 00402E00
004013BA |. 8B4424 0C mov eax, dword ptr [esp+C]
004013BE |. 33C9 xor ecx, ecx
004013C0 |. 33D2 xor edx, edx
004013C2 |. 8A08 mov cl, byte ptr [eax]
004013C4 |. 8A50 01 mov dl, byte ptr [eax+1]
004013C7 |. C1E1 18 shl ecx, 18
004013CA |. 40 inc eax
004013CB |. C1E2 10 shl edx, 10
004013CE |. 0BCA or ecx, edx
004013D0 |. 40 inc eax
004013D1 |. 33D2 xor edx, edx
004013D3 |. 8A30 mov dh, byte ptr [eax]
004013D5 |. 0BCA or ecx, edx
004013D7 |. 40 inc eax
004013D8 |. 33D2 xor edx, edx
004013DA |. 8A10 mov dl, byte ptr [eax]
004013DC |. 0BCA or ecx, edx
004013DE |. 40 inc eax
004013DF |. 894C24 00 mov dword ptr [esp], ecx
004013E3 |. 33C9 xor ecx, ecx
004013E5 |. 8A08 mov cl, byte ptr [eax]
004013E7 |. 33D2 xor edx, edx
004013E9 |. 8A50 01 mov dl, byte ptr [eax+1]
004013EC |. C1E1 18 shl ecx, 18
004013EF |. 40 inc eax
004013F0 |. C1E2 10 shl edx, 10
004013F3 |. 0BCA or ecx, edx
004013F5 |. 40 inc eax
004013F6 |. 33D2 xor edx, edx
004013F8 |. 8A30 mov dh, byte ptr [eax]
004013FA |. 8A50 01 mov dl, byte ptr [eax+1]
004013FD |. 8B4424 14 mov eax, dword ptr [esp+14]
00401401 |. 0BD1 or edx, ecx
00401403 |. 8D4C24 00 lea ecx, dword ptr [esp]
00401407 |. 50 push eax
00401408 |. 51 push ecx
00401409 |. 895424 0C mov dword ptr [esp+C], edx
此部分先3237896548976345变为33 32 33 37 38 39 36 35 34 38 39 37 36 33 34 35,取两个数的后位组合为32 37 89 65 48 97 63 45
0040140D |. E8 8E0E0000 call 004022A0 此Call再将32 37 89 65 48 97 63 45进行变换(这个地方比较复杂,我没有找到规律,我猜可能也是某个密码算法吧)
后面将它归入堆栈
0012F6D4 B8655B2B
0012F6D8 2DF7D770
……
0040138B |. 83C4 34 add esp, 34
0040138E |. B9 02000000 mov ecx, 2
00401393 |. 8D7C24 28 lea edi, dword ptr [esp+28]
00401397 |. 8D7424 38 lea esi, dword ptr [esp+38]
0040139B |. 33D2 xor edx, edx
0040139D |. F3:A7 repe cmps dword ptr es:[edi], dword p> 在此将运算出的两个数据的前16位进行比较,随后根据结果在eax置1或0
0040139F |. 5F pop edi
004013A0 |. 8BC2 mov eax, edx
004013A2 |. 5E pop esi
004013A3 |. 5D pop ebp
004013A4 |. 0F94C0 sete al
004013A7 |. 5B pop ebx
004013A8 |. 81C4 CC030000 add esp, 3CC
004013AE \. C3 retn
……
--------------------------------------------------------------------------------
【经验总结】
这个分析是做新兵训练第三期第三题,我一看,HappyTown的第21个CrackMe,嗯,比较喜欢21这个数字,好,管它三七二十一,就分析它了。经过几个小时的分析,基本上流程比较明确了。主要就是将大于等于4位的Name进行MD5算法,取前16位与16位的Serial进行的算法结果进行比较。
在这里,列出的是一些比较重要的点,没有把每个指令具体列出。我想,应该是太简单了,列得太详细,让列位高手们也看着头晕啊
目前就是最后的那个Serial算法的第二个转换规律没有总结出来。因此,也就不能逆向,得出正确的Serial,写不出注册机。本想继续解决掉再发帖的,但一想,可能真要解决,还需要一个晚上吧,要是哪位兄弟也看这个21比较顺眼,随手就给解了,那我就要哭了
所以还是先发帖吧。自己再慢慢解决吧……
真是有点遗憾哪
本人的第一个Crackme分析帖,自己庆祝一下
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年12月09日 22:21:07
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)