易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

完整的易语言编写的加壳程序开源   [复制链接]

    2022-09-08 09:16:34
    模块控件源码
    易语言资源网
    8694 次浏览
    来源链接

在写这个程序之前在百d和论坛还有其他几个论坛都搜了一下是否已经有开源过易语言编写的加壳工具,但是找到的都不是真正的加壳工具,要么是调用命令加UPX壳,要么是模块里有几个压缩PE区段数据的命令而已,没有找到一个开源的能完整显示加壳流程的帖子(也有可能我搜索姿势不对),因此写了这个源码,从PE头怎么处理到怎么添加区段,怎么修复重定位表、导入表、IAT表、安全表等等方面都完整写出来了,断断续续写了三四天,光修复BUG就花了一天,因为不好调试,调试被加了壳的程序只能上OD(因为我写的这个是加密壳,用IDA不管用),OD里找到问题点后再去看源码是哪里的问题,调试的头昏脑涨。

本来是想再添加多几个壳的功能例如检测调试器,增加强度加大脱壳难度之类的再发的,但是今天在公司加班也没什么事就在公司发出来吧,大家要什么功能自行拓展。

大致说一下写加壳工具的原理(我忘记最开始接触写壳的代码是在看雪上还是《加密与解密》这本书里,时间挺久的了应该是在15或16年,因为当时是第一次接触写壳方面,所以映像非常深刻,这个代码的原理也是借鉴那里面的),这样看源码的时候就比较好理解了,源码里我做了很多注释,只要对PE结构体有一定了解的人看起来应该问题不大,首先PackShell要用黑月编译,为啥用黑月?只有一个原因就是因为它生成的dll小啊,这样最后被加壳的程序体积也就比原先大一点而已。

1:程序会先读取被加壳程序的各种PE相关数据,例如区块数啊,入口点啊,各个区块的RVA啊之类的,还有最重要的就是数据目录表里的导入表、重定位表、IAT表和安全表了,这些表的相关RVA和大小都要记录起来。

2:把前面记录起来的数据放到用黑月编译的PackShell.dll里,这个dll里有一个导出函数SetShellDataPointer,调用这个导出函数设置既可。

3:修正dll里的导入表、重定位表等数据

4:给被加壳的程序添加一个区块,再把记录了相关数据和修复了导入表和重定位表的dll写入到这个区块里。

5:把被加壳程序的代码段进行加密或压缩,进行加密就是加密壳,进行压缩就是压缩壳,我写的是一个加密壳,只是简单的异或加密。

6:处理附加数据,修改数据目录表里的导入表、重定位表、IAT表和安全表等表的RVA,设置程序的入口点为这个dll里的StartFunction。处理附加数据时默认这些附加数据都是证书,所以如果附加数据不是证书的话,处理附加数据那里就需要修改,大部分有附加数据的数据都是证书部分,如果程序没加其他壳,即使程序有证书,用这个DEMO加了壳后也可以用,例如VX电脑客户Duan,而有的程序是加了其他壳后再添加的证书,这种加了其他壳的就不支持,例如360极速浏览器。

7:保存生成新文件。

PackShell.dll的流程

1:解密被加壳程序的代码段,因为我们构造的StartFunction这个入口点函数也相当于是dllmain,会在4种情况下被调用,而我们只需要解密一次代码段,所以需要用一个变量控制下。

2:如果被加壳程序有重定位表,例如dll或者有重定位表的exe就修复被加壳程序的重定位表。

3:修复导入表。

4:调用被加壳程序的原入口点。

这样就完成了一个简单的加壳工具的编写,当然这是一个总体的流程,具体里面会涉及到很多,看源码的时候认真研究一下就可以了。

这个DEMO给程序加密时只是简单的进行了异或加密,然后添加了一个信息框,被加壳的程序打开时会弹出这个信息框,没做其他强化,所以这个壳也很好脱,你们可以自行拓展,例如抽取导入表,把导入表跳转到dll里,dll里再调用原导出函数,这样就做到了壳中有籽,壳就脱不完全,还有壳的代码里可以加上检测调试器的功能之类,这些要实现起来都是非常简单的,看懂了源码自己加吧。

补充一下,前面说的有附加数据的程序加完壳后可能会运行不了,怎么看程序有没有附加数据呢,懂PE的可以自己计算,最后一个区段的文件偏移加上文件大小小于文件大小就说明程序有附加数据,代码里也有写,不怎么懂PE的可以用PEID看,显示Borland Delphi 6.0 - 7.0 [Overlay]之类的字样就是有附加数据,看后面有没有Overlay,现在有附加数据的程序大部分都是加了证书,另外这个DEMO不支持给其他已经被添加了其他壳的程序加壳。

下面放几张代码图和测试图,加壳工具里我所有的加壳代码都是写在一个叫Pack的子程序里,所以这个子程序非常长

成功加壳后会在原程序添加一个区段

没有严格校验证书的软件也可以加壳(必须没被其他加壳工具加过壳才可以用本DEMO加壳)

加完壳的程序签名依然有效

甚至可以自己给自己加壳



点我下载 (已有 683 次下载)

引用模块


源码文件名 模块文件名
Pack.e
精易模块.ec


引用支持库


源码文件名 支持库文件名 支持库标识
Pack.e 系统核心支持库 5.3 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
常量支持库 1.6 9DEDA17547CF40e085B7C8919B1800AF
PackShell.e 系统核心支持库 5.3 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8


[错误报告]   上一篇:数据表0.3版     下一篇:自写PHP验证接口(appid appk...