前往Shuct.Net首页

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

关于PBKILLER的搜索

PowerBuilder程序暴力破解实例_沧海软件:【官方网站】|沧海超市软件|超市软件|收银软件|桶装水软件|送水软件 无法在这个位置找到: head2.htm 当前位置: 主页 > 计算机技术 > PB > PowerBuilder程序暴力破解实例 时间:2009-02-24 13:40来源:未知 作者:admin 点击: 次 PowerBuilder程序暴力破解实例(PBD文件编辑法) [工具]:PBKILLER,UltraEdit[破解对象]:直销业绩管理系统V5.0 PowerBuilder的伪码编译同VB伪码编译一样,同样是PB动态库解释伪码执行,伪码放在以PBD为后缀的文件中。对付它的利器就是PBKILLER,利用它几乎可以反编译出和源代码相同的语句,连我这个没学PB的人也看得很清楚。直销业绩管理系统V5.0有30天的试用期,过期就不能运行。用PBKILLER反编译dot.pbd后找到其注册代码(w_wrcode-controls-cb_1-events-clicked):string ls_codeinteger li_rnls_code = trim(parent.em_1.text) + trim(parent.em_2.text) + trim(parent.em_3.text) + trim(parent.em_4.text)if len(ls_code) <> 16 then messagebox("提示","注册码长度必须16位")end ifli_rn = f_checkregcode(ls_code)if li_rn = 0 then f_setreg("9",f_encode(ls_code)) f_setreg("3",f_encode("89")) messagebox("提示","注册成功,请重新进入系统!") halt closeelse messagebox("提示","注册码错误!")end ifreturn代码很好懂,属重启校验型,注册算法是f_checkregcode函数。这里就不贴出代码了,其基本思路是先取C盘的8位序列号,再对注册码进行算法转换得到8位字符串与前面所取得的序列号进行比较。由于不是明码比较,注册算法中的16位到8位的转换要找出其逆算法也不容易。因此我就考虑暴破的方法,即修改PBD文件,但网上这方面的资料很少,只能自己摸索了。首先找到其重启校验代码(dotnew-Events-open):rt_chk_value = myreg.f_check_reg()if rt_chk_value = -100 then messagebox("提示","系统时间有误!") halt closeend ifif rt_chk_value = -200 then messagebox("提示","注册码有误!") halt closeend ifif rt_chk_value = -300 then messagebox("提示","试用期到,请注册!电话:xxxx网址:xxxxx") open(w_wrcode) returnend ifif rt_chk_value = -400 then messagebox("提示","系统破坏,请联系开发商!") returnend if 来至f_check_reg:ls_right = f_encode(f_redreg("0"))ls_wrong = f_encode(f_redreg("1"))if ls_right <> "wright" or ls_wrong <> "wrong" then return -400end ifls_regflag = f_redreg("3")....后面还有就不贴了。其中的f_encode(f_redreg(""))可根据不同的参数在注册表的不同项中读取出加密过的字符串并进行解密,之后进行校验,返回值为-100、-200、-300、-400其中一个的话程序就会报错退出。 至此,程序加密部分算法基本分析完毕,现在就要找出暴破点。我选择的是f_check_reg,即想办法让其所有返回值都为100(经分析,返回100表明是注册版)。难就难在PBKILLER虽然能反编译出源代码,却不能编辑它。注意到其中的-100、-200等数字,转换为十六制后就是FF9C、FF38,考虑到存储时的高低位互换特性,因此实际存储的十六进制代码应为9CFFFFFF、38FFFFFF(PB中是这样的,花费了我好一会时间才摸索出规律),OK,用UltraEdit打开PBD文件,搜索十六进制9CFFFFFF,结果会有很多,注意到地f_check_reg中有代码段: if check_result = 0 then return 200 else return -200 end if说明200和-200相离很近,因此选择搜索-200的十六进制表示(搜索200也可以),并且每搜索到一个就向上看,找找附近有没有C800(200的十六进制表示),这样用不了多久就能确定其位置了,在其附近还能找到100、-300、-400等的十六进制表示,用UltraEdit将找到的-100、-200、-300、-400十六进制表示全部改为100的十六进制表示。存盘退出,将系统时间延后两个月,程序正常运行。 小结:PBD文件经过反编译后能看到其源代码,结合汇编知识,理论上应该能利用UltraEdit找出每一句代码及数据对应的地址并进行修改。但确实比较繁琐,其实PBKILLER自带了一个PBL阅读器,能比较好的区分PBD的相应函数、窗口代码段,再在其中利用本文介绍的方法应该能更快的确定要修改的代码段。可惜的是我水平实在有限,也没那么时间去研究PB伪代码中跳转、判断的对应十六进制代码及其修改方法,希望有高手能总结出来。好累,到此为止了。 --------------------------------------------------------------------------------------------- 1、其实我只是给出了一种思路,你可以利用其它的数字关系或是字符串来确定位置,另外,对于有多个搜索结果的,可以先修改某处的结果,再重新反编译来查看是否是你要找的位置。甚至可以利用某个伪代码的反编译结果来进行匹配。方法比较灵活。最好先用PBL阅读器缩小搜索范围。 2、用微软的计算器(用我提供的那个计算器也行)将-100转为十六进制为FFFFFFFFFFFFFF9C,考虑整形的位数,可以取后八位即FFFFFF9C,intel cpu在存储时都是采取的低位在前、高位在后的方式(举例说明,如果是四位1234,存储时应该为3412,如果是八位12345678,先互换1234和5678,在互换12、34和56、78,最终为78563412),因此-100为9CFFFFFF,按此方法,1000的十六进制为3E8,补齐8位为000003E8,存储的时候应该为E8030000(其实是E803还是E8030000与原程序编译的环境也有关系,即整形用几位表示的问题)。 以上是我个人的见解,有说得不对的地方,欢迎指正! (责任编辑:sysOK) 顶一下 (1) 50% 踩一下 (1) 50% ------分隔线---------------------------- 上一篇:PowerBuilder 11.0(Pb11.1)试用版 破解方法 下一篇:PowerBuilder 11.0 加快您的开发速度 收藏 挑错 推荐 打印 发表评论 请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。 评价: 中立 好评 差评 用户名: 验证码: 匿名? 发表评论 最新评论 进入详细评论页>> 栏目列表 推荐内容 热点内容 PowerBuilder 11.5 下载 【原创】PowerBuilder用嵌入数据 PowerBuilder 11.0(Pb11.1)试用 PB升级:PB不同版本的区别 PB11 无边框web主窗口 【原创】PB升级:PB8/PB9升级PB1 PB升级:pb9和pb10到底有什么差 PB升级:升级到pb10的问题 PB10.5/11 新功能概述 PB11下的WebForm客户端打印输出 桶装水配送送水软件 商业软件.操作手册:前台 商业软件.操作手册:后台 商业软件.操作手册:连锁 操作手册:会员 商业软件.其他 电子秤_条码电子称 小票打印机 条码打印机 扫描枪_扫码枪 读卡器_读写器 超市资讯 行业软件 其他