心野的小巢

  IT博客 :: 首页 :: 联系 :: 聚合  :: 管理
  36 Posts :: 51 Stories :: 1305 Comments :: 0 Trackbacks

[工具]: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 on 2006-06-11 11:15 心野 阅读(22717) 评论(11)  编辑 收藏 引用 所属分类: 软件逆向手记

Feedback

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2006-07-20 17:30 back
大哥, 请教您一下

经过类似测试,

rt_chk_value = myreg.f_check_reg()
if rt_chk_value = -100 then
messagebox("提示","系统时间有误!")
halt close


  比如代码中的提示: 系统时间有误   在ultraedit 中 与相对-100好象没有明显的上下关系 , 就是说 很难在   "系统时间有误!"   上面找到 -100的 十六进制 的位置,

   问题1: 如果没有 相对的 200  和 -200 附近关系

       您是如何确定 200 的位置的.

   问题2: 您的  -100 对应 9CFFFFFF
            200  对应 C800   还是:C8000000

       是如何推断出来的?
我的 1000 我就不知道 对应多少了?

       是E803 还是E8030000  还有就是问题1的如何定位这个1000


希望大哥能在百忙中抽空回复一下!!  小弟不才  在此多谢大哥了!!!  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2006-07-20 21:50 心野
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与原程序编译的环境也有关系,即整形用几位表示的问题)。
以上是我个人的见解,有说得不对的地方,欢迎指正!  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2006-07-21 11:57 back

太感谢大哥了! 我一猜 被我给猜中了位置,
经验是:非字符 不一定在绝对的 上下 字符 中间,但绝对大多数是在附近的位置, 耐心点 应该就会有好运!

在请教大哥一问题:

大哥回复中指出:

“甚至可以利用某个伪代码的反编译结果来进行匹配。方法比较灵活。”

我的理解是:比如 pbkill中得到指令“>1000”在硬盘存储位置 1000的附近 应该有 “>”的指令显示方式,

因该有比较严格的对应关系,
比如“>” 对应什么?
比如“<” 对应什么?
比如“=” 对应什么?
--------------------------------
谢谢大哥!!  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2006-07-21 17:46 心野
呵呵,我接触PB程序的机会也很少,所以我也不知道答案。你要是知道了别忘了告诉我一声。  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2006-07-21 20:17 back
先谢谢了  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2006-12-05 23:05 东方
心野
你好,看了你能dot这个软件的破解,我想问问你一些问题,能给我加我的QQ吗,292665104,谢谢  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2007-03-15 10:21 wefo
问下心野,我通过Pbkiller查看出系统的源代码,主要想破解他的连接数限制,代码如下:
long sys_connection = 20 //设置连接数最大限制
if s_count >= sys_connection and li_admin <> 1 then
messagebox("提示:","用户连接数已超过允许数量( " + string(sys_connection) + " 个)!若需增加连接数,请与**软件联系!")
sys_user_xm = ""
sys_user_gh = ""
return
end if
由于本人对反汇编不太了解,Long型的变量是如何转换成十六进制,像20的十六进制按照你的方法换算出来应该为14000000,但是查找了有很多,不知道是在什么位置。想请教下,谢谢。  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2007-11-29 20:28 renwanly
我是个PB程序员,现在角色是个网特:D
之前给大企业做应用程序,也就没有这个问题,现在想自己做个面向如楼上各位的小客户系统就遇到"防反编译"问题,看来任务比较艰巨呀:D
  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2008-04-10 20:33 刘晓光
何谓呵呵后  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2008-10-29 18:37 pb
请问PB中的日期又的格式又是怎样存储的?
比如:2008-1-1  回复  更多评论
  

# re: PowerBuilder程序暴力破解实例(PBD文件编辑法) 2014-02-11 13:14 xcf
这个怎么更改时间
SELECT convert ( char ( 8 ) , getdate ( ) , 112 ) FROM master_companyx using sqlca;
/* SQL Parameters List
0-> :ls_serverdate
*/

if ( not isnull(ls_serverdate)) and ls_serverdate >= "20140228" then
ib_isoverdate = true
else
ib_isoverdate = false
end if
  回复  更多评论
  

只有注册用户登录后才能发表评论。