Help in English 更新列表 正式版额外的说明 DEMO版如何保存DATAWINDOW
PB反编译专家 SHUDEPB 使用说明
感谢小礼,FeiLuo,ZhangYe,LY,两位不愿透露名字的朋友,BIN.HU,David,Wing的帮助。
我们约定,以下说明中,带引号的粗体字是一个完整的菜单操作,它依据您的语言定义,可能在文字上有不同,它以中文版为准。
一.您需要事先准备
您所得到ShuDePB的版本(DEMO或A版本),是一个三层结构程序的客户端,部份关键计算,需要连接到我们的网站进行(我不清楚您明不明白这句话是什么意思.但,我所知道的,至少有几百个人不明白是什么意思).它官方的服务器在 http://www.shuct.net/shudepb/ .
您需要确保您所使用的计算机可以通过80端口访问我们的网站.请首先在程序中配置您的网络连接,如果需要额外的代理服务器,请进行配置,否则以WINDOWS默认设置.
我们假定,您已经具备PB最基本的知识.起码会写一个有模有样的HELLO WORLD.
Datawindow的导出,完全借助PB自带的方法,您需要自备PB对应版本的几个DLL,放在对应的子目录中,参见支持文件列表
二.文件菜单.
1.文件类型.
程序所使用的文件类型为*.spb,它是一个文本文件,仅包含一个PBD/DLL/EXE(以下仅简称PBD)的搜索列表,告诉程序需要去哪里寻找PB的PBD文件,文件列表中PBD是有序(大致相当于一个PB8.0以上的*.PBT文件,它的排列方法参见后文),如果前后两个PBD中都包含有一个叫
W_MAIN的窗口,反编译过程中,如果程序需要用到w_main,相关的反编译信息将以搜索列表中查到的第一个为准.它的准则和PB的SetLibraryList函数是一致的,如果您不知道这个函数的意义,您可能需要一本PB入门的书,花一两天去学习它,再重新使用这个程序.
2.添加PB文件
普遍情况下,PB的程序是以一个EXE为入口开始的,请首先"菜单->文件->读取EXE文件",如果它是由PB产生的,将显示一个的图标(PB5.0是
,PB6.0是
,PB7.0是
,PB8.0是
,PB9.0是
,PB10.0-PB10.02是
,PB10.5是
,PB11是
,PocketPuiler2.0是
),shudepb可以得到它正确的信息,自动导入相关的其它PBD。如果是由其它语言编译的,将显示一个
的图标,shudepb将无法正确得到它的信息.
您得到的这一信息,它只是编译这个EXE的程序员编译时的列表,通常情况下,跟据一个项目的大小,项目组或程序员的习惯或项目组织架构,它经常会加入另外程序员或另外项目的PBD,您需要"菜单->编辑->全局搜索""SetLibraryList"函数(参见后文),以取得完整的搜索列表.再"菜单->文件->添加PB文件"或"菜单->文件->设置PB文件搜索列表"(留意,列表是有序的)
3.反编译.
一个PBD下,会有若干项,程序会依据继承关系,找到它最初始的祖先,它们可能是
Application,
datawindow,
window 等等,如果它显示的图标中,包含
,表明您当前设置的列表中缺少PBD文件,程序无法一层层找到它的祖先,此情况下,它反编译出来的结果经常不完整,假定它是
w_test(w_child),您需要"菜单->编辑->全局搜索"SetLibraryList函数(您至少需要PB的入门知识来分析这个函数的参数)或用WINDOWS资源管理器查找一下包含文字w_child的PBD/EXE/PBL/DLL文件.把它加进来.如果找不到,您可以确信,该PB程序运行过程中不需要w_child这个对象,它不在发布版本中,忽略它。(除非程序员特别处理过,您可能需要向当时的程序员询问方法,我只知道其中几种简单的办法,但显然不是全部).
双击一个对象(*.bin\picture\datawindow的导出方法参见下文),程序会反编译它(DEMO版有长度限制,另外,反编译的结果因后文说明的选项可能略有不同),您可以查看它的代码,选中它,您可以"菜单->文件->导出"为*.sr*文件,再IMPORT(这是PB
IDE中的操作,普遍的PB开发界面中,它在右击一个PBL时的菜单中)进入PBL中,您也可以选中一个PBD对象,全部导出它们。
*.bin文件是PB开发过程中使用到的OLE/OCX对象的信息,它会在导出相关文件时一并导出,您不用单独理会它(DEMO版不提供此功能).
PICTURE文件DEMO版不支持导出。您也可以使用网上提供的其它功能强大的免费的反编译程序。
Datawindow的反编译,使用了PB自带的功能.正式版,请直接将整个PBD另存为PBL.
DEMO版或其它原因下,选择datawindow项,"菜单->文件->DATAWINDOW保存为PBL"
4.另存为PBL.
选中一个PBD项,"菜单->文件->另存为PBL" 可以直接保存,留意,DEMO版不提供此功能。因为SHUDEPB出于阅读习惯上的需要,对一个对象的函数和事件列表作了另外的排序,导出时没有重新计算,导出的PBL在PB IDE中显示次序大部份情况下会出现错乱,您需要"PB开发环境->菜单->Window->Library Painter","PB开发环境->菜单->Design->Migrate"它们,或REGENRATE它们(如果您认为有必要,可以参考PB的入门教程).
PocketBuilder(以下简称PPB)的程序使用此功能时,请选择文件类型为*.pkl.同时,保存为PBL时直接导入Datawindow仅限PB,PPB的不可用(正式版也不可以),请使用"菜单->文件->导出DW(For PocketBuilder)"
5.Datawindow保存为PBL(此功能仅限PB)
DEMO版不提供PBD->PBL的功能,但允许导出DATAWINDOW,它调用PB的程序,需要PB的DLL文件支持,参见支持文件列表.正式版请直接用4,"另存为PBL".
6.导出DW(For PocketBuilder)
我现在想不出一个办法在PPB中导出DATAWINDOW到PKL中,所以PPB中的DATAWINDOW请用这个功能直接导出为*.SRD文件,再由PPB导入.
SHUDEPB中,选中一个PBL,另存为新的PBL.一般情况下,小故障是没问题的啦.
三.编辑菜单
1.查找,转到
仅对应当前选中的对象,方法参考 "Windows->开始->程序->附件->记事本".
2.全局搜索
您可以在当前PBD文件列表中查找包含的文字,它的功能比部份不支持双字节的PB IDE版本略强,可以查找汉字。可以双击找到的结果直接跳转过去。留意,一个代码语句被找到的前提是,它被计算过。计算,它可能的途径是,"菜单->文件->导出"过 / "菜单->文件->另存为PBL"过 / 您主动双击展开一个对象过 / "菜单->编辑->展开所选项"过 /"菜单->编辑->展开所有项"过.
3.展开所选项,展开所有项
对所选的项和它的子项全部进行一次计算,方便您"菜单->编辑->全局搜索",留意,依据当前工程的大小不同,可能消耗的时间不同,对于一个上百M的大工程,它可能需要您几十分钟的时间。
4.收起所选项,收起所有项
把它们收起来,使用界面不会太零乱,但它不会使计算结果消失。
四.工具菜单.
1.SelectLanguage
选择您需要的使用语言。
程序作者授予您翻译程序菜单,按钮语言的权利,但应以不改变原义为限。同时,这个权利仅限在INI文件中,不包括使用许可和版权声明页.
您可以在shudepb.ini中修改您的菜单文字或加速键.您也可以在shudepb.ini文件中手工创建您自己的语言,节名必须以 "Language_" 开始,如果需要使用到的语句没有被翻译到,它将会写入默认的英文。
修改语言项,需要重新运行程序以加载菜单.
2.网络服务器
请使用默认的网络服务器,正式版的用户在必要时我们会通知您备用服务器地址。如果您需要有别于WINDOW全局设置的代理服务器,请填写相关信息。
3.生成时产生行号(原行号)
会生成程序代码编译时的行号,主要用于在使用旧程程序时,PB出现,某某对象某某行有错时,快速定位.
4.生成时产生行号(当前行号)
主要用于正式版,重新IMPORT时,PB如果提示某行有错,快速定位.
5.生成时注释掉所有代码/错误时,把函数注释掉
用于正式版,批量生成PBL排错时的选项
6.混淆过的代码需要原始信息
PB程序经POWERSHIELD处理后,部份有用信息丢失,出来的代码仅保证程序执行过程一致,并非严格按照原来程序员的语法次序,这个选项可以提供给您更多的信息,当然它的要求对普遍的用户面言比较高.(现在这个功能需要用到的机会已经很少了)
7.省略 "USING SQLCA"
PB编译时,如果一个SQL语句没有用USING SOME_TRANSACTION,会自动加上 USING SQLCA,这个选项下,可以使编译出来的代码符合一部份用户的阅读或编程习惯.
8.反编译使用->(方法1/方法2)
方法1是正常的分析处理,方法2,借用了FOR POWERSHIELD的逻辑分析方法(这是我完全另外写的一整个流程处理),可以相互对照和排错.(现在这个功能需要用到的机会已经很少了)
9.PowerShield分析...(这个选项对DEMO版基本是没用的)
这是1.830加入的功能.POWERSHIELD处理后的代码,大量逻辑特征被清除.反编译的结果,道理上是正确的,但许多情况下,可读性很差.这里使用穷举法,分析正常逻辑时,记录下逻辑特征(会多占1%-3%的CPU),在分析POWERSHIELD处理过的代码时,尝试使用之前保存的逻辑特征,以期命中更自然的语法习惯.因为使用穷举,单独的一两个用户或一二十个用户命中的机会就很少,会借用服务器匿名中转,上传和下载.以共享各个用户的分析结果.
这个选项下,仅记录逻辑特征,并不涉具体的语句,常量或变量.
上传/下载需要另外发布的程序,仅供正式版用户使用.
10.分析PocketBuilder 2.0时使用的类库...
PocketBuilder2.0/2.04使用完全不同的函数,属性库.我无法仅由PKD分析出到底是哪一个版本,只能由用户手工调整,看看哪个对.
11.保存修改的代码...
允许您在SHUDEPB中直接修改代码并在导出或另存为PBL时体现出来.
12.复制对象到新的PBD.
许多情况下,我们并不想要或不需要发布PBD中的所有对象,可以使用此功能从而仅发布必要的东西(当然,这个主要的用途不在这里.)
13.提示之前版本的错误......下的每个选项(仅正式版,并且使用过较早版本的用户才需要)
几个版本的更新,当出现之前版本的逻辑分析错误时,可以帮您命中之前版本分析可能出现的错误,不需要整个工程上百M地重新做,可能只需要修改一两行.
五.说明
这是一个长时间的计划,起于03年,05年初用PB完成大致的功能,后来用VC改写了一年(因为不是经常有时间)。严格意义上,它只是我另一个程序的副产品,可惜那个程序可能永远不会出现了,入行几年,锐气都磨光了。
比先前出现过的反编译器有几个进步。
1.可以反编译出几乎所有的SQL.
2.并非孤立地看一个对象,从整个LIBRARYLIST进行搜索,对象的引用、继承上可以更精确地命中。
3.对象可以导出为PB接受的*.sr*.
4.可以反向生成structure
5.可以直接生成pbl,但有BUG,函数和事件的次序错乱,需在PBL中IMPORT第3点中导出的*.SR*.(如果没有PBL就直接导入,手工工作量相当大,因为PB会提示这个没有那个没有)
6.全面支持PB6\7\8\9\10\10.5(可以随时加入对PB11.0的支持,但许多原因下,没有打包进来).
不能完成的任务
1.对1.7G的PB程序(共424483个函数\事件)进行批量测试,有297个函数\事件出现非预期结果(非预期结果就是错误的,但预期结果并非就一定正确,因为不可能人工一一核对),其中2/3强是由于引用的对象不在同一PBL中,如果包含了正确的LIBRARYLIST,它们将是正确的。剩下的大部份,通过人工的方式可以匹配到(因为是DEMO,方法就不列出啦,前面的2/3当然更可以),如果由程序完成,将需要大量改写,所以不再尝试。余下的37处错误程序无法命中。
2.DEMO不对打包的资源进行EXPORT(其实在03年我就已经发布过EXPORT资源的程序在一个PB的论坛上)
3.DEMO的限制,只生成一部份,而非全部程序,还有另外小部份功能的限制,并且需要网络辅助计算。
本来想修正了以上的错误后才发布程序,可是已经拖得太久了,从前错误地把冲动当做是自己的能力,有能力的时候,时间没了,能力和时间都有了,精力没了。
PDW0505\PDW0505.exe
PDW0606\PDW0606.exe
PDW0700\PDW0700.exe
PDW0800\PDW0800.exe
PDW0900\PDW0900.exe
PDW1000\PDW1000.exe
PDW1050\PDW1050.exe
PDW1100\PDW1100.exe
PPW0200\PPW0200.exe
它们是用PB写的程序,需对应版本的PB运行库支持,请自备
PB5.0:
PDW0505\PBBGR050.DLL
PDW0505\PBDWE050.DLL
PDW0505\PBROI050.DLL
PDW0505\PBRTE050.DLL
PDW0505\PBRTF050.DLL
PDW0505\PBSHR050.DLL
PDW0505\PBTYP050.DLL
PB6.5:
PDW0606\libjcc.dll
PDW0606\Pbdwe60.dll
PDW0606\Pbvm60.dll
PB7.0:
PDW0700\libjcc.dll
PDW0700\Pbdwe70.dll
PDW0700\Pbvm70.dll
PB8.0:
PDW0800\libjcc.dll
PDW0800\Pbdwe80.dll
PDW0800\Pbvm80.dll
PB9.0:
PDW0900\libjcc.dll
PDW0900\Pbdwe90.dll
PDW0900\Pbvm90.dll
PB10.0-PB10.02:
PDW1000\libjcc.dll
PDW1000\pbdwe100.dll
PDW1000\pbshr100.dll
PDW1000\pbvm100.dll
PB10.5:
PDW1050\libjcc.dll
PDW1050\pbdwe105.dll
PDW1050\pbshr105.dll
PDW1050\pbvm105.dll
PB11CTP-PB11BETA2:
PDW1100\libjcc.dll
PDW1100\pbdwe110.dll
PDW1100\pbshr110.dll
PDW1100\pbvm110.dll
PocketBuilder2.0-2.03:
PPW0200\PKBGR20.DLL
PPW0200\PKDWE20.DLL
PPW0200\PKVM20.DLL
2005-2010 Shu<KenShu@163.net>
保持所有权利.