前往Shuct.Net首页

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

关于PBKILLER的搜索

PowerBuilder程序暴力破解实例(PBD文件编辑法) - Athrun - 博客园 Athrun ASP.NET--Studio 博客园 首页 博问 闪存 新随笔 联系 订阅 --> 管理 随笔-1522 文章-0 评论-200 PowerBuilder程序暴力破解实例(PBD文件编辑法) go google search more... [工具]: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_code integer li_rn ls_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 if li_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 close else messagebox("提示","注册码错误!") end if return 代码很好懂,属重启校验型,注册算法是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 close end if if rt_chk_value = -200 then messagebox("提示","注册码有误!") halt close end if if rt_chk_value = -300 then messagebox("提示","试用期到,请注册!电话:xxxx网址:xxxxx") open(w_wrcode) return end if if rt_chk_value = -400 then messagebox("提示","系统破坏,请联系开发商!") return end 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 -400 end if ls_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伪代码中跳转、判断的对应十六进制代码及其修改方法,希望有高手能总结出来。好累,到此为止了。 posted @ 2008-07-10 12:33 Athrun 阅读(...) 评论(...) 编辑 收藏 刷新评论刷新页面返回顶部 博客园首页博问新闻闪存程序员招聘知识库 公告 Copyright &copy;2014 Athrun