首页
社区
课程
招聘
[原创]初试CrackMe的算法分析
发表于: 2013-5-26 20:26 7599

[原创]初试CrackMe的算法分析

2013-5-26 20:26
7599
00401111   > \B8 4F204000   mov     eax, 0040204F                    ;  ASCII "星晨缘"
00401116   .  E8 1D020000   call    00401338                         ;  取得用户名长度
0040111B   .  A3 A0214000   mov     dword ptr [4021A0], eax          ;  这里当然就是保存用户长度
00401120   .  BB 4F204000   mov     ebx, 0040204F                    ;  ASCII "星晨缘"
00401125   .  0FB613        movzx   edx, byte ptr [ebx]              ;  取用户名第一位
00401128   .  0FB64C03 FF   movzx   ecx, byte ptr [ebx+eax-1]        ;  取用户名最后一位
0040112D   .  0FAFD1        imul    edx, ecx                         ;  用户名第一位和最后一位相乘
00401130   .  50            push    eax
00401131   .  B9 02000000   mov     ecx, 2                           ;  这里的值用在下边做除数用的
00401136   .  52            push    edx
00401137   .  31D2          xor     edx, edx
00401139   .  F7F9          idiv    ecx                              ;  用户数除以2
0040113B   .  5A            pop     edx                              ;  idiv ece所得到的余数不要,用到前边相乖的值
0040113C   .  0FB60C03      movzx   ecx, byte ptr [ebx+eax]          ;  用户数长度/2
00401140   .  0FAFD1        imul    edx, ecx                         ;  用户长度/2,再*前边两个用户数相乘值
00401143   .  BB B8204000   mov     ebx, 004020B8                    ;  将保存注册码的地址给EBX
00401148   .  C703 484E542D mov     dword ptr [ebx], 2D544E48        ;  将HNT-保存到注册码中,第一段注册码生成(固定值)
0040114E   .  89D0          mov     eax, edx
00401150   .  83C3 04       add     ebx, 4                           ;  将指针指向HNT-后一位
00401153   .  E8 F7010000   call    0040134F                         ;  第二段注册码生成函数

mov     dword ptr [ebx], 2D544E48
0040134F  /$  51            push    ecx                              ;  保护现场
00401350  |.  56            push    esi
00401351  |.  4B            dec     ebx
00401352  |.  B9 04000000   mov     ecx, 4                           ;  下的边循环次数,4次
00401357  |.  BE 0A000000   mov     esi, 0A                          ;  固定的除数
0040135C  |.  52            push    edx
0040135D  |>  31D2          xor     edx, edx
0040135F  |.  F7FE          idiv    esi                              ;  EAX/A的值做为下一轮被除数
00401361  |.  80C2 30       add     dl, 30                           ;  EAX/A余数+30
00401364  |.  88140B        mov     byte ptr [ebx+ecx], dl
00401367  |.^ E2 F4         loopd   short 0040135D                   ;  ECX==1时停止循环
00401369  |.  5A            pop     edx
0040136A  |.  5E            pop     esi
0040136B  |.  59            pop     ecx
0040136C  \.  C3            retn
00401158   .  C705 00204000>mov     dword ptr [402000], 1E
00401162   .  68 00204000   push    00402000                         ; /pBufferSize = CrackMe.00402000
00401167   .  68 9A204000   push    0040209A                         ; |Buffer = CrackMe.0040209A
0040116C   .  E8 B34E0000   call    <jmp.&KERNEL32.GetComputerNameA> ; \GetComputerNameA
00401171   .  B8 9A204000   mov     eax, 0040209A                    ;  ASCII "DUKE-PC"
00401176   .  E8 F2010000   call    0040136D                         ;  把计算机名个个值相加
0040117B   .  BB 4F204000   mov     ebx, 0040204F                    ;  ASCII "星晨缘"
00401180   .  E8 00020000   call    00401385                         ;  将用户代入计算,用户*所在位数然后再累加
00401185   .  50            push    eax
00401186   .  31C0          xor     eax, eax
00401188   .  0FA2          cpuid                                    ;  取得CPU信息
0040118A   .  58            pop     eax
0040118B   .  51            push    ecx
0040118C   .  52            push    edx
0040118D   .  21D8          and     eax, ebx
0040118F   .  BB B8204000   mov     ebx, 004020B8                    ;  ASCII "HNT-0768"
00401194   .  89DF          mov     edi, ebx
00401196   .  50            push    eax
00401197   .  66:31C0       xor     ax, ax
0040119A   .  F2:AE         repne   scas byte ptr es:[edi]
0040119C   .  89FB          mov     ebx, edi
0040119E   .  58            pop     eax
0040119F   .  4B            dec     ebx
004011A0   .  C603 2D       mov     byte ptr [ebx], 2D               ;  前边所得注册码后加个"-"
004011A3   .  43            inc     ebx                              ;  指向最后个"-"
004011A4   .  E8 A6010000   call    0040134F                         ;  将前边计算的值代入计算,生成第三断注册码
00401385  /$  51            push    ecx
00401386  |.  52            push    edx
00401387  |.  89D8          mov     eax, ebx
00401389  |.  E8 AAFFFFFF   call    00401338                         ;  返回字符串位数
0040138E  |.  89C1          mov     ecx, eax
00401390  |.  4B            dec     ebx
00401391  |.  31D2          xor     edx, edx                         ;  清除EDX,后边做为累加器用
00401393  |>  8A140B        /mov     dl, byte ptr [ebx+ecx]          ;  从最后一位往前计算,不过用的是dl前边如有数据会保留下来的
00401396  |.  0FAFD1        |imul    edx, ecx                        ;  EDX*位数
00401399  |.  01D0          |add     eax, edx                        ;  累加到EAX
0040139B  |.  49            |dec     ecx                             ;  i--
0040139C  |.^ 75 F5         \jnz     short 00401393
0040139E  |.  5A            pop     edx
0040139F  |.  59            pop     ecx
004013A0  \.  C3            retn

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 340
活跃值: (51)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
自己坐坐沙发.......哈哈....
2013-5-26 20:27
0
雪    币: 340
活跃值: (51)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
CrackMe找到了,在CrackMe博物馆的第12页,168楼
2013-5-26 20:40
0
雪    币: 63
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
支持楼主的分享精神...
2013-5-26 23:04
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
5
支持楼主,老会员大牛。。
2013-5-27 09:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主厉害,辛苦了!
2013-5-27 16:36
0
游客
登录 | 注册 方可回帖
返回
//