飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3706|回复: 1

[转贴] 《XX图书管理系统2008》注册分析

[复制链接]

该用户从未签到

发表于 2007-2-23 20:48:21 | 显示全部楼层 |阅读模式
下载目标:http://www2.ruitian.net/download/booksetup.exe
声明:只是感兴趣,请勿用于商业用途
转载请注名出处!Cracked  by zpunpack   2007.02.23日整理
作者主页:www.unpack.cn软件简介:
《XX图书管理系统2008》是一款功能非常强大的图书管理软件,本系统在继承了以往系统版本优点的基础上做了进一步优化;在功能上,本系统不仅包含图书管理的常用功能(如书籍管理、期刊管理、物品管理、读者管理、借、还、预借、续借和统计分析等等功能),而且还增加了条码的生成和打印功能(不仅为使用者省去了购买价格昂贵的条码专用打印机的费用,而且条码产生更方便,与系统结合更紧密)。
  考虑到很多单位和学校有现成的身份IC卡(校园卡、会员卡等),为了有效的利用这些已有资源,让使用者使用更方便,我们特在系统中加入了会员卡管理功能,这样,图书管理员不仅可以通过读者编号进行借阅操作,也可以通过已有的身份卡(配合刷卡机或者条码扫描抢使用)来完成操作;在系统的办卡管理中有新办卡、换卡和注销卡等功能,彻底解决丢卡后的安全隐患问题(向制卡公司定制卡时,一般会要求每张卡的ID号都不同,所以一旦换卡了,原来的会员卡就作废了,即使丢失卡被别人捡到也不能进行正常的借阅操作)。
  本系统具有操作简单,易学易用的特点。在开发过程中,我们总结了多年使用电脑管理图书馆业务的经验,注意到工作人员在使用电脑时容易发生的人为错误,因而使系统具有较强的容错和排错功能,而且本系统自带了一些常用的资料库(如中图分类库,出版社库等,系统会自动根据图书的标准ISBN码检索出当前图书的出版社名称和出版地点等,从而实现图书的自动录入的功能),使得用户在录入图书资料时更轻松;系统也自带了通用数据导入功能,可以非常简单地把用户以前的已有资料或者通过采集器采集到的数据资料导入到本系统中,避免了大量的重复劳动。经过长时间的不断测试和完善,系统的安全性和稳定性得到保证。

  本系统完全可以配合条码扫描枪使用,操作会更流畅,更简单。

  技术简介: 本系统采用Adaptive Server Anywhere数据库、C/S结构,完全支持多用户操作;可运行于 Windows9x/WindowsNT/2000/Xp/2003平台,有良好的兼容性、先进性与扩充性;可在线升级。

  系统特点:操作简单、界面清晰、功能强大、运行稳定快速、系统资源占用少
系统分析:该软件采用PB编写,提供试用和临时注册,临时注册时限为10天。经查看crmmanage.pbd可以得到一些关键的代码,自己在PB10中新建一个注册机如下结构:



一、从上图中可以看出,新建一个名为getsn 的application和一个名为getzcm的window
Getsn application中的各个function的脚本如下:(附简单的注释)
//guf_get_real_days()  returns integer
//获取临时剩余天数
ulong li_regedit
ulong li_ini
ulong li_now
ulong li_rn

li_now = month(today()) * 100 + day(today()) //月份*100+日
registryget("HKEY_LOCAL_MACHINE\Software\RtApp\Rtbook\MachineReg\Info","Regdate",regulong!,li_regedit)
//读注册表中的Regdate的键值,把其类型视为regulong,并存入变量li_regedit中
li_ini = profileint("cfg.ini","SETSAVE","datesave",0)
//从文件cfg.ini中setsave段的datesave值
li_rn = (li_regedit - 6) / 3
li_regedit = int(li_rn / 32) * 100 + mod(li_rn,32)
li_regedit = 10 - (li_now - li_regedit)
li_rn = (li_ini - 1) / 7
li_ini = int(li_rn / 33) * 100 + mod(li_rn,33)
li_ini = 10 - (li_now - li_ini)
if li_ini <= li_regedit then
        li_rn = li_ini
else
        li_rn = li_regedit
end if
if li_rn > 10 or li_rn < 0 then
        li_rn = 0
end if
return li_rn
从以上可以推算出,要使注册剩余天数永远为10天,(软件临时注册天数最多为10天),应使注册表中的regdate=(month(today())*32+day(today()))*3+6,cfg.ini文件中的datesave=(month(today())*33+day(today()))*7+1;


