-
-
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直播授课
赞赏
- 关于软件开发完成的定义 7845
- [求助]软件反向工程的定义 5795
- 大家帮忙看看关于软件逆向工程的这个定义是否准确 6411
- [求助]大家帮忙看看关于软件逆向工程的这个定义是否准确 5687