zapline 发表于 2008-8-28 03:56

学习笔记:脱CryptO 0.93两次内存断点法寻找OEP

下面是小生的脱文的一部分

00413000 >5Bpop ebx //OD载入
0041300181E3 00FFFFFF and ebx,FFFFFF00 //ait+m打开内存镜象
━━━━━━━━━━━━━━━━━━━━━━━━━━
首先在00405000处下F2设置访问中断,接着shift+f9运行
━━━━━━━━━━━━━━━━━━━━━━━━━━
00413232300431xor byte ptr ds:,al //程序停在了这里
0041323581EA 1F79E4BF sub edx,BFE4791F //在一次ait+m打开内存镜象
━━━━━━━━━━━━━━━━━━━━━━━━━━
在00401000处下F2设置访问中断,接着shift+f9运行
━━━━━━━━━━━━━━━━━━━━━━━━━━
004010CC55push ebp //程序直接停在了OEP
004010CD8BECmov ebp,esp//dump程序


写的比较详细,但是没说原理。
我照着画了一遍,成功了,但是不理解的话,以后脱其它壳还是不会用这个方法。
so ,我就找资料:::


【【这里注意上面虽然下了两次内存访问断点,但是本质是不一样的,目的也是不一样的。

  
1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对data段的解压时,这时壳要对data段写数据,但是code段已经解压完毕。

  
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了。

 

 总结一下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点,找到OEP。如果不知道,那么我们就依靠2次内存断点去找,如果还不行就用多次内存断点。总之明白了原理在多次的内存断点其实都一样。从这个过程中我们了解的是壳在对区段解码的顺序!】】(来自百度)



下面是我的理解了···


data --- 数据
code--- 代码



我们最终的目的是 在代码段解压完毕 并开始执行时断下它,自然就断在了 OEP



那么如何判断 什么时候断代码段好 从而 选择 下断内存断点 呢?
我觉得从小生和网文 可以看出来:
断在data段,是因为内存写入,要写入data段了,自然是code段已经解压完毕。
那么,code段已经解压完毕,说明就快要或者开始执行了,此时再下断code段,自然就断了下来。



于是,总结出两次内存断点法的操作:

1,alt+m , F2 in data, F9

2,alt+m , F2 in code, F9

3,OEP



ps:菜鸟没办法,脱不了壳,但是学习了方法··写个笔记(****(版主知道什么意思吧!:-)))

小生我怕怕 发表于 2008-8-28 04:50

呵呵,野牛出击皆然不同!

XuZhenG 发表于 2008-8-28 10:47

虽然没有脱壳文件 但是方法蛮好比较通用 先给+3吧继续努力...

二次内存断点法 常用于对付tELocK,Enigma Engine等SE异常较多的程序。

这个程序可以先在rsrc资源段下F2断点 Shift + F9
然后再在Code代码段 下INT3断点 然后Shift+F9 即到OEP

关于OEP的查找,还有两种方法(暂时不公布,集思广益应该还有更多)...

修复IAT有极其简单的Patch方法(仅修改一个字节)努力下 看看能不能找到...
当然如果你愿意对着假死的ImportREC =上几分钟(等级三修复我也不反对)

蚊香 发表于 2008-8-28 16:28

某些壳找OEP简单修复才难道新手

shsww 发表于 2008-8-28 16:42

二次断点法寻找OEP的关键是要等代码段解压完毕,再对代码段设置内存访问断点!一般的壳会依次对.text.rdata.data.rsrc区块进行解压处理,所以,可以先在.rdata.data等区块下内存访问断点,中断后,此时代码段已解压,接着再对代码段(.text块)下内存访问断点,即可到达OEP!

shsww 发表于 2008-8-28 16:52

这个第一次下断时不一定必需在.data 上下断吧!也可以在.rdata和.rsrc处下断!

lchy 发表于 2008-8-28 16:54

学习中,暂不发表评论。。。。。。。。
页: [1]
查看完整版本: 学习笔记:脱CryptO 0.93两次内存断点法寻找OEP