powerbuilder decomplier 完成基本分析和编程(图8张)

用了十多天,完成了基本编程,bcb编程。主要函数已经完成。目前能对struct和function解析了,win和uo的还在debug。

 

给一个反编译后的代码示意:还差浮点数取值(因为不同编程工具对浮点的规定不同,c++的double并非pb的double,必须取相应的bit规定来得到浮点数,for while循环(jp已经实现,但是要复活成for while还需要点工夫),枚举常量没搞定,搞定的话,就能反编译一般性的function了。不过expression分析部分结构已经很完备,只是一共500多个pcode码,现在只测试出200个。后续将大量测试pb的demos来修正之。当然自己的程序也可以作为测试之用。

 

//看我反编译出来的代码,感觉还比较整洁,说实话,第一次用bcb编程。但是短短几天足以领略c++的高效快速。还有就是一不小心就犯的错,比如在if条件那里对变量意外赋值了,所以保持0x0001 == var1的倒写习惯是多么重要。

 

//object name: lf_111.fun
global type lf_111 from function_object
end type

forward prototypes
global <FUNCTION_OR_SUBRUNTINE> <RETURN_DATATYPE> lf_111(<PARAM_LIST>) <THROWS_OBJNAME> 
end prototypes

global <FUNCTION_OR_SUBRUNTINE> <RETURN_DATATYPE> lf_111(<PARAM_LIST>) <THROWS_OBJNAME>


//Variables List
any a1
int b1 = 32767
int b2 = -32767
long c1 = 655356
long c2 = -655356
longlong d1 = 9223372036854775807
longlong d2 = -9223372036854775807
real e1 = 1120403587
real e2 = 3267887235
string ls_111 = "VVVVVVVVVVVVVVVVVVVV"
char f1 = 'A'
char f2 = 'z'
char f3 = '~r'
uint g1 = 255
ulong h1 = 655357
double j1 = 3.14159265141593
long b
string k1 = ""
string k2 = "this is a box"
string k3 = "this~r~na~h13"
string k4 = "中国中国中国中国中国中国中国中国"
date m1 = 1101-01-11
time n1 = 12:01:01.100002
datetime p1 = datetime(date(1000-07-11),time(12:01:01.000002))
dec q1 = 3.14159202581504
dec{0} q2 = 3.14159202581504
dec{4} q3 = 3.14159202581504
dec{18} q4 = 3.14159202581504
dec r1 = 3.14159202581504
int aaaa
long ll_b
longlong lll_c
dec ldc_d
real lrl_e
ulong lul_f
uint lui_g
dec ax
long ll_bb
longlong lll_cc
dec ldc_dd
real lrl_ee
ulong lul_ff
uint lui_gg
datastore uo_1
boolean lbb_1
boolean lbb_2
long a
string ls_aaa
char bbb
border lbr
border lbr1
border lbr2
border lbr3
border lbr4
border lbr5
border lbr6
border lbr7
//global var: w_win w_win
//global var: w_main w_main
long ll_currentrow
datawindow adw_datawindow
string arg_amt
string arg_format
string right_string

 

//Exprssion  lines: 62
abs(j1 + 1)
beep(10)
blob("111")
b = ceiling(j1)
max(1,2)
min(1,2)
ls_aaa = rightw(ls_aaa,2) + rightw(ls_aaa,2) + rightw(ls_aaa,2)
bbb = char(ls_aaa)
j1 = abs(j1)
j1 = acos(j1)
j1 = integer(j1)
j1 = long(j1)
j1 = longlong(j1)
messagebox("j1",j1)
messagebox("q1",q1)
messagebox("q2",q2)
messagebox("q3",q3)
messagebox("q4",q4)
j1 = messagebox("r1",r1)
lbb_1 = fileexists(ls_aaa)
fileclose(a)
a += (b)
a ++
a --
a += ((1 + 2 + 3) - 4)
a += (b)
a -= (b)
a *= (b)
a = a / 1
a = b + 1 - ((2) / 3) * 4
aaaa = ll_b
aaaa = lll_c
aaaa = ldc_d
aaaa = lrl_e
aaaa = lul_f
aaaa = lui_g
return 65535
return 4.00000000011642
return 4.00000000011642 + 4.00000000011642
uo_1 = create datastore
destroy(uo_1)
lbb_1 = lbb_1 and lbb_2
open(w_win)
open(w_main)
w_win.hide()
w_win.postevent("111",1,1)
w_main.settoolbar(1,true )
w_win.show()
w_win.getparent()
w_main.hide()
w_main.show()
w_main.getparent()
adw_datawindow.setredraw(false )
ll_currentrow = adw_datawindow.getrow()
adw_datawindow.selectrow(0,false )
adw_datawindow.selectrow(ll_currentrow,true )
adw_datawindow.setfocus()
adw_datawindow.setredraw(true )
return ll_currentrow
right_string = string(arg_amt,arg_format)
right_string = left("     ",len(arg_format) - len(right_string)) + right_string
return 1

end function

 

 

//

数组下标操作费了我五个小时调整,已经很完美了,非常完美。

global <FUNCTION_OR_SUBRUNTINE> <RETURN_DATATYPE> lf_111(<PARAM_LIST>) <THROWS_OBJNAME>
//Variables List
string ls_arr0[]
string ls_arr1[10]
string ls_arr2[2 to 10]
string ls_arr3[5,6,7,8]
string ls_arr4[2 to 5,3 to 6,4 to 7,5 to 8]
string ls_local
long ll_local
//global var: string gs_array[2]
//global var: string gs_array2[5,5]

//Exprssion  lines: 14
ls_local = ls_arr0[3]
ls_local = ls_arr1[5]
ls_local = ls_arr2[5]
ls_local = ls_arr3[1,2,3,4]
ls_local = ls_arr4[3,4,5,6]
ls_local = gs_array[2]
ls_local = gs_array2[2,2]
ls_arr0[3] = ls_local
ls_arr1[5] = ls_local
ls_arr2[5] = ls_local
ls_arr3[1,2,3,4] = ls_local
ls_arr4[3,4,5,6] = ls_local
gs_array[2] = ls_local
gs_array2[2,2] = ls_local

end function

 

//20090904: 完成了function头部申明信息:返回数据类型,参数列表,throws类型。基本完成一个简单function的解析了:

//object name: lf_333.fun
global type lf_333 from lf_333
end type

forward prototypes
global function int lf_333(int param1,ref int param2,readonly int param3,readonly int param4) throws exception
end prototypes

global function int lf_333(int param1,ref int param2,readonly int param3,readonly int param4) throws exception;
//variables list
//param:int param1
//param:int param2
//param:int param3
//param:int param4
int li_aaa
long ll_bbb
string ls_aaa
nonvisualobject uox
nonvisualobject uoy
nonvisualobject uoz
int li_ccc[2,2,2]  = {1,2,3,4,5,6,7,8}

//exprssion  lines: 23
li_aaa = integer(getcurrentdirectory() + "aaa" + "bbb" + string(1997))
uox = create nonvisualobject
uoy = create nonvisualobject
uoz = create nonvisualobject
li_aaa = 1 + 2 + 3 + 4 + 5
li_aaa = ((((1) - 2) - 3) - 4) - 5                                   //括号部分后续优化之。
li_aaa = ((((1) * 2) * 3) * 4) * 5
ll_bbb = ((((1) / 2) / 3) / 4) / 5
li_aaa = integer(ll_bbb)
li_aaa = abs(li_aaa)
li_aaa = ll_bbb
ll_bbb = 1 + 2 + 3 + 4 + 5
ll_bbb = ((((1) - 2) - 3) - 4) - 5
ll_bbb = ((((1) * 2) * 3) * 4) * 5
ll_bbb = ((((1) / 2) / 3) / 4) / 5
ll_bbb = long(ll_bbb)
ll_bbb = li_ccc[1,1,1]
li_aaa = lf_count(li_aaa,li_aaa,li_aaa,ls_aaa,ls_aaa,ls_aaa)
li_aaa = lf_count2()
li_aaa = lf_count3()
li_aaa = lf_count4()
li_aaa = lf_count5()
return 1

end function

 

 

//20090905:今天很好地处理了枚举变量的初始值和赋值(取)

//object name: lf_333.fun
global type lf_333 from lf_333
end type

forward prototypes
global subroutine  lf_333() throws exception
end prototypes

global subroutine  lf_333() throws exception;
//variables list
alignment la_1 = left!
alignment la_2 = right!
alignment la_3 = center!
alignment la_4 = justify!
band lb_1 = header!
band lb_2 = detail!
band lb_3 = footer!

//exprssion  lines: 7
la_1 = left!
la_1 = right!
la_1 = center!
la_1 = justify!
lb_1 = header!
lb_1 = detail!
lb_1 = footer!

end function

 

//20090909:搞定了内嵌sql单行取值,并与变量直接绑定。pic6

 

//20090912: 完善了sql语句格式内嵌语式的参数绑定。

 

//20090915:完成最困难的win和uo,menu等文件格式的解析。工作接近收尾。图pic8

 

附图6张:

 

pic1: 

powerbuilder decompiler by chengg0769

 

pic2: 

powerbuilder decompiler chengg0769

 

pic3:

 pb decomplier by chengg0769

 

pic4:

decompiler chengg0769

 

pic5:

decompiler chengg0769

 

pic6:

 

pic7 趋近完美的内嵌sql,含参数对应。

 

pic8: 完成win,men,uo等格式解析,接近收尾

 

 

配套光盘使用说明 (1) 本光盘是《PowerBuilder数据库开发经典案例解析》的配套光盘,与书一起发行,不得单独出售。 (2) 本光盘的主要内容包括各章示例程序的代码及数据库文件。光盘的说明文件为Readme.txt,就是本文件。 (3) 示例程序是按照它们出现的章顺序编排的。 (4) 光盘上的示例程序都是在PowerBuilder 9.0和SQL Server 2000个人版下调试通过的,不同的版本可能存在差别。另外,使用的操作系统是Microsoft Windows 2000(Professional,Server),原则上,操作系统对程序没有影响,不过,作者没有在其他操作系统平台上调试这些程序。在配套光盘上,作者提供了示例程序的源代码。另外需要注意的是,作者建议读者重新编译所有示例程序,进而熟悉它们的结构和基本功能。 (5) 要运行本光盘各章节“代码”目录下的程序,需要安装SQL Server 2000,并建立起相应数据库。各个实例的数据库文件存放在相应“建库脚本”目录下,有两种方法建立数据库。一是在SQL Server的企业管理器中点击“数据库”右键,单击【所有任务】|【附加数据库】菜单命令,选择相应的数据库文件(扩展名为mdf),单击确定按钮就可以了;另一种方法是通过SQL Server的企业管理器的恢复数据库功能,从数据库备份文件恢复,备份文件的扩展名为bak。 建立数据库后需要建立ODBC连接到数据库,建立的方法可以参考书第一章1.6.4小节中的小知识。第一章程序通过INI文件直接连接数据库,后面各个实例对应的ODBC数据源名称分别为:hrmlink、mrplink、caiwulink、liblink、hotellink、hislink和eislink。 (6) 如果安装了PowerBuilder 9.0,则不需要安装其他软件,否则需要单独拷贝“运行程序所需文件”目录下DLL文件到“C:\WINNT\SYSTEM32”下面。 (7) 第五章至第八章实例运行前,需要拷贝相应的“ICON目录”到该实例运行的目录底下,完成第(5),第(6)和第(7)点后,实例程序就可以正确运行了。 (8) 光盘的所有文件都被默认地设置为只读文件,而所有程序在重新编译时都必须重新创建这些文件,所以在重新编译之前必须将所有文件修改为可写。 (9) 本光盘上所有程序都只供学习之用,未经作者许可,它们不得用于任何商业目的。 (10) 清华大学出版社几位编辑同志在本光盘的出版过程中付出了辛勤劳动,他们对本光盘的出版给予支持,在此对他们的工作表示感谢! 由于时间仓促,光盘中示例程序出现错误在所难免。发现其中的问题后,如果方便,麻烦读者告知作者。另外,如果您要对本书内容的修改提出建议,也麻烦您告知作者(email:ilikeit@126.com)。 谢谢使用本光盘! 作者 2004.8
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值