能力值:
( LV15,RANK:930 )
|
-
-
2 楼
GetProcAddress 用于获取函数的地址,一部份壳使用此填充输入表(并不是都会使用这个函数,有些可以会自己实现此函数)。一般壳的执行过程时,申请内存->解压->释放内存->重定位->填充输入表->转到 oep, 可以看出 填充输入表一般都是最后一步
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
申请内存-》解压
是不是申请的内存用于存放原来的程序?也就是被壳加密之前的?
那为什么解压完之后又立刻释放了内存??
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
对了,再顺便问一个od的问题
如下所示:
lab1: ****
lab2: ****
现用f7已经将lab2执行完了,但突然想看看在lab1执行后的寄存器值,也就是返回上一步,如何实现???
|
能力值:
( LV15,RANK:930 )
|
-
-
5 楼
申请内存做中间缓冲区的用的,用完当然要释放
一只笔和一张白纸
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
谢谢
做中间缓冲区???
举个例子,如做什么……
|
能力值:
( LV5,RANK:60 )
|
-
-
7 楼
我对壳还不是太了解
运行加壳的程序的时候,执行权一般开始都在壳的手中,是吧
壳将原程序进行压缩或者加密,在运行这样的程序的时候,就把整个程序载入内存,然后壳的代码开始对内存的某一部分的代码进行改变,也就是平常所说的"smc"(自修改),是不是在进行自修改的时候,也就是说这个过程,代码有可能会变化,这时候一般是将代码解压到另一个新申请的内存中???
那解压好之后,解压后的代码并不一定能放到原来代码所在的位置呀?
还是充满了太多的疑问……
谢谢dummy的回答
|
能力值:
( LV15,RANK:930 )
|
-
-
8 楼
你理解错了,也怪我没有把流程写详细。
申请内存缓冲区->解压到缓冲区->拷贝覆盖掉原数据->释放缓冲区->重定位->填充输入表->转到 oep
ps: 我没有见过不需要中间缓冲区的解压算法
|
能力值:
( LV5,RANK:60 )
|
-
-
9 楼
拷贝覆盖掉原数据?
如果解压后的代码比原来的代码要大呢?
这样原来的地方可能放不下吧
那这样怎么办?
|
能力值:
( LV15,RANK:930 )
|
-
-
10 楼
解压后和压缩前的大小是一样。
你先看看 pe 结构中的 section 部分, rawsize < virsize.
或找个壳源码看看
|
能力值:
( LV5,RANK:60 )
|
-
-
11 楼
比如说,A经过加壳变成了B程序
1.用od载入了B程序,这时候看见的代码或者数据是与B程序普通运行的时候,在内存中的分布是一样的。是吧??
2.B在肯定也符合PE格式吧,它也有自己的section,是不是它的原理类似于病毒的,改了A中PE头中的一些数据,比如说把AddressOfEntry直接改到了指向自己的段,第一句代码也是自己的,在自己的代码最后结束的时候,再跳向原来的代码处。
在加壳时,加壳软件就是用这种方法加上壳,并且“加壳软件”提供了一种算法将A程序的代码进行加密或者压缩,这时候A中的代码直接看的话,肯定就是乱码的了吧,或者说是没有意义的。这时候“加壳软件”将修改的数据写进磁盘,这样保存的程序就是改变的了。而在壳的自己的段中的代码就是一种逆向的解密,将“加壳软件”加密的代码进行还原,还原后的代码与原来的一样,这样就可以直接运行了。
如果这时候用PeEditor分析B的话,是不是只是增加了一个段,原来的.code或者.text段都仍然存在,只不过是里面的数据改变了。
不知道我上面分析的对不对,还是有其他的……
3.那为什么好多壳第一句都是pushad?既然一开始就转向了自己的代码处执行,那就不会破坏A程序的寄存器呀。不应该是因为很多编译器自动在编译程序的时候加上了好多初始化代码吧。
4.有没有可能经过加壳之后,B跟A的段的数目相等,或者B比A的段的数目还少?
|
|
|