VB 调试之 P-Code 寻找操作码

使用工具

  • OllyDbg 1.10原版,简称OD
  • OD 汉化插件均来自互联网;
  • VB 静态分析工具exdec来自互联网;
  • CrackMe来自互联网,仅供学习使用;
  • 文中特殊数字均是HEX,为了书写方便采用DEC

分析思路

方法一:手动寻找
  1. CrackMe倒入OD,会停留在程序的入口点,向上滚动代码:

    程序入口

    会发现一个 API MethCallEngine是用来初始化P-Code的,不过P-Code的初始化和常见的程序相反,一般,程序在运行时,会初始化所有资源以供调用,而P-Code却是在调用时才会初始化;

  2. MethCallEngine上右键菜单选择跟随或者在MethCallEngine上按下Enter,进入函数内部:

    函数内部

    双击行首或按下F2设置断点并做好备注;

  3. 接着运行程序,发现程序主窗体已经出现,但并没有中断在设置的断点位置:

    没有中断在断点位置

    然后输入随机注册码,点击Registrar后,程序才会中断在断点位置,这也从侧面说明了P-Code是先调用,后初始化;

  4. 来到内存窗口,在代码段设置内存访问断点

    内存访问断点

    虽然P-Code使用的是操作码,但它依然会存储在代码段;

  5. 接下来就是寻找操作码了,操作码的格式是MOVE AL, BYTE PTR DS:[ESI]

    第1操作码

    多次中断后会停留在预期的指令上,而这条指令的作用就是获取操作码,数据窗口查看ESI会得到具体的操作码;

方法二:工具分析
  1. 使用exdec工具分析程序,会得到程序的静态分析结果:

    静态分析

    可以看到,分析的结果和手动寻找的结果一致,地址相同,操作码相同;

  2. 测试一下:

    设置内存访问断点

    重载程序,在数据窗口跟随分析结果第 1 操作码的地址,然后在第 1 操作码上设置内存访问断点;

  3. 运行程序,输入注册码,点击 Registrar:

    中断在操作码位置

    程序中断在第 1 操作码的位置;