- UID
- 26372
注册时间2006-12-3
阅读权限30
最后登录1970-1-1
龙战于野
该用户从未签到
|
各位高手,小弟的这个软件是一个采用SQL库的进销存软件,软件安装完毕,主程序却不到100K,
下面是我对软件的分析.
1.查壳为Microsoft Visual C++ 5.0 [Overlay]显然没有加壳,因为我用W32ADSW能够看到串式参考,但是都是乱码,再就是也没有几个参考内容.
2.软件运行有NAG窗口,采用一机一码的机器码,用户号,注册码方式注册.注册后,程序目录INI文件中有ZCM=""项目.(提示,采用硬盘序列号加密提取的机器码)
3.软件运行时NAG窗口中有机器码显示,我曾经试着删除程序目录下MK.DLL文件,结果软件显示出错信息如下:
error opening dll library mk.dll for external function in get serial of object w_cwxtzc,而且,原NAG窗口中机器码不见了.该MK.DLL经查壳Microsoft Visual C++ 5.0 [调试].用W32ADSW导入后,全是英文或乱码,未见到可用信息.
4.回忆细节,第三条见到的提示,再加上程序目录有很多格式为.PBD的文件,所以改用PBKILL分析主程序文件,无效,DLL文件也无效.
分析.PBD格式文件,终于在FUN.PBD里找到上面所述W_CWXTZC的窗口内容.该窗口中包括软件注册按钮,软件试用按钮,等,还有一部份内容象是验证注册码和用户名的.但是小弟不懂PB,所以吃透很是困难,现摘取相关内容,求各位老大帮兄弟找找,核心算法是哪一部份,谢谢了.(晕啊,本来想拿这篇破解贴上来混个精华,结果没想到,卡壳了!!!)
内容较长,老大们有点耐心啊,谢谢了.
这部份个人感觉是主要部份:所以贴上来,(全贴怕版主说我求破解啊!!)
settypemakeup(km)
if parent.sle_3.text = "" then
messagebox("提示","请输入注册码!") //显然sle_3.text就是输入注册码的框
parent.sle_3.setfocus()
return
end if
zc_bs = 0
s_sle = parent.sle_1.text //看过窗体各控件定义,s_sle是输入的用户号
s_sle = mid(s_sle,1,2) //这个应该是取用户号前两位。=s_sle
inputid_str = right(trim(parent.sle_1.text),6) //inputid_str=用户号后六位
ul1 = dec(inputid_str) // (UL1等于用户号后六位) 高手们注意这里,加上DEC是转换进制还是结果减一,求指点!
inputid_str = trim(parent.sle_3.text) // inputid_str=注册码
ul3 = dec(inputid_str) //( ul3=注册码) 这个同UL1就样,老大们给解释一个就行.
if left(s_sle,1) = "3" then //这里验证版本号的,一般为36或31
if right(s_sle,1) <> mid(profilestring(global_base_dir + "Licence.ini","Product","version","35000000"),2,1) then
messagebox("提示","用户号与所对应的版本不一致,注册失败!",stopsign!)
halt
parent.sle_3.setfocus()
return
end if
else
if s_sle <> left(profilestring(global_base_dir + "Licence.ini","Product","version","35000000"),2) then
messagebox("提示","用户号与所对应的版本不一致,注册失败!",stopsign!)
halt
parent.sle_3.setfocus()
return
end if
end if
// 用户号与版本不正确事件
my_getid = parent.get_serial(2) //my_getid=get_serial(2)
ul2 = dec(my_getid) //ul2
my_getid = parent.get_serial(9) //my_getid=get_serial(9)
ul21 = dec(my_getid) //ul21
uo_1 = create user_object
my_getid = uo_1.get_number(2)
my_getid1 = uo_1.get_number(9)
destroy(uo_1)
s_bbh_hy = lower(profilestring("Licence.ini","Product","name","yy")) //s_bbh_hy等于INI文件中NMAE项目,版本
//----------------------------------------------case=33-------------------------------------------------------------------
choose case s_sle //当s_sle用户号前两位等于
case "36" //高手们,快看看这里,给提示一下啊
ul3_tmp = dec(left(string(dec(ul1 * 449 + ul2 * 739)),9))//高手们,这里是不是就是注册码的结果啊?
我个人想知道上面这一句从DEC开始到后面是怎么计算的,而且怎么个运算顺序,求高手指点
if ul3 = ul3_tmp then
st5 = string(truncate(dec(my_getid) * 67 - 29027,0))
st6 = string(truncate(dec(my_getid) * 37 - 38791,0)) //版权
st4 = "a1234567890b" //软件未注册
update flash_picture set n9 =' ' , n10 =' ' , n11 =' ' , n12 =0 using sqlca_local;
/* SQL Parameters List
0-> :st4
1-> :st5
2-> :st6
3-> :ul3
*/
if show_sql_local_error() < 0 then
return
end if
zc_bs = 12
end if
ul3_tmp = dec(left(string(dec(ul1 * 719 + ul2 * 211)),9))
if ul3 = ul3_tmp then
st5 = string(truncate(dec(my_getid) * 67 - 29027,0))
st6 = string(truncate(dec(my_getid) * 37 - 38791,0))
st4 = "a1234567890b"
update flash_picture set n9 =' ' , n10 =' ' , n11 =' ' , n12 =0 using sqlca_local;
/* SQL Parameters List
0-> :st4
1-> :st5
2-> :st6
3-> :ul3
*/
if show_sql_local_error() < 0 then
return
end if
zc_bs = 22
end if
------------------------------------------------------
choose case zc_bs 这是注册成功部份.
case 0
messagebox("提示","注册不成功!")
halt
case 31
messagebox("提示","单机财务版注册成功!")
case 36
choose case s_bbh_hy //当s_bbh_hy(INI文件中NAME项)等于如下情况时
case "yy"
messagebox("提示","医药专业单机版注册成功!")
case "fz"
messagebox("提示","服装专业单机版注册成功!")
case "ty"
messagebox("提示","商务专业单机版注册成功!")
case "cs"
messagebox("提示","超市专业单机版注册成功!")
end choose
---------------------------------------------------
这是结尾部份,我没看懂. 这块竟然还有注册成功标识,晕了.
event key_yj;string inputid_str
string my_getid
string st4
string st5
string st6
string str
boolean zc_bs = false
user_object uo_1
typemakeup km
settypemakeup(km)
inputid_str = trim(parent.sle_3.text)
uo_1 = create user_object
my_getid = uo_1.get_number(2)
destroy(uo_1)
if inputid_str = my_getid and ( not match(my_getid,"00000")) then
st5 = string(truncate(dec(my_getid) * 67 - 29027,0))
st6 = string(truncate(dec(my_getid) * 37 - 38791,0))
st4 = "a1234567890b"
update flash_picture set n9 =' ' , n10 =' ' , n11 =' ' using sqlca_local;
/* SQL Parameters List
0-> :st4
1-> :st5
2-> :st6
*/
if show_sql_local_error() < 0 then
return
end if
zc_bs = true
commit using sqlca_local;
end if
setprofilestring("Licence.ini","Product","zcm",text)
close(parent)
if zc_bs=false then
messagebox("提示","注 册 成 功")
end if
return
end event
-----------------------------------------------------
这里好象是调用的那个提取注册号的注册过程.
type prototypes
function ulong mk_9xhdserial () library "mk.dll" alias for "mk_9xhdserial"
function ulong mk_nt2000hdsector () library "mk.dll" alias for "mk_nt2000hdsector"
function ulong mk_9xiderw (integer funcx) library "mk.dll" alias for "mk_9xIDERW"
end prototypes
forward prototypes
public function string get_serial (integer getfunc_n)
end prototypes
---------------------------------------------------------
高手们如果感觉内容多,这块可以不看,不过这的内容我更加没有看懂.相当不明白的.
public function string get_serial (integer getfunc_n);ulong dve_2
ulong my_getdiskv
ulong my_getdiskexv
ulong my_diskv
string my_diskv_st
string st1
string st2
string st3
string st4
string st5
string st6
string vl_1
boolean b2 = false
environment en1 //EN1 环境
getenvironment(en1) //呼叫EN1环境,B2为假,my_getdiskv=0,my)getdiskexv=0
b2 = true
my_getdiskv = 0
my_getdiskexv = 0
if en1.ostype = windows! then
b2 = true
dve_2 = mk_9xiderw(1)
else
b2 = false
dve_2 = mk_nt2000hdsector()
end if
if dve_2 = 255 or dve_2 = 0 then
return "000000"
end if
my_getdiskexv = -1 - dve_2
st1 = string(my_getdiskexv)
st2 = right(st1,8)
st3 = mid(st1,1,7)
my_diskv = long(st2) + long(st3)
if my_diskv < 100000 then
my_diskv_st = "000000"
return "000000"
else
my_diskv_st = string(my_diskv)
end if
choose case getfunc_n //当getfunc_n返回如下两种值时,各参数分别为
case 2
my_diskv_st = left(string(mod(long(left(my_diskv_st,6)) * 367 + long(right(my_diskv_st,6)) * 389,100000000)),6)
case 9
my_diskv_st = reverse(my_diskv_st) //my_diskv_st全部从后向前排列
st1 = mid(my_diskv_st,1,4)
st2 = mid(my_diskv_st,3,4)
st3 = mid(my_diskv_st,6,3)
st4 = mid(my_diskv_st,5,4)
st5 = mid(my_diskv_st,4,3)
my_diskv = (integer(st1) + integer(st2) + 331) * 89
my_diskv = my_diskv + integer(st3) * 13
my_diskv = my_diskv + integer(st4) + integer(st5) * 3
my_diskv_st = string(my_diskv)
end choose
return my_diskv_st
end function //getfunc过程,返回值my_diskv_st
菜鸟说明:本人正在努力学习中,这个软件和教程我已经研究了一周左右了.所以请各位大哥原谅小弟愚昧,如果您有时间,请多给点提示,.如果您在百忙之中读此贴,小弟在此多谢了.
希望各位大哥从上到下,多给研究一下,小弟感激不尽!!!!!!!!我的精华篇就等你们给点提示了.
实在做不了注册机,破解也行啊,高手们给指点一下,这样的软件怎么破啊?
[ 本帖最后由 wyh1983 于 2006-12-6 10:05 编辑 ] |
|