VB 调试之 P-Code 寻找操作码
使用工具
- OllyDbg 1.10原版,简称
OD; OD汉化和插件均来自互联网;- VB 静态分析工具exdec来自互联网;
- CrackMe来自互联网,仅供学习使用;
- 文中特殊数字均是
HEX,为了书写方便采用DEC;
分析思路
方法一:手动寻找
将
CrackMe倒入OD,会停留在程序的入口点,向上滚动代码:![程序入口]()
会发现一个 API
MethCallEngine是用来初始化P-Code的,不过P-Code的初始化和常见的程序相反,一般,程序在运行时,会初始化所有资源以供调用,而P-Code却是在调用时才会初始化;在
MethCallEngine上右键菜单选择跟随或者在MethCallEngine上按下Enter,进入函数内部:![函数内部]()
双击行首或按下
F2设置断点并做好备注;接着运行程序,发现程序主窗体已经出现,但并没有中断在设置的断点位置:
![没有中断在断点位置]()
然后输入随机注册码,点击
Registrar后,程序才会中断在断点位置,这也从侧面说明了P-Code是先调用,后初始化;来到
内存窗口,在代码段设置内存访问断点:![内存访问断点]()
虽然
P-Code使用的是操作码,但它依然会存储在代码段;接下来就是寻找操作码了,操作码的格式是
MOVE AL, BYTE PTR DS:[ESI]:![第1操作码]()
多次中断后会停留在预期的指令上,而这条指令的作用就是获取操作码,数据窗口查看
ESI会得到具体的操作码;
方法二:工具分析
使用
exdec工具分析程序,会得到程序的静态分析结果:![静态分析]()
可以看到,分析的结果和手动寻找的结果一致,地址相同,操作码相同;
测试一下:
![设置内存访问断点]()
重载程序,在数据窗口跟随分析结果第 1 操作码的地址,然后在第 1 操作码上设置内存访问断点;
运行程序,输入注册码,点击 Registrar:
![中断在操作码位置]()
程序中断在第 1 操作码的位置;







