-
-
[原创]一个Delphi编程的CrackMe的算法分析
-
发表于:
2006-8-2 22:47
5957
-
[原创]一个Delphi编程的CrackMe的算法分析
【文章标题】: 一个Delphi编程的CrackMe的算法分析
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【软件名称】: dccrackme1
【软件大小】: 125KB
【保护方式】: name,serial
【编写语言】: Borland Delphi 4.0 - 5.0
【使用工具】: OD
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先,用peid查壳,无壳,用Borland Delphi 4.0 - 5.0编写,有出错提示,用OD载入,查找字符串,无收获,下消息断点WM_LBUTTONUP也没断下,用RUN跟踪好长时间也没找到关键地方,后经高人指点使用DeDe,终于找到关键地方了,在[00441C37]下断,输入
name:bxm
serial:780328051
00441C37 |. 8B45 F8 mov eax, [ebp-8] ; EAX中为name
00441C3A |. E8 491EFCFF call 00403A88 ; EAX中返回name的长度
00441C3F |. 8BD0 mov edx, eax ; EDX作为循环计数器
00441C41 |. 85D2 test edx, edx
00441C43 |. 7E 22 jle short 00441C67
00441C45 |. B9 01000000 mov ecx, 1
00441C4A |> 8B45 F8 /mov eax, [ebp-8] ; EAX中为name
00441C4D |. 8A4408 FF |mov al, [eax+ecx-1] ; 依次读取name的每个字符
00441C51 |. 25 FF000000 |and eax, 0FF ; 只留下低8位
00441C56 |. 8BD8 |mov ebx, eax ; EAX送EBX
00441C58 |. 83EB 17 |sub ebx, 17 ; EBX-17
00441C5B |. 83E8 11 |sub eax, 11 ; EAX-11
00441C5E |. 0FAFD8 |imul ebx, eax ; EBX=EBX*EAX
00441C61 |. 03F3 |add esi, ebx ; 累加于ESI
00441C63 |. 41 |inc ecx
00441C64 |. 4A |dec edx
00441C65 |.^ 75 E3 \jnz short 00441C4A ; name读完了没,没有继续读
00441C67 |> 8D55 F4 lea edx, [ebp-C]
00441C6A |. 8B45 FC mov eax, [ebp-4]
00441C6D |. 8B80 CC020000 mov eax, [eax+2CC]
00441C73 |. E8 4C16FEFF call 004232C4
00441C78 |. 8B45 F4 mov eax, [ebp-C] ; EAX中为假码
00441C7B |. 50 push eax
00441C7C |. 8D55 F0 lea edx, [ebp-10]
00441C7F |. 8BC6 mov eax, esi ; name运算后的值送EAX
00441C81 |. E8 325AFCFF call 004076B8 ; 把name运算后的值转换成十进制字符串,即为注册码
00441C86 |. 8B55 F0 mov edx, [ebp-10] ; 真码入EDX
00441C89 |. 58 pop eax ; 假码入EAX
00441C8A |. E8 091FFCFF call 00403B98 ; 比较真码与假码
00441C8F 75 0C jnz short 00441C9D ; 关键跳,只要EAX不为零,跳向出错
00441C91 |. A1 30584400 mov eax, [445830]
00441C96 |. E8 B9FBFFFF call 00441854 ; 正确对话框
算法比较简单,看上面分析就能看懂,下面附上注册机源码
#include<iostream.h>
#include <string.h>
void main()
{
char name[50];
int i;
long unsigned sum;
cout<<"Please input name:\n";
cin>>name;
sum=0;
for(i=0;i<strlen(name);i++)
{
sum+=((name[i]-0x17)*(name[i]-0x11));
}
cout<<endl<<"Code is "<<sum<<endl;
}
可用的一组注册码
name:bxm78
serial:26481
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月02日 下午 10:45:27
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)