【文章标题】: 日程助手(金猪版)算法分析和Delphi注册机编写
【文章作者】: 海浪轻风(黄仁来)
【作者邮箱】: futuring@126.com
【作者主页】: http://hi.baidu.com/beyond0769
【软件名称】: 日程助手(金猪版)
【软件大小】: 939 KB
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Delphi6/7
【使用工具】: PEid, OllyDbg
【操作平台】: WinXP
【软件介绍】: 日程助手金猪版是一款帮助个人进行日程管理和提醒的
【作者声明】: 刚学破解,非一般的菜,第一次写注册机,只是感兴趣,没有其他目的。感谢fwycfpg的指点。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
PEid查无壳,用Delphi编写。马上出现注册验证。随便输入一组试炼码后点“注册”出现错误提示
“注册码不正确,请注册申请注册码!”迅速用OD载入运行,查找该ASCII字符串,定位到算法过程如下:
004DD8BE . 55 PUSH EBP
004DD8BF . 68 D4D94D00 PUSH MyAssist.004DD9D4
004DD8C4 . 64:FF30 PUSH DWORD PTR FS:[EAX]
004DD8C7 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
004DD8CA . 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
004DD8CD . 8B83 0C030000 MOV EAX,DWORD PTR DS:[EBX+30C]
004DD8D3 . E8 C429F7FF CALL MyAssist.0045029C
004DD8D8 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
004DD8DB . 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
004DD8DE . E8 31B1F2FF CALL MyAssist.00408A14
004DD8E3 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004DD8E6 . 50 PUSH EAX
004DD8E7 . 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
004DD8EA . E8 CD16FFFF CALL MyAssist.004CEFBC
004DD8EF . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18] ; 读取机器码
004DD8F2 . 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
004DD8F5 . E8 EA15FFFF CALL MyAssist.004CEEE4 ; 关键算法CALL F7进入
004DD8FA . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
004DD8FD . 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
004DD900 . E8 0FB1F2FF CALL MyAssist.00408A14
004DD905 . 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
004DD908 . 58 POP EAX
004DD909 . E8 8E6DF2FF CALL MyAssist.0040469C
004DD90E . 0F85 8B000000 JNZ MyAssist.004DD99F ; 爆破点,不能跳
004DD914 . B2 01 MOV DL,1
004DD916 . A1 DC964300 MOV EAX,DWORD PTR DS:[4396DC]
004DD91B . E8 BCBEF5FF CALL MyAssist.004397DC
004DD920 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004DD923 . 33C0 XOR EAX,EAX
004DD925 . 55 PUSH EBP
004DD926 . 68 98D94D00 PUSH MyAssist.004DD998
004DD92B . 64:FF30 PUSH DWORD PTR FS:[EAX]
004DD92E . 64:8920 MOV DWORD PTR FS:[EAX],ESP
004DD931 . BA 02000080 MOV EDX,80000002
004DD936 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DD939 . E8 3EBFF5FF CALL MyAssist.0043987C
004DD93E . 33C9 XOR ECX,ECX
004DD940 . BA E8D94D00 MOV EDX,MyAssist.004DD9E8 ; software\jzassistant\option
004DD945 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DD948 . E8 93BFF5FF CALL MyAssist.004398E0
004DD94D . 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
004DD950 . E8 6716FFFF CALL MyAssist.004CEFBC
004DD955 . 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
004DD958 . 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
004DD95B . E8 8415FFFF CALL MyAssist.004CEEE4
004DD960 . 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
004DD963 . BA 0CDA4D00 MOV EDX,MyAssist.004DDA0C ; registrycode
004DD968 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DD96B . E8 2CC1F5FF CALL MyAssist.00439A9C
004DD970 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DD973 . E8 D4BEF5FF CALL MyAssist.0043984C
004DD978 . B8 24DA4D00 MOV EAX,MyAssist.004DDA24 ; 注册成功!
004DD97D . E8 6A63F5FF CALL MyAssist.00433CEC
004DD982 . 33C0 XOR EAX,EAX
004DD984 . 5A POP EDX
004DD985 . 59 POP ECX
004DD986 . 59 POP ECX
004DD987 . 64:8910 MOV DWORD PTR FS:[EAX],EDX
004DD98A . 68 A9D94D00 PUSH MyAssist.004DD9A9
004DD98F > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004DD992 . E8 C95AF2FF CALL MyAssist.00403460
004DD997 . C3 RETN
004DD998 .^ E9 1762F2FF JMP MyAssist.00403BB4
004DD99D .^ EB F0 JMP SHORT MyAssist.004DD98F
004DD99F > B8 38DA4D00 MOV EAX,MyAssist.004DDA38 ; 注册码不正确,请注册申请注册码!
004DD9A4 . E8 4363F5FF CALL MyAssist.00433CEC
004DD9A9 . 33C0 XOR EAX,EAX
004DD9AB . 5A POP EDX
004DD9AC . 59 POP ECX
004DD9AD . 59 POP ECX
004DD9AE . 64:8910 MOV DWORD PTR FS:[EAX],EDX
004DD9B1 . 68 DBD94D00 PUSH MyAssist.004DD9DB
004DD9B6 > 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
004DD9B9 . BA 05000000 MOV EDX,5
004DD9BE . E8 F168F2FF CALL MyAssist.004042B4
004DD9C3 . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004DD9C6 . E8 C568F2FF CALL MyAssist.00404290
004DD9CB . 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
004DD9CE . E8 BD68F2FF CALL MyAssist.00404290
004DD9D3 . C3 RETN
004DD9D4 .^ E9 DB61F2FF JMP MyAssist.00403BB4
004DD9D9 .^ EB DB JMP SHORT MyAssist.004DD9B6
004DD9DB . 5B POP EBX
004DD9DC . 8BE5 MOV ESP,EBP
004DD9DE . 5D POP EBP
004DD9DF . C3 RETN
_______________________________________
进入关键算法 CALL MyAssist.004CEEE4 :
004CEEE4 /$ 55 PUSH EBP
004CEEE5 |. 8BEC MOV EBP,ESP
004CEEE7 |. 83C4 F0 ADD ESP,-10
004CEEEA |. 53 PUSH EBX
004CEEEB |. 56 PUSH ESI
004CEEEC |. 33C9 XOR ECX,ECX
004CEEEE |. 894D F0 MOV DWORD PTR SS:[EBP-10],ECX
004CEEF1 |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
004CEEF4 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
004CEEF7 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004CEEFA |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004CEEFD |. E8 3E58F3FF CALL MyAssist.00404740
004CEF02 |. 33C0 XOR EAX,EAX
004CEF04 |. 55 PUSH EBP
004CEF05 |. 68 ADEF4C00 PUSH MyAssist.004CEFAD
004CEF0A |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004CEF0D |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004CEF10 |. 33DB XOR EBX,EBX
004CEF12 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 出现机器码,记为 MCode
004CEF15 |. E8 3656F3FF CALL MyAssist.00404550 ; 返回机器码长度 Length(MCode)
004CEF1A |. 8BD0 MOV EDX,EAX
004CEF1C |. 85D2 TEST EDX,EDX
004CEF1E |. 76 18 JBE SHORT MyAssist.004CEF38 ; 不能小于等于0
004CEF20 |. B8 01000000 MOV EAX,1
004CEF25 |> 8B4D FC /MOV ECX,DWORD PTR SS:[EBP-4] ; for i:=1 to Length(MCode)
004CEF28 |. 0FB64C01 FF |MOVZX ECX,BYTE PTR DS:[ECX+EAX-1] ; ECX:= ord(MCode[i])
004CEF2D |. 03D9 |ADD EBX,ECX ; 累加MCode每位ASCII值
004CEF2F |. 8D0CDB |LEA ECX,DWORD PTR DS:[EBX+EBX*8] ; 再乘以9
004CEF32 |. 8BD9 |MOV EBX,ECX
004CEF34 |. 40 |INC EAX
004CEF35 |. 4A |DEC EDX
004CEF36 |.^ 75 ED \JNZ SHORT MyAssist.004CEF25 ; 如果不等于Length(MCode)则继续循环
004CEF38 |> 8BC3 MOV EAX,EBX ; 计算结果,记为Code1
004CEF3A |. 33D2 XOR EDX,EDX
004CEF3C |. 52 PUSH EDX ; /Arg2 => 00000000
004CEF3D |. 50 PUSH EAX ; |Arg1
004CEF3E |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] ; |
004CEF41 |. E8 229FF3FF CALL MyAssist.00408E68 ; \MyAssist.00408E68
004CEF46 |. 8BF3 MOV ESI,EBX ; 取Code1的十进制无符号值,inttostr(Code1);
004CEF48 |. 33DB XOR EBX,EBX
004CEF4A |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
004CEF4D |. E8 FE55F3FF CALL MyAssist.00404550 ; 返回Code1的长度
004CEF52 |. 83F8 01 CMP EAX,1 ; 必须大于等于1
004CEF55 |. 72 14 JB SHORT MyAssist.004CEF6B
004CEF57 |> 8B55 F4 /MOV EDX,DWORD PTR SS:[EBP-C] ; for i:=Length(Code1) downto 1 do
004CEF5A |. 0FB65402 FF |MOVZX EDX,BYTE PTR DS:[EDX+EAX-1] ; Code1[i]; //倒过来取每位ASCII
004CEF5F |. 03DA |ADD EBX,EDX ; 累加
004CEF61 |. 8D14DB |LEA EDX,DWORD PTR DS:[EBX+EBX*8] ; 乘以9
004CEF64 |. 8BDA |MOV EBX,EDX
004CEF66 |. 48 |DEC EAX
004CEF67 |. 85C0 |TEST EAX,EAX
004CEF69 |.^ 75 EC \JNZ SHORT MyAssist.004CEF57 ; 计算结果入EBX,记为Code2
004CEF6B |> 03F3 ADD ESI,EBX ; Cold1+Cold2 (十六进制)
004CEF6D |. D1EE SHR ESI,1 ; ESI:=ESI SHR 1
004CEF6F |. 8BDE MOV EBX,ESI
004CEF71 |. 8BC3 MOV EAX,EBX ; 计算结果入EAX,
004CEF73 |. 33D2 XOR EDX,EDX
004CEF75 |. 52 PUSH EDX ; /Arg2 => 00000000
004CEF76 |. 50 PUSH EAX ; |Arg1
004CEF77 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] ; |
004CEF7A |. E8 E99EF3FF CALL MyAssist.00408E68 ; \MyAssist.00408E68
004CEF7F |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; EAX转换为十进制的字符串值为真正注册码
004CEF82 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
004CEF85 |. E8 8A9AF3FF CALL MyAssist.00408A14
004CEF8A |. 33C0 XOR EAX,EAX
004CEF8C |. 5A POP EDX
004CEF8D |. 59 POP ECX
004CEF8E |. 59 POP ECX
004CEF8F |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
004CEF92 |. 68 B4EF4C00 PUSH MyAssist.004CEFB4
004CEF97 |> 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
004CEF9A |. BA 02000000 MOV EDX,2
004CEF9F |. E8 1053F3FF CALL MyAssist.004042B4
004CEFA4 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
004CEFA7 |. E8 E452F3FF CALL MyAssist.00404290
004CEFAC \. C3 RETN
〖算法总结〗
程序利用生成的机器码进行下列计算:
1、从左到右取每位机器码ASCII值,乘以9,再累加起来得出 Code1;
2、取Code1的十进制无符号值转为字符串,即inttstor(Code1);
3、再把inttstor(Code1)从右到左取ASCII码乘以9累加起来得出 Code2;
4、(Code1 + Code 2) shr 1
5、把计算结果的十进制无符号值转为字符串即真正注册码.
〖算法注册机〗
本人只会Delphi,只能用它来写啦~~~
function GetKey(MCode:string): string;
var
a,b:longWord; //定义为LongWord类型非常重要
i:integer;
Code1,Code2: string;
begin
a:=0; b:=0;
Code1:=MCode; //取机器码;
for i:=1 to Length(Code1) do a:=(a+ord(Code1[i]))*9; //循环取机器码ASCII值*9 之和
Code1:=inttostr(a); //此时返回值为十进制的“无符号”值字符串
for i:= Length(Code1) downto 1 do b:= (b+ ord(Code1[i]))*9; //循环取Code1的ASCII值*9 之和
Code2:=inttostr(b);
Result:= inttostr((a+b) shr 1); // Code1和Code2之和 再shr 1 运算,转十进制字符串即可。
end;
我的机器码是:-1074964643
注册码:545040015
--------------------------------------------------------------------------------
【经验总结】
开始遇到一个很郁闷的问题,不知道十六进制转十进制时有两个结果,一个是有符号值,一个是无符号值。一开始
把变a,b定义为integer时,用inttostr(Code1)返回的值是有符号的十进制值的字符串,但人家要的是无符号值,后来狂搜
百度,才发现要把a,b定义为LongWord类型才能返回无符号值,搞定!!!
本破解没有什么技术含量,参考fwycfpg对1.0版本的破解思路,在此再次感谢fwycfpg!!
Written by 黄仁来[东莞群英]
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年12月30日 9:28:36
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课