[工具]: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伪代码中跳转、判断的对应十六进制代码及其修改方法,希望有高手能总结出来。好累,到此为止了。