VB程序脱壳寻找OEP
前言:VB程序脱壳寻找OEP的笔记
关于VB程序的OEP的特征
VB的脱壳难度整体会比其他程序会好脱点,可能是自身的机制的原因,VB和壳不能保持良好的兼容性,必须虚拟VMP壳对其也不支持,保护强度的确更低,还有一点就是特征也很明显。
VB程序的OEP的特征,一般都是push一个数据到堆栈,然后进行CALL,而这个CALL调用的就是VB自带的系统的dll文件MSVBVM60.dll,然后入口点上方全是FF25跳转函数
那么就会有一个思路:当加壳完,最后来到OEP处,程序运行既然会调用系统DLL,那么我们是不是只要给系统的MSVBVM60.dll下内存执行断点,当访问的时候就是不是会让OD捕获异常,实现OEP的寻找
脱壳思路
把一个UPX壳的VB加载OD中,EP为如下,这里选择用特殊OD来调试VB,原因是这个OD只有当内存访问断点处才会被断点下来,其他OD就算设置了内存断点,一访问就会直接断下,不适合用于脱壳
发现找到系统的DLL,对其代码段进行内存访问断点,原因上面已经讲过了
进行F9,然后成功的断在了系统DLL的领空上
来到dll的领空,我们可以返回到程序的领空,在堆栈窗口进行反汇编窗口跟随,回到当前call的外部函数,汇编窗口拉上去上去两行就可以看到明显的VB程序的特征,也就是VB的OEP
这个思路不只是只有VB,其实如果你已经知道脱壳后的OEP开头处都有直接调用的话,那么都可以尝试直接定位相关的函数下断点,然后F9测试,比如下面的UPX加壳的小程序,为什么说小程序,因为下面GetModuleHandleA调用的次数不多,所以如果想要这种方法来定位的话,直接GetModuleHandleA下断点,F9回到用户代码两三次就到OEP了,如果大型程序的话当我没讲过