欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

P-code & visual basic杂谈(一) (2千字)

P-code & visual basic杂谈(一) (2千字)

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

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功