//guf_regi() returns Boolean
//判断是否注册
ulong li_regi
string str_sn
string str_machine_code
boolean lb_reg = false
registryget("HKEY_LOCAL_MACHINE\Software\RtApp\Rtbook\MachineReg\Info","Registered",regulong!,li_regi)
//读注册表中的Registered的键值,读到后,把其类型视为regulong,并存入变量li_reg中
str_machine_code=trim(getzcm.txt_jqm.text) //机器码
if li_regi = 1 then //为1表示已注册
        registryget("HKEY_LOCAL_MACHINE\Software\RtApp\Rtbook\MachineReg\Info","Machine_sn",regstring!,str_sn) //读取注册表中的注册码
//以下关键:如果以下两者相等则就是正确的注册,否则清除注册信息
if uf_str_dejm(str_sn,15)= uf_get_sn(uf_str_dejm(str_machine_code,15),"rtbk",str_machine_code) then
lb_reg = true
else
registrydelete("HKEY_LOCAL_MACHINE\Software\RtApp\Rtbook\MachineReg","")
lb_reg = false
end if
else
lb_reg = false
end if
if lb_reg then
//messagebox("检测剩余天数","若大于0则为已注册,否则虽然已输入正确的序列号还是未注册")
        if guf_get_real_left_days() > 0 then
                return true
        else
                return false
        end if
else
        return false
end if
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//以下是uf_get_id(integer a_key) returns string
string str_rn = ""
string str_logic_sn
string ls_rootpath
string ls_volumnename
ulong lul_volumenamesize
ulong lul_volumeserialnumber //硬盘逻辑序列号
ulong lul_maximumcomponentlength
ulong lul_filesystemflags
string ls_filesystemnamebuffer
ulong lul_filesystemnamesize
boolean lb_rtn = false


str_rn = "bookmanage"
ls_rootpath = "C:\"
ls_volumnename = space(56)
lul_volumenamesize = 256
lul_maximumcomponentlength = 256
ls_filesystemnamebuffer = space(256)
lul_filesystemnamesize = 256
lb_rtn = false
lb_rtn =
//获取磁盘卷标序列号,可见此系统的临时注册机器码的产生不是根据硬件编码来的
getvolumeinformationa(ls_rootpath,ls_volumnename,lul_volumenamesize,lul_volumeserialnumber,lul_maximumcomponentlength,lul_filesystemflags,ls_filesystemnamebuffer,lul_filesystemnamesize)
//messagebox("注意","获取的机器逻辑序列号="+string(lul_volumeserialnumber))
if lb_rtn = true then
        str_logic_sn = string(lul_volumeserialnumber)
else
        str_logic_sn = "www.ruitian.net"
end if
str_logic_sn = trim(str_logic_sn)
if len(str_logic_sn) < 11 then
        str_logic_sn = str_logic_sn + left("www.ruitian.net",11 - len(str_logic_sn))
else
        str_logic_sn = left(str_logic_sn,11)
end if
if isnull(str_logic_sn) or str_logic_sn = "" then
        str_logic_sn = "www.ruitian"
end if
str_rn = uf_str_jm(str_logic_sn,str_rn)
return str_rn
//////////////////////////////////////////////////////////////////////////////////////////////
//uf_get_sn(string parm1,string parm2,string parm_rnd) returns string

integer int_sum_asc
string str_tmp
string str_rn
parm1 = trim(parm1)
parm2 = left(parm1,4)
str_tmp = parm2
do until len(parm2) < 1
        int_sum_asc = int_sum_asc + asc(parm2)
        parm2 = right(parm2,len(parm2) - 1)
loop
parm2 = char(mod(int_sum_asc,26) + 65) + left(str_tmp,4)
str_rn = uf_str_dejm(uf_str_jm(parm2 + parm1,parm_rnd),15)
return str_rn

//////////////////////////////////////////////////////////////////////////////////////////////////
//字符解密
//uf_str_dejm(string parm,integer prm_cnt) returns string
string str_rn  //15个字符
integer n
integer i
integer j
integer str_pos[21]
n = asc(right(parm,1)) //取右边第一个字符的ASC码值
str_rn = space(prm_cnt)
for i = 1 to prm_cnt
        j = mod((n * i) * i + n,21)  //  j=n*i*i+n mod 21
        if j = 0 then
                j ++
        end if
        do until str_pos[j] = 0
                j ++
                j = mod(j,21)
                if j = 0 then
                        j ++
                end if
        loop
        str_pos[j] = i
next
for i = 1 to 21
        if str_pos <> 0 then
                str_rn = replace(str_rn,str_pos,1,mid(parm,i,1))
        end if
next
str_rn = trim(left(str_rn,prm_cnt))
return str_rn

