【文章标题】: 半仙算命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,载入,下断点,跑起来点注册,嘿嘿真断下了,下面是代码
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#)
... {
int sum = -1;
string ret = "";
try
...{
sum = int.Parse(para1);
}
catch(FormatException)
...{
return "确认码只能是数字!";
}
//return sum.ToString();
int edx = sum % 0x1160;
edx = edx ^ 0x0B25F1;
ret = edx.ToString();
if(ret.Length < 4)
...{
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
附:如果你要使用该软件,请购买正版支持国产软件