powerbuilder pbd文件保护方式-pb防止反编译研究

时间:2021-09-06 19:47:22

pb中编译后的变量名是于明码方式放置并形成一个列表。如:

ls_111.ls_222.ls_333.ls_444

如上,"."代表的是0x00,就是分隔符号。

紧跟变量列表后面,有一个数据结构来表明变量的顺序(也就是变量ID:ls_1就是0,ls_2就是1,依次类推,也就是说,对vm而言,变量的名字无关紧要,学过编程我们也晓得,变量只是有类型的地址段而已。)和类型。而它只标明变量的开始位置,反编译软件就是取得开始位置,结束位置为0x00,所以就能把代码中的变量名显示出来。

 

最新Powerbuilder混淆器加密器下载:

http://chengg0769.download.csdn.net/

 

 

其表达式在对象内引用时,实际上对变量名是采用变量ID。如1A 01 05,代表引用ID为5的变量。

以下贴的就是变量列表部分

000014f0h: 00 20 20 20 20 20 20 20 00 70 61 72 6D 31 00 70 ; .       .parm1.p
00001500h: 61 72 6D 32 00 61 61 61 61 61 61 61 61 61 61 61 ; arm2.aaaaaaaaaaa
00001510h: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 ; aaaaaaaaaaaaaaaa
00001520h: 61 61 61 00 61 61 61 62 62 62 62 62 62 62 62 62 ; aaa.aaabbbbbbbbb
00001530h: 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 ; bbbbbbbbbbbbbbbb
00001540h: 62 62 00 6C 73 5F 61 61 61 61 61 61 61 61 61 61 ; bb.ls_aaaaaaaaaa
00001550h: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 00 ; aaaaaaaaaaaaaaa.

那我们就可以采用这样的方式来防止反编译:

 

1. 把变量位置的字符全部抹掉为0x00.这样反编译出来就无法显示。

000014f0h: 00 20 20 20 20 20 20 20 00 70 61 72 6D 31 00 70 ; .       .parm1.p
00001500h: 61 72 6D 32 00 00 00 00 00 00 00 00 00 00 00 00 ; arm2............
00001510h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00001520h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00001530h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00001540h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00001550h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................

反编译后:
integer
long
string  = "123"


integer(?????)
long(?????)

 

 

2. 把中间部分字符改为0x00,使得反编译时字符自动截取:

000014f9h: 70 61 72 6D 31 00 70 61 72 6D 32 00 61 61 61 00 ; parm1.parm2.aaa.
00001509h: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 ; aaaaaaaaaaaaaaaa
00001519h: 61 61 61 61 61 61 61 61 61 61 00 61 61 61 00 62 ; aaaaaaaaaa.aaa.b
00001529h: 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 ; bbbbbbbbbbbbbbbb
00001539h: 62 62 62 62 62 62 62 62 62 00 6C 73 5F 61 61 61 ; bbbbbbbbb.ls_aaa
00001549h: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 ; aaaaaaaaaaaaaaaa
00001559h: 61 61 61 61 61 61 00                            ; aaaaaa.

反编译后:

integer aaa
long aaa
string ls_aaaaaaaaaaaaaaaaaaaaaaaaa = "123"


aaa = integer(ls_aaaaaaaaaaaaaaaaaaaaaaaaa)
aaa = long(ls_aaaaaaaaaaaaaaaaaaaaaaaaa)
return (aaa + aaa)

 

3. 也可以改其他字符,如127(7F),或者0x01-0x20和0x1F这些字符都可以,因为无法正常查看。利用文件控件包括notepad无法正常显示的缺点使得代码不可读。

000014f0h: 00 20 20 20 20 20 20 20 00 70 61 72 6D 31 00 70 ; .       .parm1.p
00001500h: 61 72 6D 32 00 01 02 03 04 05 06 07 08 09 0A 0B ; arm2............
00001510h: 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B ; ................
00001520h: 1C 1D 1E 00 61 61 61 62 62 62 62 62 62 62 62 62 ; ....aaabbbbbbbbb
00001530h: 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 ; bbbbbbbbbbbbbbbb
00001540h: 62 62 00 6C 73 5F 61 61 61 61 61 61 61 61 61 61 ; bb.ls_aaaaaaaaaa
00001550h: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 00 ; aaaaaaaaaaaaaaa.

反编译后:

long aaabbbbbbbbbbbbbbbbbbbbbbbbbbb
string ls_aaaaaaaaaaaaaaaaaaaaaaaaa = "123"

declare  

cursor for
;

= integer(ls_aaaaaaaaaaaaaaaaaaaaaaaaa)
aaabbbbbbbbbbbbbbbbbbbbbbbbbbb = long(ls_aaaaaaaaaaaaaaaaaaaaaaaaa)
return ( 

+ aaabbbbbbbbbbbbbbbbbbbbbbbbbbb)

 

当然要说清楚,从pbkiller上拷贝来的代码,贴在ue中还是可以用hex方式查看的。

 

4. 改成关键字,如if...then ,while,create,open,destroy等。这样使得代码无法阅读。

000014f0h: 00 20 20 20 20 20 20 20 00 70 61 72 6D 31 00 70 ; .       .parm1.p
00001500h: 61 72 6D 32 00 69 66 20 74 75 72 65 20 74 68 65 ; arm2.if ture the
00001510h: 6E 0D 0A 09 69 66 20 74 72 75 65 20 74 68 65 6E ; n...if true then
00001520h: 0D 0A 09 09 09 69 66 20 74 72 75 65 20 74 68 65 ; .....if true the
00001530h: 6E 0D 0A 0D 0A 62 62 62 62 62 62 62 62 62 62 62 ; n....bbbbbbbbbbb
00001540h: 62 62 00 6C 73 5F 61 61 61 61 61 61 61 61 61 61 ; bb.ls_aaaaaaaaaa
00001550h: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 00 ; aaaaaaaaaaaaaaa.

 

反编译后:
integer if ture then
 if true then
   if true then

bbbbbbbbbbbbb
long  if true then

bbbbbbbbbbbbb
string ls_aaaaaaaaaaaaaaaaaaaaaaaaa = "123"

 

if ture then
 if true then
   if true then

bbbbbbbbbbbbb = integer(ls_aaaaaaaaaaaaaaaaaaaaaaaaa)

 if true then

bbbbbbbbbbbbb = long(ls_aaaaaaaaaaaaaaaaaaaaaaaaa)
  return (if ture then
 if true then
   if true then

bbbbbbbbbbbbb +  if true then

bbbbbbbbbbbbb)

 

当然,类似的,也可以把ls_111 = "abc"通过修改ls_111部分。类似c的宏替换一样,把它混淆成:

aaa=100

bbb=200

ccc = "abc"这样。只要把字符串"ls_111"通过ue修改为“aaa=100 0x0A回车 bbb=200 0x0A回车 ccc ="即可。

 

*我现在还没仔细研究pbd混淆器工作原理。但是这个方法的确可以混淆代码的。除非反编译器把字串中的关键字和空格,不可见字符干掉(就是这个方法),不过非常麻烦。

 

但是,反编译软件其实也可以把这些不可显示字符变为例如:ls_1,ls_2...ls_n这样的无意义变量代号。只是可读性就不好了。对于含部分不可显示字符或者0x0A,0x0D这样的影响显示的字符,它也可以替换之(只保留字母和数字等可显示字符)。

 

*这个世界总是有矛又有盾的。因为只要是可以再现和有规律可行的事物,人就可以分析。