一个简单压缩壳的实现
更新:HHH   时间:2023-1-7


之前,花了三、四天的时间写了一个压缩壳,Mark一下。

简单说下逻辑:

1、MFC实现的UI交互部分:展示壳的功能,获取被加壳程序的路径,显示加壳进度。

2、加壳功能Pack导出为一个dll,MFC部分动态加载。

3、壳的本体Stub,把数据段、只读数据段合并到代码段,添加到被加壳程序的最后。

简单说下功能:

1、支持反调试,检查PEB可以过x64dbg,NtQueryInformationProcess可以过StrongOD。

2、加密代码段,用的AES加密库。大概思路:遍历区段头表,找到.text区段头表,通过PointerToRawData字段加上被加壳程序读取到内存中的首地址,找到.text段在内存中的位置;通过SizeOfRawData得到它的文件大小;调用AES加密库。

3、压缩代码段,大概思路:通过.text段头表找到.text段,调用压缩库压缩。申请内存空间,大小=PE头+已压缩.text+其他区段。依次从内存空间把文件拷贝过去:PE头、已压缩.text段、其他区段,重组PE文件。同时,修改.text的SizeOfRawData、修改其他区段的PointerToRawData。

4、检测虚拟机,大概思路:动态获取遍历进程的几个函数,在壳里面检测虚拟机相关的进程。

5、IAT加密,大概思路:遍历被加壳程序的导入表,获取API函数地址,动态加密。申请内存空间,写入解密和跳转的shellcode。IAT表地址改为指向这个内存空间。

6、重定位,有多处需要重定位。

6.1、Stub.dll的.text段需要进行重定位,因为默认加载基址从0x10000000变成了0x400000。

6.2、要想被加壳程序支持重定位,需要把被加壳程序的重定表重定向Stub.dll的.reloc段。因为壳程序优先执行,利用系统自动完成壳部分的重定位。在壳程序中,手动完成目标程序的重定位。

7、TLS,需要在壳程序中定义一个TLS变量,佯装使用一下,编译的时候生成TLS相关的信息。然后,手动调用被加壳程序的TLS回调函数才能成功。

8、在码云有一个工程:https://gitee.com/shihuozhiyu/SimplePack

9、有一个脑图:

返回编程语言教程...