首页
社区
课程
招聘
关于HappyTown的第21个CrackMe分析
发表于: 2006-12-9 22:26 3697

关于HappyTown的第21个CrackMe分析

2006-12-9 22:26
3697
【文章标题】: 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期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
搞算法分析,我帮不了你多少,我没有搞过破解

虽然我强调自己探索,但是你最好把能在论坛收集到的密码算法,每种算法都自己对着分析文章跟一次,总结一些算法的特征。

对于你不知道的算法,也要会总结特征,并且以此为关键字,尝试在各破解论坛或者GOOGLE BAIDU等把算法搜索出来。这个是最重要的,并且是我希望完成这期练习之后,新人必须具备的能力。这样才算入门。

最后,我一直强调的探索精神,是成为高手的唯一方法。
2006-12-9 23:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵,还是多谢指点了
我明天再查查资料吧
2006-12-9 23:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
今天对Serial的转换规律进行分析。找到一些特征数据:
E1BF4FFE1FC86DEA   C0BB81E0E274080F   6527BEE996004DAA   773DD68308B27BCC  554BCD26ED21901F   C203993193AAE066   B1DCE0C710519AB8  B3491B704811E0EF   E487A93E7E130A1F   DE23F7EFF8F11212   0FBF5485E27D4826  F8FB31D4C28775AA
349694ADFA237D91
由经过第一步转换得到的32378965 48976345(按照我输入的Serial啊),按照移位、乘法、减法等等,每次取特征数据中的四位进行运算,得到的结果再往下按此重复……
这个特征数据没有查到是哪个算法的。如果自己计算下去的话也太复杂了
不知哪位兄台能否看看
2006-12-10 11:34
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
既然你已经放弃了。。那我就告诉你吧。。。

其实是我的疏忽,这个东西已经有人做出来了,还有注册机。

http://bbs.pediy.com/showthread.php?threadid=33207

另外那些连接,我已经再核实一次了,这次给出的应该都是没有分析过的了

算法总结,是总结代码特征,而不是数据表特征。看题目那个贴,你会看到,其实这个CRACKME已经难倒几个中级会员了。
2006-12-10 11:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
无语……
1、没有看到这个分析的链接,失败啊
2、没想到21这个数字这么猛,随便选一个都能中大奖


 
2006-12-10 12:18
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
7
也不算是中大奖吧。其实就是对各种密码学算法的熟悉程度问题了

就象第29个CRACKME:

先看完这个及其跟帖内容

http://bbs.pediy.com/showthread.php?s=&threadid=34166

然后看看

http://bbs.pediy.com/showthread.php?s=&threadid=34916

只要对密码学常用算法足够熟悉,对一些原创算法,有时也可以解决掉。
2006-12-10 12:44
0
游客
登录 | 注册 方可回帖
返回
//