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> 保持所有权利.