Golang Shellcode 注入技术详解:加密、解密和执行
该代码主要实现了一个使用 Golang 对二进制文件进行加密、解密和执行的程序,具体功能如下:
-
导入必要的包:
crypto/aes:用于 AES 加密crypto/cipher:用于创建流密码器crypto/rand:用于生成随机密钥encoding/base64:用于 Base64 编码和解码io/ioutil:用于读取文件reflect:用于动态调用函数time:用于延时unsafe:用于指针操作golang.org/x/sys/windows:用于调用 Windows API 函数
-
定义全局变量:
kernel32:Windows kernel32.dll 的懒加载库ntdll:Windows ntdll.dll 的懒加载库VirtualAlloc:用于申请内存空间的函数指针RtlMoveMemory:用于将数据复制到内存的函数指针CreateThread:用于创建线程的函数指针
-
生成随机密钥函数:
generateKey():使用rand.Read()生成 32 字节的随机密钥
-
加密函数:
encrypt(key []byte, data []byte):使用 AES-CTR 模式加密数据,具体步骤如下:- 使用
aes.NewCipher()生成加密块 - 使用
cipher.NewCTR()生成流密码器 - 使用
stream.XORKeyStream()对数据进行加密
- 使用
-
编码和解码函数:
encode(src string):将原始数据加密,并使用 Base64 编码,返回密钥和加密数据字符串decode(src string):将 Base64 解码后的数据使用密钥解密,返回原始数据
-
执行 shellcode 函数:
exec(charcode []byte):- 使用
VirtualAlloc()申请可执行内存空间 - 使用
RtlMoveMemory()将 shellcode 复制到申请的内存空间 - 使用
CreateThread()创建线程并执行 shellcode
- 使用
-
读取文件函数:
readFile(filename string):使用ioutil.ReadFile()读取文件内容
-
主函数:
- 读取
payload.bin文件内容 - 对文件内容进行加密和编码
- 对编码后的数据进行解码,获取 shellcode
- 使用
reflect包将exec函数转换为reflect.Value类型 - 将 shellcode 作为参数调用
exec函数,执行 shellcode
- 读取
代码使用 AES 加密和 Base64 编码对 shellcode 进行保护,并通过 Windows API 函数 VirtualAlloc、RtlMoveMemory 和 CreateThread 将 shellcode 注入到内存并执行。这是一种常见的 shellcode 注入技术,需要注意的是,该代码仅用于学习和研究目的,不可用于非法活动。
原文地址: https://www.cveoy.top/t/topic/lKSL 著作权归作者所有。请勿转载和采集!