lenush 发表于 2008-12-4 17:44

lenushj老调重谈之内存镜像

内存镜像法讲解
好,上次说了ESP定律,今天就说说内存镜像法吧!(同样这次主要是说理论的东西,就不做录像了,大家将就着看吧!)
内存镜像法,以前是叫做二次内存法,那么什么是内存镜像法了?这里先引用一段前辈的文章:“壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。这一个过程我们可以将他看做是对代码段(code段)的写入,一个EXE文件的有code段,data段,rsrc段.....依次排列在你的内存空间中,只要你在data断或者rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以到达OEP了吗?
1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对对data段的解压时,这时壳要对data段写数据,但是code段已经解压
完毕。
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了“
(应该有人会晕以吧!说的有点专业啊!)
我们还是来实例操作吧!一个简单的记事本程序,加了ASPack 1.08.03 -> Alexey Solodovnikov的壳。

首先了我们用OD打开软件,程序停在这里:
http://p0.images22.51img1.com/6000/wz0695/0a23c081698fbde0d9ed8405f3202d46.jpg

这之后,点击选项——调试选项——异常,然后把里面的勾全打上,
http://p0.images22.51img1.com/6000/wz0695/0fa7cc12aa398fa5929fada095ddf490.jpg

为确保设置生效,CTRL+F2重载一下程序,接下来我们点击查看——内存(或者是直接ALT+M快捷键来查看内存),我们找到.RSRC上面的CODE,按F2下断点,

http://pa.images22.51img1.com/6000/wz0695/a4d0b3b89f8f4da6e516a21980114ac8.jpg
然后按SHIFT+F9运行一下(或者是按运行也可在这里没区别,其他地方是有差别的),来到这里

http://p6.images22.51img1.com/6000/wz0695/611c501f8f9b4f2ee52893c3d9a2445d.jpg

好,我们再次打开内存镜像,在.code处下F2断点:

http://p6.images22.51img1.com/6000/wz0695/67edb27a19d8ffae791982eb61783e42.jpg

同样的步骤运行一下,来到这里:

http://p1.images22.51img1.com/6000/wz0695/1a510d0eee93e397c53ffe37e59d6819.jpg

有点眼熟了。脱壳检验一下吧!直接用OD的插件。脱壳后PEID检验是:
Microsoft Visual C++ 6.0 SPx Method 1
脱壳成功!
下期我们讲讲最后一次异常法!
谢谢大家支持!

                        

lenushj

08-11-11 凌晨01:42

[ 本帖最后由 lenush 于 2008-12-4 17:56 编辑 ]

鬼手 发表于 2008-12-4 17:47

看不怎么明白额.学习.谢谢分享

半瓶水 发表于 2008-12-4 18:56

呵,这样的讲解清析明了,学习了!:victory:
可有疑问:1、“我们找到.RSRC上面的CODE,按F2下断点”,什么叫上面的CODE?上面是什么?是.rsrc处的代码吗?
2、“好,我们再次打开内存镜像,在.code处下F2断点:”中的.code怎么变成在.text处下断?

[ 本帖最后由 半瓶水 于 2008-12-4 19:12 编辑 ]

Hmily 发表于 2008-12-7 20:30

加密解密3上有很详细,内存断点主要是依靠壳的解压代码顺序先后来脱壳的~

fuma255 发表于 2009-6-9 18:04

加密解密3上有很详细教程,不妨看看
页: [1]
查看完整版本: lenushj老调重谈之内存镜像