VMProtect完美脱壳过程
1.查看程序
这是我自己写的一个VB的小程序,长得有点丑,别介意。然后自己加了一个壳,是VMProtect v.1.6x - 2.03的壳。
接下来我们国际惯例,用PEID,EXEinfo PE查一下壳
![](https://i-blog.csdnimg.cn/blog_migrate/c8372becbc5824e547b1e080407fa618.png)
可以看到是加了VMP的壳的,VMP壳的介绍我会放在帖子的最后哦。
2.拉到OD去啦~
![](https://i-blog.csdnimg.cn/blog_migrate/51e8b52948069f174c1e3c3a4cb60334.png)
push 0xE131EEA3 这其实就是被VM过的OEP,你问我啥是Push?push 就是把什么什么东西压入栈中,你懂吧?就那个右下角的框框!
(注:为了帖子的精华呢我们举个栗子,VC++6.0编译的程序 大家都知道它的OEP开头是push ebp,那大家知道这个push ebp是什么意思吗?push ebp的意思是把ebp压入栈中,就相当于 int main() {} 程序的main函数哦!如果我讲的不够详细大家方可百度看看!)
接下来我们用到一个函数。
3.Ctrl+G搜索VirtualProtectEx(虚拟地址处理)
![](https://i-blog.csdnimg.cn/blog_migrate/a50b4c1556bc6f66719cff0b82176242.png)
来到这里之后呢,我们在这个7D85E1FF这里按下键盘上的F2。下一个断点,运行程序,看看程序的变化。
Alt+M 来到这里
![](https://i-blog.csdnimg.cn/blog_migrate/59c06e8a25075811d204d32334f88c30.png)
我们可以看到有PE文件头,等等等之类的。
我们数一下这里有几个段。
到这个VMP1这里一共是有五个段,啥意思呢?意思是我们运行程序五次,记住,不要第六次哦,第六次就跑飞了,程序跑到虚拟地址里去了。
这是运行五次之后,堆栈的状态
![](https://i-blog.csdnimg.cn/blog_migrate/e9c7bf745a84b57694fed6f65cc55e6e.png)
这是运行第六次之后,堆栈的状态
![](https://i-blog.csdnimg.cn/blog_migrate/4751f3d6fa9364c97876cc9a7d1b0f04.png)
程序已经跑到虚拟地址里面去了,那我们就跑第五次就可以啦
![](https://i-blog.csdnimg.cn/blog_migrate/d299dcf04dd575c298de05c39389a578.png)
现在是一个很好的返回时机,我们在.text的代码段下一个内存访问断点。然后F9运行,这样我们就跑出了VMP段了。
![](https://i-blog.csdnimg.cn/blog_migrate/79658292af22d357bb21a26bf344f888.png)
来到这里之后呢,一直往下跟可以跟到OEP。
我们直接查看,点击M
![](https://i-blog.csdnimg.cn/blog_migrate/5e8772b4d9f707454b7becdd044e7a38.png)
然后右键.text在反汇编窗口中查看
![](https://i-blog.csdnimg.cn/blog_migrate/500f5d512698b52c662fcf1fd16a211f.png)
然后右键分析代码
![](https://i-blog.csdnimg.cn/blog_migrate/0a1b0d557c090ef4ff8eaeb1aff0991c.jpeg)
搜索FF 25
![](https://i-blog.csdnimg.cn/blog_migrate/6aab9365ee4053f76a3575e1e45f1069.png)
可以来到他的JMP头
往下面看都是有很多的JMP
![](https://i-blog.csdnimg.cn/blog_migrate/2b36122c08cf3b40c930500c47b14ff4.png)
那么我们就去它的尾巴看看
![](https://i-blog.csdnimg.cn/blog_migrate/0669111d4d1713b7ea44525afe065457.png)
从模块中删除分析,然后呢,点击M。
ctrl+F搜索76 62 35
![](https://i-blog.csdnimg.cn/blog_migrate/cd353ba811a761bf099357413c0ed466.png)
这是VB的程序,我们要找到这个,然后可以看到00401368 我们记住这个。
回到反汇编窗口,空格汇编,把我们之前的push 0xxxxxxx改成我们的push 0x401368
然后下面的这个CALL,它CALL的是上面的JMP,那我们也修改一下这个CALL。
![](https://i-blog.csdnimg.cn/blog_migrate/35942163460caa3ef94846639a19d9e0.png)
修改完是这样的,然后接着我们需要修复转存。
记得不要忘了右键在此处从新的EIP哦
4.修复转存
我们需要打开Import REConstructor 这款工具呢就不做多的介绍了。
找到我们需要修复的进程
![](https://i-blog.csdnimg.cn/blog_migrate/9b9ec3275b6f78eb777a63846b6afebf.png)
然后去OD看看dump的OEP是多少,
![](https://i-blog.csdnimg.cn/blog_migrate/1a02391112571e1ee868e991a38a8ac5.png)
114C,复制下来,
![](https://i-blog.csdnimg.cn/blog_migrate/1e47e6dff228e3bcde10d59be6430551.png)
点击自动搜索,获取导入表,然后啥的就不说了。
![](https://i-blog.csdnimg.cn/blog_migrate/1df58da13cfe503cf5eda67e708303d5.png)
还有LordPE我们修正镜像大小,然后完整转存,这都是正常的修复,都懂。
然后把Import REConstructor 的修复储存到我们LordPE dump出来的软件上就可以啦,我们先点开软件看看吧。
![](https://i-blog.csdnimg.cn/blog_migrate/f007b976391cce1bfaf4a7f30776b204.png)
一个是我们原版的,一个是脱壳后的,我们给脱壳后的进行查壳看看。
![](https://i-blog.csdnimg.cn/blog_migrate/5ddc0286f24ac91f0466fa752e1c7fb9.png)
当当当,脱壳完成。
然后我们打开软件,看看是否可以运行。
![](https://i-blog.csdnimg.cn/blog_migrate/66544611a9944460f154ddc1d24223a1.png)