关于vb反汇编

今天做一个VB写的crackme,程序本身很简单,但是却发现一个很奇怪的地方

看如下代码

0F0FEA42  xor eax,eax
0F0FEA44  mov al,byte ptr ds:[esi]
0F0FEA46  inc esi
0F0FEA47  jmp dword ptr ds:[eax*4+0xF0FED94]

这样的代码随处可见,而且程序几乎一直是在msvbvm50这个dll里面执行上述代码,几乎没有回到用户程序领空。后来搜了下,在看雪看到这个系列的文章,总算搞懂了,这里做下记录
VB P-code — 虚拟机的艺术
VB P-code — 调试器的革命
VB P-code — 伪代码的奥秘
这三篇文章讲的很详细,基本上是说:
vb的编译分两种,一是native,也就是直接编译成机器码,而是p-code,编译成字节码,由虚拟机引擎解释执行
上面的程序正是p-code方式,esi指向的是字节码指令所在的地址,mov al,byte ptr ds:[esi]这句就是取操作码,inc esi则是指针指向操作数(对双字节操作码的指令,则是指向第二级操作码),jmp dword ptr ds:[eax*4+0xF0FED94]这句中的0xF0FED94是跳转地址表的首地址。这个内存区域存放着所有vb字节码对应的机器码程序。上述代码正是利用字节码的操作码部分得出对应的机器指令程序段的地址,然后跳过去执行这条字节码的功能。
这也解决了我的问题。msvbvm50这个dll中存储了vb5.0的虚拟机代码,程序不断的通过虚拟机获取用户程序领空的字节码来执行,所以才会一直在msvbvm50.dll里面打转。而用户代码部分则od无法识别,原因就是这些代码都是字节码嘛。
然后又查了查,找到了一个叫vbdecomplier的反编译器,pcode方式的vb程序基本上都能看源码了。。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>