mirror of
https://github.com/teest114514/chatlog_alpha.git
synced 2026-03-24 07:32:07 +08:00
新增DLL方式的微信数据库密钥提取(优先于原生方式),集成wx_key.dll相关代码和开发文档,完善临时账户名称与进程PID的动态管理,增强微信进程状态监控和自动切换逻辑。更新README,详细说明项目功能、使用方法和DLL集成指南。
171 lines
3.5 KiB
Go
171 lines
3.5 KiB
Go
package util
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
// DLLLogger DLL日志记录器
|
||
type DLLLogger struct {
|
||
mu sync.Mutex
|
||
logFile *os.File
|
||
logPath string
|
||
enabled bool
|
||
}
|
||
|
||
var (
|
||
dllLogger *DLLLogger
|
||
dllLoggerOnce sync.Once
|
||
)
|
||
|
||
// GetDLLLogger 获取DLL日志记录器单例
|
||
func GetDLLLogger() *DLLLogger {
|
||
dllLoggerOnce.Do(func() {
|
||
dllLogger = &DLLLogger{
|
||
enabled: true,
|
||
}
|
||
// 尝试初始化日志文件
|
||
dllLogger.initLogFile()
|
||
})
|
||
return dllLogger
|
||
}
|
||
|
||
// initLogFile 初始化日志文件
|
||
func (l *DLLLogger) initLogFile() {
|
||
if !l.enabled {
|
||
return
|
||
}
|
||
|
||
// 获取当前工作目录
|
||
workDir, err := os.Getwd()
|
||
if err != nil {
|
||
// 如果获取失败,使用默认工作目录
|
||
workDir = DefaultWorkDir("")
|
||
}
|
||
|
||
// 创建日志目录
|
||
logDir := filepath.Join(workDir, "logs")
|
||
if err := os.MkdirAll(logDir, 0755); err != nil {
|
||
// 如果创建目录失败,禁用日志
|
||
l.enabled = false
|
||
return
|
||
}
|
||
|
||
// 生成日志文件名:dll_YYYYMMDD_HHMMSS.log
|
||
timestamp := time.Now().Format("20060102_150405")
|
||
logFileName := fmt.Sprintf("dll_%s.log", timestamp)
|
||
l.logPath = filepath.Join(logDir, logFileName)
|
||
|
||
// 创建日志文件
|
||
file, err := os.OpenFile(l.logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||
if err != nil {
|
||
l.enabled = false
|
||
return
|
||
}
|
||
|
||
l.logFile = file
|
||
}
|
||
|
||
// LogError 记录错误信息
|
||
func (l *DLLLogger) LogError(message string) {
|
||
l.log("ERROR", message)
|
||
}
|
||
|
||
// LogStatus 记录状态信息
|
||
func (l *DLLLogger) LogStatus(level int, message string) {
|
||
var levelStr string
|
||
switch level {
|
||
case 0:
|
||
levelStr = "INFO"
|
||
case 1:
|
||
levelStr = "SUCCESS"
|
||
case 2:
|
||
levelStr = "ERROR"
|
||
default:
|
||
levelStr = "UNKNOWN"
|
||
}
|
||
l.log(levelStr, message)
|
||
}
|
||
|
||
// LogInfo 记录普通信息
|
||
func (l *DLLLogger) LogInfo(message string) {
|
||
l.log("INFO", message)
|
||
}
|
||
|
||
// LogDebug 记录调试信息
|
||
func (l *DLLLogger) LogDebug(message string) {
|
||
l.log("DEBUG", message)
|
||
}
|
||
|
||
// LogWarning 记录警告信息
|
||
func (l *DLLLogger) LogWarning(message string) {
|
||
l.log("WARNING", message)
|
||
}
|
||
|
||
// log 内部日志记录函数
|
||
func (l *DLLLogger) log(level, message string) {
|
||
if !l.enabled || l.logFile == nil {
|
||
return
|
||
}
|
||
|
||
l.mu.Lock()
|
||
defer l.mu.Unlock()
|
||
|
||
timestamp := time.Now().Format("2006-01-02 15:04:05.000")
|
||
logEntry := fmt.Sprintf("[%s] [%s] %s\n", timestamp, level, message)
|
||
|
||
if _, err := l.logFile.WriteString(logEntry); err != nil {
|
||
// 写入失败,关闭文件并禁用日志
|
||
l.logFile.Close()
|
||
l.logFile = nil
|
||
l.enabled = false
|
||
}
|
||
}
|
||
|
||
// GetLogPath 获取日志文件路径
|
||
func (l *DLLLogger) GetLogPath() string {
|
||
return l.logPath
|
||
}
|
||
|
||
// IsEnabled 检查日志是否启用
|
||
func (l *DLLLogger) IsEnabled() bool {
|
||
return l.enabled
|
||
}
|
||
|
||
// Close 关闭日志文件
|
||
func (l *DLLLogger) Close() {
|
||
l.mu.Lock()
|
||
defer l.mu.Unlock()
|
||
|
||
if l.logFile != nil {
|
||
l.logFile.Close()
|
||
l.logFile = nil
|
||
}
|
||
l.enabled = false
|
||
}
|
||
|
||
// LogInitialization 记录DLL初始化信息
|
||
func (l *DLLLogger) LogInitialization(pid uint32, success bool, errorMsg string) {
|
||
if success {
|
||
l.LogStatus(1, fmt.Sprintf("DLL初始化成功,PID: %d", pid))
|
||
} else {
|
||
l.LogError(fmt.Sprintf("DLL初始化失败,PID: %d, 错误: %s", pid, errorMsg))
|
||
}
|
||
}
|
||
|
||
// LogPolling 记录轮询信息
|
||
func (l *DLLLogger) LogPolling(keyFound bool, key string, keyType string) {
|
||
if keyFound {
|
||
l.LogStatus(1, fmt.Sprintf("找到%s密钥: %s", keyType, key))
|
||
} else {
|
||
l.LogStatus(0, "轮询中...")
|
||
}
|
||
}
|
||
|
||
// LogCleanup 记录清理信息
|
||
func (l *DLLLogger) LogCleanup() {
|
||
l.LogStatus(0, "DLL资源已清理")
|
||
} |