飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2411|回复: 5

[讨论中..] 兄弟在线,哥哥连接一下啊。PB程序破解分析!!!高手注意,再给提示一下

[复制链接]

该用户从未签到

发表于 2006-12-5 01:31:29 | 显示全部楼层 |阅读模式
各位高手,小弟的这个软件是一个采用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 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-11-6 10:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-12-5 12:00:20 | 显示全部楼层
    拿出程序来或连接
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-28 06:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-12-5 17:49:29 | 显示全部楼层
    原帖由 xuhw 于 2006-12-5 12:00 发表
    拿出程序来或连接


    楼主有救了,咖啡 会帮你搞定的 ;P
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2022-7-11 17:43
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2006-12-5 20:21:19 | 显示全部楼层
    楼主贴子在看雪也看到过啊一起等待高人哦
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2006-12-6 10:03:19 | 显示全部楼层

    哥哥,

    我来了,谢谢你能帮我,连接看一下行么
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2006-12-6 10:13:28 | 显示全部楼层

    帮兄弟看一下那个程序,

    兄弟QQ544432666,哪位哥哥或者楼上的大哥在线,请加一下小弟,连接一下看看小弟的这个程序行不?
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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