前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PBKILLER的搜索

【原创】PB程序(成功进销存 3.5专业版)破解过程 [文字模式] - 看雪安全论坛 看雪安全论坛 > Windows > 『软件调试逆向』 > 【原创】PB程序(成功进销存 3.5专业版)破解过程 PDA 查看完整版本 : 【原创】PB程序(成功进销存 3.5专业版)破解过程 sunsjw2007-07-27, 15:21:12PB程序(成功进销存 3.5专业版)破解 标 题: 【原创】PB程序(成功进销存 3.5专业版)破解 作 者: sunsjw 时 间: 2007-07-27,14:36 链 接: http://bbs.pediy.com/showthread.php?p=338482#post338482 成功软件《进销存》3.5专业版是专业的进销存管理软件,非常适用于中小型企业的管理。该软件的3.03版曾和全国最大的U盘生产商朗科进行捆绑合作,在广大用户反馈的基础上推出了3.5版本,针对同类型的软件,该软件是针对中国人做的软件,非常符合中国的国情和使用习惯。成功软件《进销存》3.5专业版有完善的库存,销售管理系统,非常方便的查询平台和报表体系。软件不需要加密狗,下载后直接安装就可以使用,未注册的版本限制了只能输入300条数据. 听朋友说这个软件要1000 RMB,没有钱怎么办?拿来给我这菜鸟练练手,PB的东西从来没有搞过有点心虚,还好有PBKILLER真是个好东西,源码都可以看得到,就直接分析它的注算法吧。 用PBKILLER打开该程序的几个PDB文件研究下,发现在cgsw.pdb文件里是它的窗体文件。在里面找啊找,找到了w_reguser注册窗体,明显看到cb_ok按钮,看下Events里的clicked事件里的代码 我们只看关键代码如下 xxnr = "注册完成,谢谢!" f_userxy(chname,chtel,chsn,chid) if zhspass = 9999 then xxnr = "注册成功,谢谢!" parent.p_user.picturename = "regok.bmp" else if (((((zhspass = 7471) or (zhspass = 7472)) or (zhspass = 7473)) or (zhspass = 7474)) or (zhspass = 7475)) then xxnr = "注册完成,谢谢!" parent.p_user.picturename = "regok.bmp" else xxnr = "注册不成功,请再试试,如果还不成功,请咨询您的软件供应商," end if end if 哈哈,太简单了,只要zhspass=9999,7471,7472...7475就可以注册成功。那就找找在哪里给zhspass赋的值,往上看,f_userxy(chname,chtel,chsn,chid)这个函数有点特别,肯定这个东西里面就是注册算法了,去看看去。 用PBKILLER打开cgsf.pdb文件,找到f_userxy这个函数,打开看看源码吧。 string dq_id string dq_name string new_zf string new_js string new_as string new_xh string dq_sn string chname string chtel string chsn string chid string lmm long i long dqh long jsq long srbz long qs long qs2 decimal maincd decimal mainxh decimal id boolean fhz = false string qlw string hlw string newid srbz = 0 dq_id = trim(softid) dq_id = left(dq_id,len(dq_id) - 2) dq_id = right(dq_id,len(dq_id) - 2) maincd = 0 dq_name = trim(username) + trim(usertel) maincd = f_cdjs(dq_name) new_zf = string(maincd) new_zf = reverse(new_zf) maincd = dec(new_zf) if bbmc = 0 then qs = 128 else if bbmc = 1 then qs = 118 else if bbmc = 2 then qs = 253 else if bbmc = 3 then qs = 168 else if bbmc = 4 then qs = 136 else if bbmc = 5 then qs = 138 else if bbmc = 6 then qs = 126 else if bbmc = 7 then qs = 188 else if bbmc = 8 then qs = 135 else if bbmc = 9 then qs = 118 else if bbmc = 10 then qs = 158 else if bbmc = 12 then qs = 116 else if bbmc = 18 then qs = 129 else if bbmc = 28 then qs = 135 end if end if end if end if end if end if end if end if end if end if end if end if end if end if maincd = maincd * qs maincd = maincd + 256 dq_sn = trim(softsn) for jsq = 1 to len(dq_sn) step 2 new_js = new_js + mid(dq_sn,jsq,1) next for jsq = 2 to len(dq_sn) step 2 new_as = new_as + mid(dq_sn,jsq,1) next for jsq = 1 to len(new_as) new_xh = new_xh + mid(new_as,jsq,1) new_xh = new_xh + mid(new_js,jsq,1) next mainxh = dec(new_xh) if bblx = "2" and bbmc = 3 and bbfs = 2 then qs2 = 128 else if bblx = "1" and bbmc = 2 and bbfs = 2 then qs2 = 208 else if bblx = "2" and bbmc = 2 and bbfs = 2 then qs2 = 178 else if bblx = "3" and bbmc = 2 and bbfs = 2 then qs2 = 132 else qs2 = 138 end if end if end if end if mainxh = mainxh * qs2 mainxh = mainxh - 280 zhspass = 1 if bbmc = 1 then yhxl = 2 else yhxl = 1 end if fhz = false for i = 1 to 99 newid = string(maincd + mainxh) qlw = left(newid,2) hlw = right(newid,2) qlw = string(dec(qlw) * i) hlw = string(dec(hlw) * i) if len(hlw) = 1 then hlw = "0" + hlw end if newid = left(newid,len(newid) - 2) newid = right(newid,len(newid) - 2) newid = qlw + newid + hlw if newid = dq_id then //爆破点(我们要把它改成不等于) zhspass = 9999 //这个地主给zhspass赋值了,下面还有哦。 yhxl = i fhz = true exit else newid = string(maincd + mainxh * 3) qlw = left(newid,2) hlw = right(newid,2) qlw = string(dec(qlw) * i) hlw = string(dec(hlw) * i) newid = left(newid,len(newid) - 2) newid = right(newid,len(newid) - 2) newid = qlw + newid + hlw if newid = dq_id then zhspass = 7471 //这个地主给zhspass赋值了 yhxl = i fhz = true exit else newid = string(maincd + mainxh * 6) qlw = left(newid,2) hlw = right(newid,2) qlw = string(dec(qlw) * i) hlw = string(dec(hlw) * i) newid = left(newid,len(newid) - 2) newid = right(newid,len(newid) - 2) newid = qlw + newid + hlw if newid = dq_id then zhspass = 7472 //这个地主给zhspass赋值了 yhxl = i fhz = true exit else newid = string(maincd + mainxh * 11) qlw = left(newid,2) hlw = right(newid,2) qlw = string(dec(qlw) * i) hlw = string(dec(hlw) * i) newid = left(newid,len(newid) - 2) newid = right(newid,len(newid) - 2) newid = qlw + newid + hlw if newid = dq_id then zhspass = 7473 //这个地主给zhspass赋值了 yhxl = i fhz = true exit else newid = string(maincd + mainxh * 7) qlw = left(newid,2) hlw = right(newid,2) qlw = string(dec(qlw) * i) hlw = string(dec(hlw) * i) newid = left(newid,len(newid) - 2) newid = right(newid,len(newid) - 2) newid = qlw + newid + hlw if newid = dq_id then zhspass = 7474 //这个地主给zhspass赋值了 yhxl = i fhz = true exit else newid = string(maincd + mainxh * 2) qlw = left(newid,2) hlw = right(newid,2) qlw = string(dec(qlw) * i) hlw = string(dec(hlw) * i) newid = left(newid,len(newid) - 2) newid = right(newid,len(newid) - 2) newid = qlw + newid + hlw if newid = dq_id then zhspass = 7475 //这个地主给zhspass赋值了 yhxl = i fhz = true exit end if end if end if end if end if end if next return fhz 注册算法大家自己分析啊,本来我想写个注册机,可是看看前面几个变量bbmc,bblx确定不下来,算了,还是来个爆破吧。PBKILLER这个东西确实是个好东西,可是不能修改文件,郁闷了啊,因为PB的东西是pcode所以要找到爆破点还是有难度啊。看看代码 if newid = dq_id then //爆破点(我们要把它改成不等于) zhspass = 9999 //这个地主给zhspass赋值了,下面还有哦。 yhxl = i fhz = true exit else 代码中有常量9999出现,好办了,那我们就在代码中找找这个数了,9999转换成16进制270F,在PB里表示成0F27,找到了这个数,那么if newid = dq_id then 肯定就在它前面的不远处了,我们就可以修改了啊。好开始用winhex在cgsf.pdb文件里找找,一共找到4个,到底是哪一个呢,我也不知道。那就用笨一点的办法了,就是把0F27全陪替换成8888,然后打开PBKILLER查看cgsf.pdb的y_userxy函数发现zhspass已经不在等于9999了,而是等于34952,好了再把刚才替换成8888的再挨个替换成0F27,每替换一个用PBKILLER重新打开cgsf.pdb文件查看f_userxy函数中zhspass是不是改回原值9999了。如果是的话就找到了。我已经找到了在cgsf.pdb文件的偏移0004FF43处。(有人问为什么要替换成8888,不为什么,因为8888这个数在原始文件里没有出现过)内容如下: 0004FF30: 00 04 00 AA 00 00 00 00 00 02 00 B6 08 1C 01 11 0004FF40: 00 31 00 0F 27 00 00 8B 00 01 00 7D 00 00 00 1C 看到没0F27上面有个AA,我们把AA改成BA保存哦。再用PBKILLER打开cgsf.pdb文件查看f_userxy函数里的的newid = dq_id已经变成了newid <> dq_id,好了找开软件注册吧,随便输入注册码,序列号都能注册成功啊!哈哈,爆破成功!!! 好了把cgsf.pdb这个文件发给我朋友。收功。。。 又有人问,你怎么知道把AA换成BA就是不等于呢? 今天公司有事情就先写到这里,星期一再写怎么知道把AA抱成BA,好了闪人。 kanxue2007-07-27, 19:53:20解释性语言保护确实是件头疼的事,PB,JAVA,VFP… sunsjw2007-07-27, 22:18:48接上面的,怎么知道把AA改成BA呢!其实PB的东西我也不懂,不知道PB的pcode和X86指令的对应关系,可能PBKILLER的作者比较熟悉吧。让他来破这个软件肯定很轻松。那怎么办?还是笨办法,自己来写个PB的程序来看看,以下是我写的PB代码工程名:xy string x string y integer m if x<>y then m = 9999 endif if x=y then m=9999 endif 程序写完了,用PB编译,我们的程序里也有个xy.pdb。下面我们用winhex打开xy.pdb在里面查找0F27,一共找到两个,那们就分析这两个地方前面的代码有什么不同的地方,这两个代码块大部分都是一样的,唯一不一样就是前面那个是BA,后面这个是AA,这个大家都知道什么意思了吧,我就不说了,睡觉去了。。。 hjzhjz2007-07-27, 22:49:42哪里有PBKILLER下载啊? Nisy2007-07-28, 07:07:19好文章,绝妙的修改思路。 PBKILLER下载:http://www.pediy.com/tools/Decompilers.htm ynboyinkm2007-07-28, 23:52:25pb的程序怕怕,源代码都看到了~~ hxssjy2007-07-29, 09:34:53有一些地方源代码看不懂,怎么办啊.有没有学习源代码的教材啊 sunsjw2007-07-29, 11:52:29教程只有自己去学PB了,不过好像没什么前途了。我也是从来没有学过PB,不过语言都是相通的。 ggttttgg2007-07-29, 12:33:15用od 不能破解這個程序的嗎........ sunsjw2007-07-30, 10:30:50od破起来有点难,一直在PB的虚拟机打转转,还不如直接分析源码方便。 vBulletin&reg; v3.8.7,Copyright &copy;2000-2014,vBulletin Solutions Inc.