能力值:
(RANK:570 )
|
-
-
2 楼
真是深,全是看不懂得
|
能力值:
( LV9,RANK:140 )
|
-
-
3 楼
原理估计很难说出来,应该也是起到一个平衡作用吧
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
壳的压解原理你应该知道把````内存景象法就是壳的压壳原理
先下RSRC就是对这个区段下内存写入段点
在对CODE段就是对这个区段下内存访问段点 也就是说找到那个段可以压壳CODE段就可以脱壳```
|
能力值:
(RANK:570 )
|
-
-
5 楼
在我那个年代,叫二次内存断点
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
现在是多次内存景象法````
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
哦原来如此
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
呵呵。但是程序写入的内存地址是不变的吧。加壳还是不加壳,代码所处的内存地址应该一致的吧?
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。这一个过程可以将他看做是对代码段(code段)的写入,一个EXE文件的有code段,data段,rsrc段.....依次排列在你的内存空间中,只要你在data断或者rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以到达OEP了吗? 1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对对data段的解压时,这时壳要对data段写数据,但是code段已经解压 完毕。
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
新手一个,似懂非懂。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
强,又学到不少东西,谢谢楼主分享
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
天草50课第10课文件有``````
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
转自黑客X档案:http://bbs.hackerxfiles.net/archiver/tid-88027.html
内存镜像法和ESP定律法脱壳心得
1.ESP定律的原理是什么?堆栈平衡原理。
2.ESP定律的适用范围是什么?几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用。但是在何时下断点避开校验,何时下断OD才能断下来,这还需要多多总结和多多积累。[/pre][pre]数据窗口跟随----硬件访问---DWORD
3.内存断点:[/pre][pre]在所执行的代码的当前地址的一个字节修改为CC(int3)。当程序运行到int3的时候就会产生一个异常,而这个异常将交给OD处理,就正好停在了需要的中断的地方(这个根据系统不同会不一样),把这个异常交给当前EIP的上一个EIP同时OD在把上面的int3修改回原来的代码。
内存断点分为:内存访问断点,内存写入断点。
我们知道,在程序运行的时候会有3种基本的状态产生:读取-->写入-->执行。
004AE242 A1 00104000 mov eax,dword ptr ds:[004AE24C] //004AE24C处的内存读取
004AE247 A3 00104000 mov dword ptr ds:[004AE24C],eax //004AE24C处的内存写入
004AE24C 83C0 01 add eax,1 //004AE24C处的内存执行
1.当对004AE24C下内存访问断点的时候,可以中断在004AE242也可以中断在004AE247。
2.当对004AE24C下内存写入断点的时候,只能中断在004AE247。
3.当执行004AE24C的时候,只能中断在004AE24C
到这里你可能不明白了,为什么内存访问断点能中断在004AE247这一句对004AE24C的写入,而且还能中断在004AE24C的执行呢?其实很简单,我们只要仔细体会一下“内存访问”这四个字的含义遍可以知道,当我们对004AE24C进行读取的时候需要“访问”他吧,当我对004AE24C进行写入的时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C的代码的时候也是还是要“访问”他的!
所以我们不难得出下面的结论:
1.内存写入中断的地方,一定是也可以用内存访问中断。
2.内存执行的地方,也可以用内存访问中断。
如果这时你认为,那么内存写入岂不是没用了。呵呵~那我要告诉你当然不是,如果你想快速的准确的定位到004AE247这一行的时候,那么他就大有作用了!
总结一下:内存断点不修改原代码,不会像普通断点那样因为修改代码被程序校验而导致中断失败;对于区段的访问只是区域大了一点,其原理和上面分析的三行代码是一样的。
ii.如何使用内存断点来寻找OEP呢?
要回答这个问题首先要回答这一个问题:壳是如何解压代码的?
正如我们知道的,壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。而这一个过程我们难道不能将他看做是对代码段(code段)的写入吗?好了,解压完毕了。我们要从壳代码的区段JMP到原来的代码段的时候,难道不正是对代码段(code段)的执行吗?
理清了上面的关系就好办了,那么如果载入OD后,我们直接对code段下内存访问断点的时候,一定会中断在壳对code段的写入的代码的上面,就像上面的004AE247的这一行。而如果当他把code段的代码全部解压解密完毕了以后,JMP到OEP的时候,我们是不是还可以停在OEP的代码上面呢?而且每按下F9都会中断,因为这时code段在执行中哦!
而如果你还要继续问我为什么一定要到那个地方才可以下断呢?我难道不可以一开始就下断吗?
正入我上面所说的,如果你在前面下断很可能壳对code段还没解压完毕呢,这时如果你不停的按F9,你将会看到OD的下方不断的在提示你,“对401000写入中断”“对401002写入中断”“对401004写入中断”.......如果你不介意按F9到他把正个code段写完的话,我除了同情你的“F9”以外,没什么其他的意见!
那么我们就没有别更快一点的办法了吗?
有的!那就是我们呼之欲出的两次内存断点办法。
怎么理解两次内存断点呢?
让我来做一个假设吧,假设我是一个壳的作者。一个EXE文件的有code段,data段,rsrc段.....依次排列在你的内存空间中,那么我会怎么解码呢?呵呵~我比较笨一点,我会先将code段解码,然后再将data段解压,接着是rsrc段......那么你不难发现,只要你在data断或者rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以到达OEP了吗?
这里注意上面虽然下了两次内存访问断点,但是本质是不一样的,目的也是不一样的。
1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对对data段的解压时,这时壳要对data段写数据,但是code段已经解压 完毕。
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了。
总结一下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点,找到OEP。如果不知道,那么我们就依靠2次内存断点去找,如果还不行就用多次内存断点。总之明白了原理在多次的内存断点其实都一样。从这个过程中我们了解的是壳在对区段解码的顺序!
|
能力值:
( LV9,RANK:290 )
|
-
-
14 楼
感觉是用旧概念换新名词的方法来炒作,就像以前看到的一篇介绍成功学的文章,说什么要投资“投资脖子以上的部分”,这直接说大脑就行了吗,哪里需要这样炒作,强烈BS
在看雪老大写的“脱壳入门初级教学”(http://bbs.pediy.com/showthread.php?t=20366)就对二次内存断点作了详细的描述,而且附有一个脱壳实例
|
|
|