先找工具反编译。试了pbkill,只得到一堆if...else...end if之类的,一句代码也没有出来(可能是pbkill试用版吧?)
在网上又搜到另一个反编译工具shudepb,使用确实很好,支持全局搜索,大大方便找关键代码。
全局搜索提示:"对不起,你尚未注册,只能阅读每一部分的第一篇文章!欢迎注册!",找到以下代码:
//Has been Shielded.
index = PARENT.ddlb_text.finditem(PARENT.ddlb_text.text,1)
index ++
IF index > 1 AND gb_register = FALSE THEN //3
PARENT.ddlb_text.text = PARENT.is_etitle
messagebox("提示","对不起,你尚未注册,只能阅读每一部分的第一篇文章!欢迎注册!")
THIS.setfocus()
RETURN
END IF //3
ls_text = PARENT.ddlb_text.text(index)
IF ls_text = "" THEN //10
index --
PARENT.ddlb_text.text = PARENT.ddlb_text.text(index)
RETURN
END IF //10
PARENT.ddlb_text.text = PARENT.ddlb_text.text(index)
PARENT.ddlb_text.triggerevent(selectionchanged!)
RETURN
写这篇文章没有其它目的,纯粹是为了方便自己记忆,没有太多技术上的东西,pb与vb pcode相似,但不同之处有太多,难度大很多。
一段代码执行起来跟踪要很久,下面这三行就花了我将近1个小时才找关键,真的需要运气。
index = PARENT.ddlb_text.finditem(PARENT.ddlb_text.text,1)
index ++
IF index > 1 AND gb_register = FALSE THEN //3
pb程序没有直接读取原程序,而是将原程序的代码先复制到临时地址,然后不断读取临时地址并执行。
所以调试时找到临时地址还是不够的,还要找到原程序的地址才能爆破,很多机器码如jz、jnz等我也不知道是什么。
if daysafter(today(),date(ls_jzrq)) <= 30 then
ls_temp = string(daysafter(today(),date(ls_jzrq)))
dw_1.modify("t_1.visible='1'")
dw_1.modify("t_1.text='您还有" + ls_temp + "天的使用时间,请尽快升级!'")
end if
+--------------------------------------------------------------+
I PBL File Format 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).
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.
Regards
Arnd Schmidt March 2005
arnd.schmidt@dwox.com
+--------------------------------------------------------------+
I PBL File Format I
+--------------------------------------------------------------+
Rules and facts:
1.) A PBL is always made out of blocks of 512 Bytes, except the
Node Block, that has a size of 6 blocks, meaning 3072 Bytes.
2.) There is always one Header (HDR*), followed by a
free/used blocks bitmap (FRE*).
Then (after 1024 Byte) 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 (and SCC Informations - pre PB8) are always
stored in single forward linked/chained 'DAT*'-Blocks.
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.
+--------------------------------------------------------------+
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 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 21 - 22 I Integer I Count of entries in that node 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
+------+------+------------------------------------------------+
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...