细说自解压 Fay·D·Flourite

细说自解压

杂谈

其实一开始对自解压并无多大兴趣,当时对它的印象就只有捆绑安装,像是安装包一类的东西其实都是自解压,像xx软件园,xx之家中下的exe,大多数都是捆绑垃圾软件的自解压exe,当时没有细想,体验了一下发现有解压提示,执行也只能执行单个文件,没法做到欺骗效果,最多会有个dll劫持,也就是把目标exe和我们的dll捆绑到一起,在执行目标exe时优先使用当前目录下的dll,这样来利用。

前些日子有些想法想搞自动化生成钓鱼木马,也就是想办法能在短时间内将一个指定的exe捆绑上payload。让payload先于pe文件执行,然后继续执行pe文件,这很容易联想到加壳。

但是总感觉这个捆绑过程有些相似…payload和pe文件捆绑为一个可执行文件…这不就和自解压一样么?于是有了了解自解压原理的想法

自解压简介

自解压英文为SelF-eXtracting,缩写SFX,sfx文件也是可执行文件,以exe为后缀(当然linux也能自解压,这个后面再说),一个自解压程序有三个部分,一是sfx开头,二是配置文件txt,三是压缩内容

  • sfx开头

sfx开头即是解压缩程序,是真正执行的部分

  • 配置文件txt

配置文件记录了包括sfx程序需要的一些参数,压缩文件的一些信息等

  • 压缩内容

就是纯纯的压缩内容,sfx文件要处理的东西

这是大概的结构,而且他们三个部分就是完完全全独立的三个部分,对!完全独立。当然了,你也可以不独立,但是对于7z和winrar自解压的实现方式来说,他们是独立的三个部分,甚至可以用copy命令将7z的sfx压缩模块,config.txt,和7z压缩玩的文件三个连起来实现一个自解压文件。

实现过程也就清晰了,sfx压缩模块读取config.txt中的内容,获取要压缩文件的信息(起始地址,大小之类的),进去解压,然后安装config.txt中的要求执行就行。

实现

听起来是不是很简单?当然,我之前追求的是类似压缩壳那样的办法,解压完直接跳入口点继续执行,不过就目前看起来自解压的方法就完全够用,甚至去除压缩算法,好像我们只需要写一个程序,先执行我们的payload,然后,按照config.txt把后面附加的主程序读出来创建一个新文件,然后执行那个文件,再退出程序就完成了。

再按照上面的思想,想自动化过程简化为了读取目标程序,获取大小,图标,信息之类的,创建config.txt文件,再将我们的payload程序,config.txt,目标程序合三为一,一个捆绑完成的木马就完成了。

甚至比起压缩壳还有一定的优点,例如图片,文档这类非可执行文件也可以打开了,因为我们根本就不是用打开pe文件的方式打开需要的文件的。附加一些类似反转字符串的小trick搞一个看起来是jpg后缀的文件,上钩概率upup。

再到linux的自解压,一个用于解压的bash文件和后面的压缩部分合并,执行完bash部分将后面的压缩部分放出来,就和windows一样。

细节

  1. 去掉控制台窗口。

    这个技巧之前python就用过,原本代码实现是找自身标题的窗口,用showwindows函数给隐藏了,但是缺点是启动时还是会一闪而过一个黑窗,后来发现pyinstaller可以直接打包成无控制台窗口的exe文件,就觉得这个应该是和编译时的设置有关(也确实是),创建一个控制台程序,在编译的时候设置应用程序的输出类型为windows应用程序,程序就不会显示控制台窗口运行了

  2. 以何种方式打开绑定的文件最好。

    之前也写过打开其他进程注入shellcode来隐藏自己的方式,目的是为了让shellcode在一个看似正常的应用下执行,达到隐藏的效果。实现方式是createprocess创建一个挂起的进程,然后往内存中写shellcode,修改内存块属性然后恢复进程。

    但是,createprocess达不到我们打开图片,文本文档之类的事情,它只能打开一个进程。最好的方式其实是简朴的打开一个cmd然后静默运行我们需要运行的东西…就和windows打开文件的方式一样,不会有任何差别。