• 标 题:P-code & visual basic杂谈(一) (2千字)
  • 作 者:小楼
  • 时 间:2002-4-22 22:49:45
  • 链 接:http://bbs.pediy.com

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