【文章标题】: 半仙算命v2007 build 01.01 注册算法分析
【文章作者】: Red_angelX
【生产日期】: 20070117
【软件名称】: 半仙算命v2007 build 01.01
【软件大小】: 1823K
【下载地址】: http://www.fuzi.cn/showdown.asp?soft_id=61
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD+Dede
【操作平台】: Win32
【软件介绍】: 〖半仙算命〗软件集成了多种测算选项,测算内容、测算项目极其丰富,包括姓名吉凶测算、命运推算、科学起名向导、生男生女查询以及万年历、农历、中国黄历、皇历等等实用查询等。软件功能强大,使用简单、绿色、环保,只要你正确选择好出生的日期,即可自动转换为农历、属相、星座等然后软件将依此进行命运推算、姓名推算等等,软件运算参考数十种古代命理、算命、运程、吉凶书籍,有根有据。
【附加说明】:本文只是学习和研究的目的,如果你要使用,请支持国产
以前做过几次内存注册机,每次出新的就要重做,很麻烦...,今天没事就来玩玩,记得老版本注册码是明文,猜想加密不会很复杂~
查下,没壳?? 记得以前有壳还有自效验的啊,可能是绿色版已经被人搞过了的缘故吧,不管,反正我是要KeyGen,KeyGen出来了什么壳都不在眼里了,DeDe分析,找到注册过程在 553f34上,DeDe任务完了,开OD,载入,下断点,跑起来点注册,嘿嘿真断下了,下面是代码
00553F34
.
55
push ebp
00553F35
.
8BEC mov ebp
,
esp
...................................................................................
00553F70
.
B1
01
mov cl
,
1
00553F72
.
BA 3C425500 mov edx
,
0055423C
;
ASCII
"
SOFTWAREMicrosoftYhds
"
00553F77
.
8BC6 mov eax
,
esi
00553F79
.
E8 9A5AF5FF
call
004A9A18
00553F7E
.
68
80000000
push
80
;
/
BufSize
=
80
(
128
.)
00553F83
.
8D85 7BFFFFFF lea eax
,
dword ptr [ebp-
85
]
;
|
00553F89
.
50
push eax
;
|Buffer
00553F8A
.
E8 5D33EBFF
call
<
jmp
.
&kernel32
.
GetSystemDirector
>;
GetSystemDirectoryA
00553F8F
.
8D45 FC lea eax
,
dword ptr [ebp-
4
]
00553F92
.
8D95 7BFFFFFF lea edx
,
dword ptr [ebp-
85
]
00553F98
.
B9
81000000
mov ecx
,
81
00553F9D
.
E8 4A0CEBFF
call
00404BEC
00553FA2
.
8D95 70FFFFFF lea edx
,
dword ptr [ebp-
90
]
00553FA8
.
8BBB FC020000 mov edi
,
dword ptr [ebx
+
2FC]
00553FAE
.
8BC7 mov eax
,
edi
00553FB0
.
E8 2B3FEFFF
call
00447EE0
00553FB5
.
8B85 70FFFFFF mov eax
,
dword ptr [ebp-
90
]
;
name
00553FBB
.
8D95 74FFFFFF lea edx
,
dword ptr [ebp-8C]
00553FC1
.
E8 0653EBFF
call
004092CC
00553FC6
.
8B95 74FFFFFF mov edx
,
dword ptr [ebp-8C]
00553FCC
.
8BC7 mov eax
,
edi
00553FCE
.
E8 3D3FEFFF
call
00447F10
00553FD3
.
8D95 68FFFFFF lea edx
,
dword ptr [ebp-
98
]
00553FD9
.
8BBB
04030000
mov edi
,
dword ptr [ebx
+
304
]
00553FDF
.
8BC7 mov eax
,
edi
00553FE1
.
E8 FA3EEFFF
call
00447EE0
00553FE6
.
8B85 68FFFFFF mov eax
,
dword ptr [ebp-
98
]
;
key
00553FEC
.
8D95 6CFFFFFF lea edx
,
dword ptr [ebp-
94
]
00553FF2
.
E8 D552EBFF
call
004092CC
00553FF7
.
8B95 6CFFFFFF mov edx
,
dword ptr [ebp-
94
]
.............................................................
00554065
.
8B83 FC020000 mov eax
,
dword ptr [ebx
+
2FC]
0055406B
.
E8 703EEFFF
call
00447EE0
00554070
.
8B85 54FFFFFF mov eax
,
dword ptr [ebp-AC]
00554076
.
E8 0556EBFF
call
00409680
;
关键Call
0055407B
.
B9
60110000
mov ecx
,
1160
00554080
.
99
cdq
00554081
.
F7F9 idiv ecx
00554083
>
.
8BC2 mov eax
,
edx
;
edx余数
00554085
.
8D95 58FFFFFF lea edx
,
dword ptr [ebp-A8]
0055408B
.
E8 B0FDFFFF
call
00553E40
;
可疑
代码全在这一片了,先取系统System32目录,往下面丢一个文件C201l.dll,注册码就丢在里面,不信?你随便输入个再打开看看~.
过程大概是这样,554076是关键Call,算出一个值,除1160 的余数再异或一下转成10进制就是注册码的前几位~~
55408B就是比较注册码是否合法的Call了,细跟了遍发现流程很简单~~,关键Call竟然就是把string转成Int,我晕~
1.注册码(难怪只能输入数字) 对 1160 求余
2.余数和0B25F1异或
3.得到一个值就是注册码的前几位,后面还两位
4.后面第一位是过程3的值的1.2位的char相加,对5求余后+ 44
5.后面第二位是过程3的值的3.4位的char相加,对5求余后+ 33
6.连接3.4.5就是注册码
很简单吧,用自己的KeyMake写了个注册机:(C#)
public
string
GenCode(
string
para1)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int sum = -1;
string ret = "";
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
sum = int.Parse(para1);
}
catch(FormatException)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return "确认码只能是数字!";
}
//return sum.ToString();
int edx = sum % 0x1160;
edx = edx ^ 0x0B25F1;
ret = edx.ToString();
if(ret.Length < 4)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return "Error!";
}
int eax = (ret[0]+ret[1]) % 5 + 34;
eax -= 30;
int ebx = (ret[2]+ret[3]) % 5 + 33;
ebx -= 30;
return ret + eax.ToString() + ebx.ToString();
}
后给出一组测试的注册码:
name:123456789
key:73216457
附:如果你要使用该软件,请购买正版支持国产软件