前言
试想我们开辟一块内存,然后直接将shellcode写入到对应的内存中并且该内存是可读可写可执行的状态,那么这种方式太容易被AV所查杀,因此当我们如果是利用Windows自身提供的API来将加密或者封装好的shellcode写入到内存执行的话,将会大大增加查杀的难度。
参考文章:CS shellcode内存加载器免杀及实现-安全客 - 安全资讯平台
UUID内存加载
通用唯一识别码(UUID),是用于计算机体系中以识别信息数目的一个128位标识符,根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性。也就是说我们把shellcode封装成UUID,然后再去执行它。
C/C++
代码没特别的网上找的,封装成C/C++的格式,先把shellcode封装成UUID。
大概就是这个样子。
C/C++语言的加载代码也是网上找的,或者我上面引用的文章有。
接着再去执行它,成功上线。
编译成exe测试一下,火绒没查杀到。
但是VT上面火绒又能查杀到,奇怪。
360落地就杀。
WD也是落地就杀,WD都查杀到了,火绒居然没查杀到???
C#
我们来试试用C#去把shellcode封装为UUID,封装代码和C/C++差不多,但是这里要用64位的shellcode。
生成的和上面的也差不多。
再利用一个C#的加载器去执行它.
生成exe看看效果,火绒能查杀到。
WD查杀能到。
360也能查杀到,看起来效果不太好。
python
试试python语言,同理先把shellcode转为UUID地址,这里用32位的shellcode。
转换后是这样子滴。
网上找的python加载器,直接把UUID参数换成上面我们生成的,注意这里要用python2去执行,因为UuidFromStringA这个函数只有python才有。
用pyinstaller编译成exe测试一下免杀性,火绒能过。
360查杀到。
WD也能过。
VT报9九个,中规中矩。
GOlang
再试试go语言,同样的道理,先把shellcode转为UUID地址,也是要用64位的shellcode,因为我只找到64位转化的脚本。
go语言的加载器脚本。
编译成exe,火绒没过。
go build 文件名
WD也没过。
360不用说啦,肯定也是不过滴。
如果结合我们前面说过的分离免杀或者加壳,可能效果会更好,这里我就不演示了。
MAC地址
除了封住成为UUID,还可以把shellcode封装成MAC地址。
python
shellcode用64位的,转换脚本不用多说,也是网上找的,我自己写不出来。
生成的Mac地址,这里如果python3不行就换python2。
接着用加载器去执行,还是那句话网上找的,自己写不出来。
编译成exe,火绒静态能过,但是执行起来就被杀,根据提示是检测了内存行为。
360可以查杀到。
WD没问题滴。
GOlang
再试试go语言。
转换为Mac地址。
加载器加载地址,由于我在运行的时候一直在报错,所以就没能上线,估计是环境出了问题。
有懂的师傅可以指教一下,或者找我拿源码测试。
IPV4地址
最后把shellcode封装成IPV4地址效果会不会更好。
GOlang
利用脚本把shellcode转换成IPV4地址。
转换后看起来有点奇怪。
同上,环境问题没能运行脚本,就不测试了,有兴趣的可以找我拿源码。
总结
原理其实不难,就是把shellcode变成地址,根本原理还是混淆。这个go的环境太搞了,老是报错,qnm的。
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。