http://www.dwox.com/PBL_File_Format.txt
+--------------------------------------------------------------+
I PBL File Format 2003 - 2010 I
+--------------------------------------------------------------+
Dear PB Fans out there,
these are the results of the analysis I did, written down as
a short ASCII text description (valid thru PB5-11.5).
With this knowledge you can write your own LibraryDirectory
or Export Function for PowerBuilder PBL/PBD/DLL/EXE files.
Think about the possibility; including files via PBR assignment
and extracting them during runtime. That is a nice gimmick.
Most of the terms used are the results and presumptions of my
analysis.
Thanks to:
- Kevin Cai for Bytes 17-18 of the Node-Block
- Jeremy Lakeman for Bytes 19-20, 23-24 of the Node-Block
Regards
Arnd Schmidt May 2010
+--------------------------------------------------------------+
I PBL File Format I
+--------------------------------------------------------------+
Rules and facts:
1.) A PBL is always made out of blocks of 512, except the Node
Block (NOD*), that has a size of 6 blocks, meaning 3072 Bytes.
2.) There is always one Header (HDR*) block,
followed by a free/used blocks bitmap (FRE*).
Then follows the first 'NOD*' block .
Theoretically this first 'NOD*' block might(!) point to a
parent node, but I have never seen that.
3.) Object Data (also SCC Informations) are always
stored in single forward linked/chained of 'DAT*'-Blocks.
The information about the offset and the length is stored in
the Header (HDR*).
4.) A PBD is a PBL.
5.) DLL and EXE files have a 'TRL*' at the end of the file.
This is pointing to the one and only 'HDR*'-Block.
Attention:
For signed DLLs (like PowerBuilder's signed DLLs in Version 11.5)
you have to recalculate the offset to the 'TRL*' Block.
+--------------------------------------------------------------+
I Library Header Block (512 Byte) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'HDR*' I
I 5 - 18 I String I 'PowerBuilder' + 0x00 + 0x00 I
I 19 - 22 I Char(4) I PBL Format Version? (0400/0500/0600)I
I 23 - 26 I Long I Creation/Optimization Datetime I
I 29 - ff I String I Library Comment I
I 285 - 288 I Long I Offset of first SCC data block I
I 289 - 292 I Long I Size (Net size of SCC data) I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I Library Header Block - Unicode (1024 Byte) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'HDR*' I
I 5 - 32 I StringW I 'PowerBuilder' + 0x00 + 0x00 I
I 33 - 40 I CharW(4) I PBL Format Version? (0400/0500/0600)I
I 41 - 44 I Long I Creation/Optimization Datetime I
I 45 - ff I StringW I Library Comment I
I 559 - 562 I Long I Offset of first SCC data block I
I 563 - 566 I Long I Size (Net size of SCC data) I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I Bitmap Block (512 Byte) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'FRE*' I
I 5 - 8 I Long I Offset of next block or 0 I
I 9 - 512 I Bit(504) I Bitmap, each Bit represents a block I
+-----------+------------+-------------------------------------+
(512 - 8) * 8 = 4032 Blocks are referenced
+--------------------------------------------------------------+
I Node Block (3072 Byte) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'NOD*' I
I 5 - 8 I Long I Offset of next (left ) block or 0 I
I 9 - 12 I Long I Offset of parent block or 0 I
I 13 - 16 I Long I Offset of next (right) block or 0 I
I 17 - 18 I Integer I Space left in block, initial = 3040 I
I 19 - 20 I Integer I Position of alphabetically I
I I I first Objectname in this block I
I 21 - 22 I Integer I Count of entries in that node I
I 23 - 24 I Integer I Position of alphabetically I
I I I last Objectname in this block I
I 33 - ff I Chunks I 'ENT*'-Chunks I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I Entry Chunk (Variable Length) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'ENT*' I
I 5 - 8 I Char(4) I PBL version? (0400/0500/0600) I
I 9 - 12 I Long I Offset of first data block I
I 13 - 16 I Long I Objectsize (Net size of data) I
I 17 - 20 I Long I Unix datetime I
I 21 - 22 I Integer I Length of Comment I
I 23 - 24 I Integer I Length of Objectname I
I 25 - ff I String I Objectname I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I Entry Chunk - Unicode (Variable Length) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'ENT*' I
I 5 - 12 I CharW(4) I PBL version? (0400/0500/0600) I
I 13 - 16 I Long I Offset of first data block I
I 17 - 20 I Long I Objectsize (Net size of data) I
I 21 - 24 I Long I Unix datetime I
I 25 - 26 I Integer I Length of Comment I
I 27 - 28 I Integer I Length of Objectname I
I 29 - ff I StringW I Objectname I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I Data Block (512 Byte) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'DAT*' I
I 5 - 8 I Long I Offset of next data block or 0 I
I 9 - 10 I Integer I Length of data in block I
I 11 - XXX I Blob{} I Data (maximum Length is 502 I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I Trailer Block (in DLL/EXE) always last block (512 Byte) I
+-----------+------------+-------------------------------------+
I Pos. I Type I Information I
+-----------+------------+-------------------------------------+
I 1 - 4 I Char(4) I 'TRL*' I
I 5 - 8 I Long I Offset of Library Header ('HDR*') I
+-----------+------------+-------------------------------------+
+--------------------------------------------------------------+
I SCC DATA I
I Structure of status information chunks I
I in DAT*-blocks (Variable Length) I
+---------+----------------------------------------------------I
I Type I Information I
+---------+----------------------------------------------------I
I String I Libraryname (the opposite!) I
I String I Objectname I
I String I Developername I
I Char(1) I Flag I
+---------+----------------------------------------------------I
+--------------------------------------------------------------+
I PB6/7 Status Flags I
+------+------+------------------------------------------------+
I Icon I Flag I Meaning I
+------+------+------------------------------------------------+
I I r I Object is registered I
I I d I Object is Checked Out (locked) I
I I s I Object (Working Copy) to be checked in I
I I u I Unknown?! After an Error occurred. I
I I I (Checked out by user <Unknown> I
I I I Could be set to 'r' with an Hex-Editor.) I
+------+------+------------------------------------------------+
+--------------------------------------------------------------+
I SCC DATA chunk I
I In newer PB Versions the DAT*-blocks content starts with the I
I ansi-encoded String 'SCC*'. I
I Objectname and Version Informations are stored as I
I 0-Byte (Word) separated strings. I
+----------+---------------------------------------------------I
I Type I Information I
+----------+------------+--------------------------------------+
I 1 - 4 I Char(4) I 'SCC*' I
I 5 - xxx I Blob I Objectname (string) followed by I
I I I Null-Byte 0x00 (Word in Unicode) I
I I I indicating the string end I
I I I Version (String) followed by I
I I I Null-Byte 0x00 (Word in Unicode) I
I I I indicating the string end I
I I I Next Objectname und Versioninfo I
I I I repeatedly until the end I
+----------+------------+--------------------------------------+
DateTimes are stored in Long format in Unix representation.
Timezone is always GMT (+/- 0:00), so the datetime has to be
converted to LocalDateTime via LocalTimeZone conversation.
In the compiled object data blocks, there are at least 2 more
datetimes, starting at byte 23 and the other one at 27!
Looks like these are the modification and regeneration date...
我的产品
pb decompiler pb反编译大师
pb obfuscator pb混淆加密大师
datawindowHTTP 互联网访问组件
。。。