【软件名称】: 个人日程助手1.0
【软件介绍】: 国产软件 / 共享版 / 信息管理 / 简体中文 / 1184 KB
【软件下载】:http://www2.skycn.com/soft/5282.html
【保护方式】:注册码 + 功能限制
【破解工具】:Win2003, PEiD, Ollydbg,,
【破解目的】:研究算法分析
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【破解过程】:
侦测:用PEiD查壳 Borland Delphi 6.0 - 7.0 哇没有壳啊,现在没有壳的软件可是真少啊。
先运行软件,点“注册”输入注册码,点确定,提示“注册码不正确,请注册申请注册码”
废话少说。。OllyDbg 载入软件, 查找ASCLL字符串,找到“注册码不正确,请注册申请注册码”
双击来到下面:
0047AD7B . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0047AD7E . 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
0047AD81 . E8 1EC9FFFF CALL Assistan.004776A4 ;计算机器码,这我们不用管它
0047AD86 . 8B45 EC MOV EAX, DWORD PTR SS:[EBP-14]
0047AD89 . 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
0047AD8C . E8 5FD1F8FF CALL Assistan.00407EF0 ;关键CALL,计算注册码
0047AD91 . 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
0047AD94 . 58 POP EAX
0047AD95 . E8 9E96F8FF CALL Assistan.00404438 ;比较注册码
0047AD9A . 0F85 8B000000 JNZ Assistan.0047AE2B ;关键跳转,爆破改为JZ就行了
0047ADA0 . B2 01 MOV DL,1
0047ADA2 . A1 98E44200 MOV EAX,DWORD PTR DS:[42E498]
0047ADA7 . E8 EC37FBFF CALL Assistan.0042E598
0047ADAC . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0047ADAF . 33C0 XOR EAX,EAX
0047ADB1 . 55 PUSH EBP
0047ADB2 . 68 24AE4700 PUSH Assistan.0047AE24
0047ADB7 . 64:FF30 PUSH DWORD PTR FS:[EAX]
0047ADBA . 64:8920 MOV DWORD PTR FS:[EAX],ESP
0047ADBD . BA 02000080 MOV EDX,80000002
0047ADC2 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0047ADC5 . E8 6E38FBFF CALL Assistan.0042E638
0047ADCA . 33C9 XOR ECX,ECX
0047ADCC . BA 74AE4700 MOV EDX,Assistan.0047AE74 ;Software\MyAssistant\Option
0047ADD1 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0047ADD4 . E8 C738FBFF CALL Assistan.0042E6A0
0047ADD9 . 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
0047ADDC . E8 8BC9FFFF CALL Assistan.0047776C
0047ADE1 . 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
0047ADE4 . 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
0047ADE7 . E8 B8C8FFFF CALL Assistan.004776A4
0047ADEC . 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
0047ADEF . BA 98AE4700 MOV EDX,Assistan.0047AE98 ;RegistryCode"注册码写入注册表
0047ADF4 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0047ADF7 . E8 403CFBFF CALL Assistan.0042EA3C
0047ADFC . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0047ADFF . E8 0438FBFF CALL Assistan.0042E608
0047AE04 . B8 B0AE4700 MOV EAX,Assistan.0047AEB0 ;弹出对话框注册成功
0047AE09 . E8 52E2FAFF CALL Assistan.00429060
0047AE0E . 33C0 XOR EAX,EAX
0047AE10 . 5A POP EDX
0047AE11 . 59 POP ECX
0047AE12 . 59 POP ECX
0047AE13 . 64:8910 MOV DWORD PTR FS:[EAX],EDX
0047AE16 . 68 35AE4700 PUSH Assistan.0047AE35
0047AE1B > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0047AE1E . E8 B984F8FF CALL Assistan.004032DC
0047AE23 . C3 RETN
0047AE24 .^ E9 078CF8FF JMP Assistan.00403A30
0047AE29 .^ EB F0 JMP SHORT Assistan.0047AE1B
0047AE2B > B8 C4AE4700 MOV EAX,Assistan.0047AEC4 ;注册码不正确,请注册申请注册码!跳到这就失败了!
0047AE30 . E8 2BE2FAFF CALL Assistan.00429060
0047AE35 . 33C0 XOR EAX,EAX
==============我们进入关键CALL看看===================
004776CC |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 取出机器码
004776CF |. E8 18CCF8FF CALL Assistan.004042EC ; 计算的机器码长度
004776D4 |. 8BD0 MOV EDX,EAX ; 压入机器码长度
004776D6 |. 85D2 TEST EDX,EDX
004776D8 |. 76 1C JBE SHORT Assistan.004776F6
004776DA |. B8 01000000 MOV EAX,1
004776DF |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4] ; 第一次循环入口
004776E2 |. 0FB64C01 FF |MOVZX ECX,BYTE PTR DS:[ECX+EAX-1] ; 从左到右取机器码ASCLL码
004776E7 |. 03D9 |ADD EBX,ECX ; 将机器码ASCLL值加上刚才循环计算的值
004776E9 |. 8BCB |MOV ECX,EBX
004776EB |. 03C9 |ADD ECX,ECX
004776ED |. 8D0C89 |LEA ECX,DWORD PTR DS:[ECX+ECX*4]
004776F0 |. 8BD9 |MOV EBX,ECX ; 上面四行把机器码ASC乘十
004776F2 |. 40 |INC EAX
004776F3 |. 4A |DEC EDX ; 这的值等于机器码长度每循环一次就减一
004776F4 |.^ 75 E9 \JNZ SHORT Assistan.004776DF ; 如果EDX大于0就继续循环
; 上面的循环就是把机器码左到右的ASCLL码乘以10并相加
004776F6 |> 8BC3 MOV EAX,EBX ; 压入计算后的值我们设置为Z
004776F8 |. 33D2 XOR EDX,EDX
004776FA |. 52 PUSH EDX ; /Arg2 => 00000000
004776FB |. 50 PUSH EAX ; |Arg1
004776FC |. 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] ; |EAX
004776FF |. E8 D809F9FF CALL Assistan.004080DC ; \Assistan.004080DC
00477704 |. 33DB XOR EBX,EBX
00477706 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00477709 |. E8 DECBF8FF CALL Assistan.004042EC ; 计算Z的长度
0047770E |. 83F8 01 CMP EAX,1 ; 比较Z的长度
00477711 |. 72 18 JB SHORT Assistan.0047772B ; 大于1就直进入循环
00477713 |> 8B55 F8 /MOV EDX,DWORD PTR SS:[EBP-8] ; 第二次循环入口
00477716 |. 0FB65402 FF |MOVZX EDX,BYTE PTR DS:[EDX+EAX-1] ; 从右到左取Z ASCLL码
0047771B |. 03DA |ADD EBX,EDX ; 将机器码ASCLL值加上刚才循环计算的值
0047771D |. 8BD3 |MOV EDX,EBX
0047771F |. 03D2 |ADD EDX,EDX
00477721 |. 8D1492 |LEA EDX,DWORD PTR DS:[EDX+EDX*4]
00477724 |. 8BDA |MOV EBX,EDX ; 上面四行把Z的ASCLL乘十
00477726 |. 48 |DEC EAX ; 这的值等于机器码长度每循环一次就减一
00477727 |. 85C0 |TEST EAX,EAX
00477729 |.^ 75 E8 \JNZ SHORT Assistan.00477713 ; 如果EAX大于0就继续循环
; 上面的循环就是把机器码左到右的ASCLL码乘以10并相加
0047772B |> 8BC3 MOV EAX,EBX ; 压入计算后的值(些值为十六进制)
0047772D |. 33D2 XOR EDX,EDX
0047772F |. 52 PUSH EDX ; /Arg2 => 00000000
00477730 |. 50 PUSH EAX ; |Arg1
00477731 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] ; |
00477734 |. E8 A309F9FF CALL Assistan.004080DC ; \Assistan.004080DC
00477739 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
0047773C |. 8BD6 MOV EDX,ESI
0047773E |. E8 AD07F9FF CALL Assistan.00407EF0 ; 把十六进制转不十进制既真正的注册码
00477743 |. 33C0 XOR EAX,EAX ; 压入真注册码
00477745 |. 5A POP EDX
00477746 |. 59 POP ECX
00477747 |. 59 POP ECX
【破解总结】:
些软件通过一定算法的到一个机器码,这个机器码的算法就不用研究了,注册码通过机器码进行二次运算的到,
第一次把机器码的ASCLL的值从左到右进行取出乘以十并相加。的出一个值,然后进行第二次计算把刚才算出来的值的ASCLL
的值从右到左取出乘以十并相加,些时计算出来的值为十六进制,最后把管个十六进制转会十进制就是我们想要的注册码了 【注册机制作】:
现在我们可以来制作注册机了,呵呵,我只会用Delphi哟!好了开始开工了。
先来写三个函数吧!
第一个函数模仿第一次计算
function strtointex(s:String):integer;
var i,n:integer;
begin
n:=0;
if length(s)-1>0 then
for i:=1 to length(s) do
n:=(n+ord(s[i]))*10;
result:=n;
end;
第二个函数模仿第二次计算
function strtointex0(s:String):string;
var i:integer;
n:int64;
x:string;
begin
n:=0;
result:='';
if length(s)>0 then
begin
for i:=length(s) downto 1 do
n:=(n+ord(s[i]))*10;
x:=inttohex(n,16);
result:=copy(x,length(x)-7,8);
end;
end;
第三个函数就是把十六进步转为十进制,不知道为什么Delphi中没有内置还个函数,还是不知道!管他了,我们写一个!
function HexTostr(Hex: String): string;
var
I:integer; Res: int64;
ch: Char;
begin
Res := 0;
if Length(Hex)>0 then
for I := 0 to Length(Hex) - 1 do
begin
ch := Hex[I + 1];
if (ch >= '0') and (ch <= '9') then
Res := Res * 16 + Ord(ch) - Ord('0')
else if (ch >= 'A') and (ch <= 'F') then
Res := Res * 16 + Ord(ch) - Ord('A') + 10
else if (ch >= 'a') and (ch <= 'f') then
Res := Res * 16 + Ord(ch) - Ord('a') + 10
else raise Exception.Create('Error: not a Hex String');
end;
Result := inttostr(Res);
end;
好了注册机主要部分我们做好了`~在程序上放两个Edit…(edit1和edit2)在edit1的OnKeyUp事件中加上
Edit2.text:=HexTostr(strtointex0(inttostr(strtointex(edit1.text))));
好了注册机搞定,呵呵。。。。。。。。函数写的有什么不好的地方希望高手提出,我的QQ:9674103希望大家一起交流。我是个菜鸟~~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!