最近,我偶然发现了一个使用Sybase PowerBuilder 12.5构建的二进制文件,并且我寻求任何帮助来恢复它,因为它实际上与典型的C ++二进制文件完全不同。我对了解PBD文件的文件格式特别感兴趣,该文件格式似乎可以容纳大部分(如果不是全部)内容。我的目标是能够检索特定变量的值并进行一些基本的静态分析。

搜索似乎表明这不是一种流行的二进制类型,因为我对它们不了解太多,因此,我将在此处记录我的一些笔记,以期对我有所帮助。 ,它基本上从发布程序的FN_RunExecutable中调用PBVM125.dll。在PBVM125.dll内,FN_RunExecutable将初始化程序。该dll似乎是主要的库,因为它导出了许多功能,与核心.NET dll有点类似。这些PBD文件似乎包含对象和变量的名称。名称使用Unicode,其中一些对象后跟附加的字节,并以“ DAT *”作为前缀:



这是PBD文件内容的另一个示例:



尽管这些字符串中的许多似乎都引用了组件或变量,但到目前为止,我还没有找到它们的相关值。应用程序中有一个.db文件。使用十六进制编辑器(数据库文件不是SQLlite数据库-我怀疑它是Sybase格式),我在其中看不到任何这些字符串。每次打开应用程序时都将访问此数据库文件。

在任何情况下,如果具有PowerBuilder经验的人员(或任何人)可以帮助您理解PBD文件格式以从中提取数据,它将大大加快了我的项目。

,谢谢,

更新1:
参考Sybase文档,PowerBuilder应用程序在某种程度上类似于.NET。 PBVM125.dll实际上是解释PBD文件的虚拟机,从而使代码独立于平台。 PBD文件是由VM执行的对象的集合。在描述PBL文件(即带有源代码的PDB文件)的格式时,此参考使我非常接近目标。我将使用此信息来尝试从文件中获取值。

#1 楼


我对了解PBD文件的文件格式特别感兴趣,PBD文件似乎可以容纳大部分内容,即使不是全部。我的目标是能够检索特定变量的值并执行一些基本的静态分析。也是PowerBuilder的一个版本,可以生成.Net程序集-我只说PB Classic),因为源代码被编译成由位于PBVMxxx.dll中的VM运行的字节码(由PB版本替换xxx,例如90、100或125)。过去曾经有Mac,Solaris或AIX VM,但是如今仅保留Windows VM。

每个PB对象(结构,窗口,可视或非可视对象,菜单等)都被编译为相应的二进制文件(如.java)被编译成.class,该文件保留了一个扩展以告知其性质(例如,对象.sro-> .obj,菜单srm-> .mnu,结构srt-> str,...)以及所有对象存储在.pbd文件中(使用开发环境时,您使用的是.pbl(= PB库),其中也包含源代码“文件”。)。

.pbl和.pbd文件具有相同的树结构,包括所包含文件的目录和数据块的链接列表。看起来像是老玩家的游戏资源文件。 :o)

类格式和库都没有正式记录,但是库结构已被颠倒并发布。基于此,我做了一个可以提取包含对象的转储程序。

我还没有完成关于类格式反转的工作,但是您可以注意到,它保留变量和对象名以及语句行号,因此可以检索编译后的字节码几乎完全相同的源代码(您只需松开注释),我已经看到一些中国的商业反编译器。