加壳程序易语言源码大致说一下写加壳工具的原理(我忘记最开始接触写壳的代码是在看雪上还是《加密与解密》这本书里,时间挺久的了应该是在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不支持给其他已经被添加了其他壳的程序加壳。

发表回复

后才能评论