dll加壳

最近项目用到了vmprotected对dll插件进行加壳,在测试阶段使用peid0.95进行检测是否加壳,使用完毕了,一脸懵逼。突然想起来,就查资料了解记录一下吧

一。什么是壳

一段专门负责保护软件不被非法修改和反编译的程序。一般先于程序运行,拿到控制权,然后完成保护软件的任务。

二。壳的加载过程

加壳工具是指压缩可执行文件EXE或DLL的工具。加壳过的可执行程序执行的实际是外壳程序,外壳程序负责把用户原来的程序在内存中解压缩,并把控制权交还给解开后的真正程序,这一切工作都是在内存中运行的

壳修改了原程序的执行文件的组织结构,从而能够比原程序代码提前获得控制权,并且不会影响原程序的正常运行

一般壳的装载过程:

1)获取壳自己所需要使用的API地址

如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,其它API一般只在壳的代码中用显式链接方式动态加载这些API函数

2)解密原程序的各个区块(Section)的数据

壳一般都会加密原程序文件的各个区块。当程序执行外壳时会对这些区块数据解密,让程序能正常运行

注意:壳是按区块加密,按区块解密,并且把解密的区块按照区块的定义放在合适的内存位置

3)重定位

文件执行时将被映像到指定内存地址中,这个初始内存地址称为基地址(ImageBase)。

对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。这样“重定位”就很重要了。

此时壳中也需要提供进行“重定位”的代码,否则原程序中的代码是无法正常运行起来的。从这点来说,加壳的DLL比加壳的EXE更难修正。 

4)HOOK-API

程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。在程序的第一行代码执行之前,Windows系统就完成了这个工作。

壳一般都修改了原程序文件的输入表,然后自己模仿Windows系统的工作来填充输入表中相关的数据。在填充过程中,外壳就可填充HOOK-API的代码的地址,这样就可间接地获得程序的控制权。

5)跳转到程序原入口点(OEP)

从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。但现在的猛壳己没这界限了,壳里有肉,肉里有壳。

三。压缩引擎

加壳软件选择压缩引擎有一个特点:在保证压缩比的条件下,压缩速度慢点关系不大,但解压速度一定要快

四。检测加壳工具PEID

 PEiD的GUI界面操作非常方便直观。它的原理是利用查特征串搜索来完成识别工作的。

各种开发语言都有固定的启动代码部分,利用这点就可识别出是何种语言编编译的。样,不同的壳也有其特征码,利用这点就可识别是被何种壳所加密。

有些外壳程序为了欺骗PEiD等文件识别软件,会伪造启动代码部分,如将入口代码改成与Visual C++ 6.0所编程程序入口处类似代码,即可达到欺骗目的。


所以,文件识别工具所给出的结果只是个参考,文件是否被加壳处理过,还得跟踪分析程序代码才可得知。 





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值