扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:赛迪网 来源:赛迪网安全社区 2007年10月17日
关键字: 加壳 脱壳 GetProcAddress 动态链接 IAT
在本页阅读全文(共2页)
现在玩脱壳的人越来越多了,不知道是好事还是坏事。
现在玩手动脱壳一般三样工具足矣:loader,ImpREC,TRW2000。也许是这三剑客的功能太强大,因此手动脱壳也变得象流水化作业。大致以下几个步骤就搞定了。
1)loader找OEP.(OEP就是程序原来的入口点,即Original Entry Point)
2)TRW2000来Dump。也就是把内存映象保存为文件。
3)ImpREC修补Import Table.(也就是修补程序原来的API地址)
不过如果这样,那么我想手动脱壳也没有必要了,因为更先进的工具如各种脱壳机会更快捷有效。既然是手动脱壳,当然想对壳有所了解,那么让我们看看壳是如何工作的吧。
壳和病毒从某些方面比较类似,都需要比原程序代码更早的获得控制权,这是通过在原程序的代码执行前加入自己的一段代码来实现的。注意我说的这是执行时的情况。对于文件中的情况,就是壳修改了原程序的执行文件的组织结构,从而达到壳的代码能够比原程序的代码提前获得控制权,并且不会影响原程序的正常运行,所以从这点上说,壳和病毒很类似。
现在的执行文件一般都是PE格式,如果你对PE格式一无所知,最好还是去看一看相关的资料。我没有那么地道的专业知识,也怕误人子弟。
相关名词
1)Entry Point (入口点)
PE格式的可执行文件的执行时的入口点,即是PE格式中的Entry Point。
用PEditor或者LordPE之类的PE查看工具看看NotePad.exe,你就会看到Entry Point的值。
也就是说NotePad.exe在执行时的第一行代码的地址应该就是这个值。(当然应该加上基地址)
2)Section (节区)
PE格式文件是按节区进行规划组织的,不同的节区一般保存的数据的作用也不相同。通常使用缺省方式编译的程序文件,有CODE/DATA/TLS/.text/.data/.tls/.rsrc/.rdata/.edata/.reloc等不同的名称,有的用于保存程序代码,如CODE和.text节区,有的用于保存程序中的变量的,如DATA/.data节区,有的保存重定位信息,如.reloc,有的用于保存资源数据,如.rsrc。等等等等,当然这是缺省情况下编译器产生的结构。
而节区名称和节区中的数据其实没有必然的联系,节区中保存的数据也没有什么硬性的限制。所以你可以在编译时用开关参数改变这些情况。
3)ImageBase (基地址)
不仅程序文件按节区规划,而且程序文件在运行时Windows系统也是按节区加载的。那么每一块的节区的顺序如何?起始的地址是什么呢?
这就由基地址决定。在程序的文件头部保存了每个节区的描述信息,比如有前面提到的节区名称,还有节区的大小,以及节区的相对虚拟地址(RVA)。
如果我们把节区的相对虚拟地址(RVA)加上基地址(ImageBase)就可以知道节区在内存中的虚拟地址(VA)了。Windows系统就是按照这个要求来加载各个节区的。这样Windows系统依次把各个节区放到了它相应的虚拟地址空间。
所以如果我们把相对虚拟地址(RVA)看成是坐标的偏移量的话,那么ImageBase就是原点了。有了这个原点,一切都简单了。
好了有了简要的介绍,我们来看看壳的加载过程吧。注意这里说的是一般情况,不特指某个壳,如果那样的话,我想那大概是洋洋洒洒几万字的了,好象我没有写过这么长的。虽然我的五笔练得还不错。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。