///////////////////////////////////////////////////////////////
//uf_str_jm(string parm1,string parm2) returns string 字符加密
string str_rn = ""
integer n
integer i
integer j
integer str_pos[21]
integer int_asc = 97
n = asc(parm1)
for i = 1 to len(parm1)
        j = mod((n * i) * i + n,21)
        if j = 0 then
                j ++
        end if
        do until str_pos[j] = 0
                j ++
                j = mod(j,21)
                if j = 0 then
                        j ++
                end if
        loop
        str_pos[j] = i
next
for i = 1 to 21
        if str_pos = 0 then
                str_rn = str_rn + left(parm2,1)
                parm2 = right(parm2,len(parm2) - 1)
        else
                str_rn = str_rn + mid(parm1,str_pos,1)
        end if
next
str_rn = str_rn + left(parm1,1)
for i = 1 to 21
        int_asc = mod(asc(mid(str_rn,i,1)) * (i + 4),122)
        if int_asc < 48 then
                if int_asc < 24 then
                        int_asc = mod(int_asc,10) + 48
                else
                        int_asc = mod(int_asc,26) + 65
                end if
        else
                if int_asc > 57 and int_asc < 65 then
                        int_asc = mod(int_asc,26) + 97
                else
                        if int_asc > 90 and int_asc < 97 then
                                int_asc = mod(int_asc,26) + 97
                        end if
                end if
        end if
        str_rn = replace(str_rn,i,1,char(int_asc))
next
str_rn = upper(str_rn)
return str_rn

二、getzcm的界面如下:

计算按钮的代码是:
string dejms1
dejms1=""
ulong data1
ulong data2

string str_sn1 //解密好的序列号
string str_sn2
string sle_code //显示的机器码,等于uf_get_id(10),其实参数10可能无关紧要
string str_sn3[26]
string str_xh
string str_sn4
integer xh1 //字符序号
integer i

boolean lb_reg = false
integer syts //剩余天数
boolean hasreg
syts=getsn.guf_get_real_left_days()
getzcm.txt_syts.text=string(syts)
string zdy_jqm //自定义机器
zdy_jqm=trim(getzcm.txt_jqm.text)
if isnull(zdy_jqm) or zdy_jqm="" then
// sle_code=uf_get_id(10)
getzcm.txt_jqm.text=trim(sle_code2)  
end if

sle_code=getzcm.txt_jqm.text
hasreg=getsn.guf_regi() //判断是否注册

if hasreg=true then
         messagebox("提示","软件已注册")
else
         messagebox("提示","软件未注册")
end if

data1=(month(today())*33+day(today()))*7+1
data2= (month(today())*32+day(today()))*3+6
//******************************************************
messagebox("提示","cfg.ini文件中setsave段的datesave="+string(data1))
messagebox("提示","注册表中Regdate的值="+string(data2))

getzcm.ss1.text=string(data1)
getzcm.ss2.text=string(data2)
string mys1
integer zs1
mys1="abcdefghijklmnopqrstuvwxyz"
zs1=15

dejms1=getsn.uf_str_dejm(mys1,zs1)
str_sn1=getsn.uf_get_sn(getsn.uf_str_dejm(sle_code,15),"rtbk",sle_code)
for i=1 to 26
str_sn3=char(i+96) //asc码值转换为字符
//str_sn=str_sn+str_sn3
next

//得到的str_sn="abcdefghijklmnopqrstuvwxyz"
str_xh="mabpctjnhqriokd" //假设输入的序列号是str_sn,则经过解密的真正序列号是 str_xh

for i=1 to 15
xh1=asc(mid(str_xh,i,1))-96 //得到字符位置
  str_sn3[xh1]=mid(str_sn1,i,1) //取中间字符
next
str_sn4=""

for i=1 to 26
  str_sn4=str_sn4+str_sn3
next

//messagebox("序列号:",str_sn4)

getzcm.zcm.text=str_sn4
getzcm.cmd_zc.enabled=true

三、本来“注册”按钮是设计为自动填写注册信息,写入注册表和cfg.ini文件,而“清除”则设计为清除注册信息,现在我把它们略去,留给有兴趣的同仁们也去动动手。

最后特别提醒:请支持国产软件!如果你喜欢该软化,购买正版吧!《XX图书管理系统2008》注册分析(附注册机)
另外:运行时需要pB10运行库:pbshr100.dll,pbvm100.dll,libjcc.dll。由于文件太大(压缩后也有1.5M),我无法上传,很抱歉,大家自找吧!
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-2-23 20:53:47 | 显示全部楼层
注册机没转过来 PB的软件 难得一见 有兴趣的自行研究下吧~~
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表