visual basic & P-code杂谈(一)
p-code,可以称为packed-code(压缩代码),也可叫做pseudo-code(伪代码)。其最早起源已经不可考;但据说最早见于一个pascal编译器使用的编译技术,以后微软在basic、c、vb乃至vc中使用了类似的编译技术。
所谓p-code,其基本工作原理是编译器先把执行程序编译为比80X86机器码紧凑得多的中间代码形式,然后在链接时把一个小工作引擎嵌入执行程序中,最后在运行时由此工作引擎把P-CODE解释为本地机器码实际执行,所以叫做packed-code;同时又由于此代码并不是最终的机器码形式,实际上是“变形的源代码”,所以也被称为pseudo-code。依靠P-code编译技术,使得编程语言不依赖于机器或照作平台称为可能。
虽然目前p-code编译形式大多见于vb,但java,powerbuilder的编译实质也是一样;最新的microsoft
visual studio.net,只是将名称换成“中间语言(Microsoft Intermediate Language)”,不管怎么解释我还是不能理解IL与p-code的不同。(参考http://windows.oreilly.com/news/hejlsberg_0800.html《Deep
Inside C#:
An Interview with Microsoft Chief Architect Anders Hejlsberg》)。
因为vb3、4都是使用P-code编译形式;也因为p-code编译的代码实际只是“变形的源代码”,所以只要我们能理解其对应机制,就能做出反编译器来,所以Dodi's
vb3/4 disassembler来了,java反编译器来了,对付最新microsoft .net的反编译程序也可以被得到。
为什么见不到vb5/6 p-code的反编译器,现在有了,就是exdec及建立在其基础上的wkt vb p-code debugger;而且2001年就有人写出一个vb6
add-in来实现vb6源代码-> P-code转换。
第2部分:理解mid()函数
Private
Sub Command1_Click()
Dim a, b As String
a = Text1.Text
b =
Mid(a, 2, 3)
End Sub
将上述代码用vb6分别编译为native code和P-code
函数原型Mid(string, start[, length])
(1)wdasm反汇编native code
:00401D62 C745A403000000 mov [ebp-5C],
00000003
:00401D69 C7459C02000000 mov [ebp-64],
00000002
* Reference To: MSVBVM60.rtcMidCharVar, Ord:0278h
|
:00401D70 FF153C104000
Call dword ptr [0040103C]
(2) exdec反编译P-code
401A63: 28 LitVarI2: ( local_00E4
) 0x3 (3)
401A68: f5 LitI4:
0x2 2 (....)
401A6D: 04 FLdRfVar
local_0094
401A70: 04 FLdRfVar
local_00F4
401A73: 0a ImpAdCallFPR4:
rtcMidCharVar
- 标 题:P-code & visual basic杂谈(一) (2千字)
- 作 者:小楼
- 时 间:2002-4-22
22:49:45
- 链 接:http://bbs.pediy.com