之前,花了三、四天的时间写了一个压缩壳,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、有一个脑图:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。