
《 PB 混淆加密大师》 2012 最新版使用引导
保护 PowerBuilder/PocketBuilder 编译后的 PBD,DLL,PKB 文件不被反编
译和破解,支持 PB5 至 PB12.5 , PKB2.5 等众多版本
本文档对该软件做简单的介绍和操作引导
MAIL: chengang0769@gmail.com
chengang0769@21cn.com
MSN: chengang0769@live.cn
QQ: 27-3939-617
2012.08.06
http://www.mis2erp.com
http://blog.csdn.net/chengg0769
http://www.mis2erp.com/soft/PBobfuscator.rar
本文档请勿用于对本软件解释说明之外的其他场合,版权所有

一 . 软件截图
返回目
录

二 . 基本原理
返回目录
什么是混淆器,什么是 PB 混淆器?为何要使用混淆器?
在编译型语言中,高级语言总被直接编译成汇编码,然后再到机器码,所以比较低阶,除了反汇编外,基本无
法分析程序。而在 PB 和早期的 VB ,现在的 Java , C# 等都是相当高等级的带“动态特性”的语言,他们利用虚拟
机技术或者层次更高的解释技术,将高级代码先编译成一种精简的中间执行码,然后被解释执行。与纯解释执
行的 vbscript 等相比,少了重复 n 次的扫描和分析,所以认为比较快。
在 PB 中,比如:
long ll_temp
ll_temp = 100+100
这个最简单的算式,编译器先确定右边是两个字面量的数字类型相加 ( 此处仅举例,也可能在编译时就事先加为
200( 看是否优化 ) ,如果是 ll_temp =100+ 变量, 100 就一定会编译到执行码里面 ) ,在 pb 中默认的数字类型是 l
ong
型,浮点小数是 double 型。当然也有其他的认定比如把 10 赋值给一个 int 型 (16 位 ) ,则字面量可能被确定为 int
或
者 uint ,这个是编译器自行判断,通常编译器都分得很细,针对每种语言界定的意义都有相应的表达方式。如上
等式,编译后的形式大致为 :
A .取值 /long 型 /100;
B 。取值 /long 型 /100;
C 。相加 /long 型加法;
D 。数据类型转换 ( 不是必须 , 但类型不同的数或者变量,必先做类型转换 ) ;
E 。赋值 ( 将值或者地址 / 指针赋值给变量 )
也许编译后的代码举例是:( HEX )
10 00 01 00 // 取某个变量,代号为 01
20 00 // 取 long 型字面量(长度 16 位的码)
64 00 00 00 // 字面量 0x64 ,就是 100(long 占用 4 位,并存在本地,如其他类似 C , C++ 中的指针类
// 型,基于处理方便的原则,本地只保存 4 位指针 ( 或叫地址 ), 而实际内容保存在一个固定
// 的段内。比如 longlong 类型 (8 位 ), 或者浮点数,金融数,字符串,数组等都是长度不确
// 定的,有个专门的结构来表达他们,而在代码内,只存放指针,操作时,因为知道数
// 据类型,也就知道在何位置,如何存取相应的部分。
// 所以取 long 的这种代码结构可以用于取任何数据。

基本原理 续
返
回目录
20 00 // 取第二个数字
64 00 00 00 // 第二个 100
50 00 //long 型相加
5F 00 00 00 // 赋值
这就是大概意义上的 P-Code 码。实际过程中,因为涉及到数据类型的转换或者提升,有许多的辅助代码。比
如 long 和 int 相加,要提升 int 为 long 型后再相加。这是一个常识。当然还有其他与 C , C++ 一致的要求,就是
语
法,比如优先级,这在 P-code 中也有实际的实现,否则就不成其为一种语言了。由于数据类型众多,而且 PB
对内嵌的 SQL 等支持很好,所以码表极多。如 longlong 类型和 byte 类型, try 。。。 catch 都是在发展的过程中
添
加进来的。这样,到目前 pb12.5 为止,据统计,码表已经达到 600 多个。从 PB5-12 和 PBK2.5 总计码表 6000
余。每个码都各司其责,完成指定的具体任务。
不管是机器码还是 P-code ,都为执行码 + 数据,数据的长度由前面的执行码决定。有的没有数据,有的有多个
byte 的数据。如上第一行, 01 00 为变量的代号,占 2 个字节。因为一个字节 (255 个 ) 不敷表示。
对于执行码与数据混合的这种形式,我们知道不执行前面的码,就无法预知后面某个位置的某个 byte 到底何
用。也就是我们无法区分某个 byte 到底是执行码还是数据。一切都必须从第一个码开始执行,同样的,反编译
是一个根据码表和数据反向解析和得到源码的程序,他是一个模拟的虚拟机,不过它执行的结果不是数据运算
结果,而是得到我们的意图,我们程序员所写的源码。在机器码编译时,由于 CPU 只有在执行比较简单的任务
才会得到较高的效率 ( 加减,移位,异或,取反,判断溢出等 ) , CPU 无法执行一个调用 SQL 的过程,但是在
p-code 中,调用 SQL 可以被编译成一个 p-code 码,然后再由虚拟机中的函数来具体处理,它的灵活性很高,能
处理高阶的逻辑。所以硬件码都比较低层,而且近似数字处理的机械过程。而 P-code 不一样,它与源码有直接
的对应关系。除了逻辑判断会有多种表达式用相同的实现而无法真正还原源码的写法外,就一个简单的
a = b+c 这样的算式来说,与源码是一一对应的。这也是现在 PB 反编译和 Java , c# 的代码可以反出来一摸一
样,令我们瞠目结舌的缘故。我们知道这点对为什么要使用混淆器来保护我们的 PB 代码就有认知了。
- 1
- 2
- 3
前往页