首页
社区
课程
招聘
TDC.Crackme10算法分析
发表于: 2006-5-3 12:08 4902

TDC.Crackme10算法分析

2006-5-3 12:08
4902

【破文标题】crackme算法分析
【破解工具】OD PEID
【破解平台】winXp
【软件名称】TDC.Crackme10
【原版下载】http://www.crackmes.de/users/tdcnl
【保护方式】UPX
【软件简介】Difficulty: 2 - Needs a little brain (or luck)
            Platform: Windows
            Language: Assembler
【破解声明】菜鸟偶得一点心得,与大家分享
----------------------------------------------------------------------
1)PEID检查,UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
     简单的壳,轻松脱去。
2)OD载入脱壳后的程序,OD仍然提示程序可能被加壳,不管他,直接开始分析。
   用字符串查找很容易找到关键处。也可以在命令行下断点:BP GetDlgItemTextA
来到关键代码处
0040119B    6A 33           PUSH 33                                                ; 我选择在这里下断
0040119D    68 2C624000     PUSH up1.0040622C                     
004011A2    68 D1070000     PUSH 7D1
004011A7    FF75 08         PUSH DWORD PTR SS:[EBP+8]
004011AA    E8 AF010000     CALL <JMP.&user32.GetDlgItemTextA>    ; 取注册名位数
004011AF    6BC0 05         IMUL EAX,EAX,5                        ; EAX=EAX*5,即注册名位数乘以5
004011B2    3D FA000000     CMP EAX,0FA                           ; 相乘后的结果与0xFA相比较
004011B7    0F87 89000000   JA up1.00401246                       ; 大于就提示错误
004011BD    83F8 1E         CMP EAX,1E                            ; 计算结果大于0x1E吗?
004011C0    0F82 80000000   JB up1.00401246                       ; 小于就出现错误提示
004011C6    6A 00           PUSH 0                                ; 以上可以判断出注册名必须大于5位小于51位

在对注册名有效性检验完毕后,正式开始对注册信息的处理:
004011C8    6A 00           PUSH 0
004011CA    68 D2070000     PUSH 7D2
004011CF    FF75 08         PUSH DWORD PTR SS:[EBP+8]
004011D2    E8 81010000     CALL <JMP.&user32.GetDlgItemInt>      ; 将输入的注册码转换成对应的16进制数
004011D7    A3 5F624000     MOV DWORD PTR DS:[40625F],EAX         ; 将得到的16进制数储存
004011DC    68 2C624000     PUSH up1.0040622C                     
004011E1    E8 C2000000     CALL up1.004012A8                     ; 算法CALL,跟进
004011E6    803D 63624000 0>CMP BYTE PTR DS:[406263],1            ; 注册码正确吗?
004011ED    74 43           JE SHORT up1.00401232
004011EF    85C0            TEST EAX,EAX
004011F1    75 17           JNZ SHORT up1.0040120A                ; 不正确就跳向失败
004011F3    68 06614000     PUSH up1.00406106                     ; congratulations! you are now level 2! :-)

大致判断了注册流程后,跟进算法CALL
来到这里:
004012A8    55              PUSH EBP
004012A9    8BEC            MOV EBP,ESP
004012AB    803D B4124000 C>CMP BYTE PTR DS:[4012B4],0CC
004012B2    74 53           JE SHORT up1.00401307
004012B4    33C0            XOR EAX,EAX                           ; EAX清零
004012B6    33C9            XOR ECX,ECX                           ; ECX清零
004012B8    803D D4124000 C>CMP BYTE PTR DS:[4012D4],0CC
004012BF    74 46           JE SHORT up1.00401307
004012C1    33D2            XOR EDX,EDX                           ; EDX清零
004012C3    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]          ; 注册名放进EDX中
004012C6    8A02            MOV AL,BYTE PTR DS:[EDX]              ; 取注册名每一位的ASCII码
004012C8    84C0            TEST AL,AL                            ; 取完了吗?
004012CA    74 08           JE SHORT up1.004012D4                 ; 计算完毕就跳走
004012CC    03C8            ADD ECX,EAX                           ; 注册名每一位的ASCII码,与前一左移计算后的值累加
004012CE    C1C1 08         ROL ECX,8                             ; 将结果循环左移
004012D1    42              INC EDX                               ; 每计算一次EDX+1
004012D2  ^ EB F2           JMP SHORT up1.004012C6                ; 循环计算,结果设为A
循环左移计算,并将结果累加:
开始对累加结果做进一步处理
004012D4    83F1 02         XOR ECX,2                             ; 循环计算的结果与2做XOR运算,结果设为B
004012D7    83E9 50         SUB ECX,50                            ; XOR运算的结果B减去0x50,得到结果设为C
004012DA    81F1 37130000   XOR ECX,1337                          ; 所得的差C与1337做XOR运算,得到结果设为D
004012E0    56              PUSH ESI
004012E1    66:8B35 7961400>MOV SI,WORD PTR DS:[406179]           ; 取固定数字0x7D6(2006的16进制)
004012E8    66:03CE         ADD CX,SI                             ; 固定数字07D6与D加,得到最后结果转换成对应的10进制就是注册码
004012EB    803D FA124000 C>CMP BYTE PTR DS:[4012FA],0CC
004012F2    74 13           JE SHORT up1.00401307
004012F4    5E              POP ESI
004012F5    A1 5F624000     MOV EAX,DWORD PTR DS:[40625F]
004012FA    3BC1            CMP EAX,ECX                           ; 真假注册码比较
004012FC    75 04           JNZ SHORT up1.00401302                ; 不相等就跳向失败

算法到这里就结束了.

----------------------------------------------------------------------
算法总结:
1)注册名必须在5~51位之间
2)将注册名每一位做循环左移计算,并把结果累加。累加结果设为A
3)按步骤对累加结果进行处理:A XOR 2=B。B-0x50=C。C XOR 0x1337=D
4)取固定数字0x7D6(2006对应的16进制数),与D相加。即0x7D6+D.把所得的结果转换成对应的十进制数就是要输入的注册码。
------------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整性


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//