106 lines
3.0 KiB
Go
106 lines
3.0 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"syscall"
|
||
)
|
||
|
||
func loadDLL(dllPath string) (syscall.Handle, error) {
|
||
if _, err := os.Stat(dllPath); os.IsNotExist(err) {
|
||
return 0, fmt.Errorf("DLL file does not exist: %s", dllPath)
|
||
}
|
||
|
||
dll, err := syscall.LoadLibrary(dllPath)
|
||
if err != nil {
|
||
return 0, fmt.Errorf("load DLL failed: %v", err)
|
||
}
|
||
|
||
globalLogger.Info("[辅助程序] 成功加载DLL: %s", dllPath)
|
||
return dll, nil
|
||
}
|
||
|
||
func getLoaderProcAddress(dll syscall.Handle, name string, legacyOffset uintptr) (uintptr, error) {
|
||
addr, err := syscall.GetProcAddress(dll, name)
|
||
if err == nil && addr != 0 {
|
||
return addr, nil
|
||
}
|
||
bundle := resolveDLLBundle()
|
||
if supportsLegacyLoaderOffsets(bundle.LoaderVersion) {
|
||
globalLogger.Warn("[辅助程序] Loader %s 未导出 %s,回退使用旧版偏移 0x%x", bundle.LoaderVersion, name, legacyOffset)
|
||
return uintptr(dll) + legacyOffset, nil
|
||
}
|
||
return 0, fmt.Errorf("Loader %s does not export %s; legacy offsets are only allowed for %s", bundle.LoaderVersion, name, fallbackDLLVersion)
|
||
}
|
||
|
||
func supportsLegacyLoaderOffsets(version string) bool {
|
||
switch version {
|
||
case fallbackDLLVersion, "5.0.8.6009":
|
||
return true
|
||
default:
|
||
return false
|
||
}
|
||
}
|
||
|
||
func getLoaderFunctions(dll syscall.Handle) (*LoaderFunctions, error) {
|
||
const (
|
||
GetUserWxWorkVersion = 0x4B70
|
||
UseUtf8 = 0x4A60
|
||
UseRecvJsUnicode = 0x4AC0
|
||
InitWxWorkSocket = 0x4B10
|
||
SetDataLocationPath = 0x5460
|
||
InjectWxWork = 0x4BF0
|
||
InjectWxWorkMultiOpen = 0x4E80
|
||
InjectWxWorkPid = 0x50D0
|
||
DestroyWxWork = 0x5310
|
||
SendWxWorkData = 0x5800
|
||
)
|
||
|
||
var err error
|
||
funcs := &LoaderFunctions{}
|
||
|
||
funcs.GetUserWxWorkVersion, err = getLoaderProcAddress(dll, "GetUserWxWorkVersion", GetUserWxWorkVersion)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.UseUtf8, err = getLoaderProcAddress(dll, "UseUtf8", UseUtf8)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.UseRecvJsUnicode, err = getLoaderProcAddress(dll, "UseRecvJsUnicode", UseRecvJsUnicode)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.InitWxWorkSocket, err = getLoaderProcAddress(dll, "InitWxWorkSocket", InitWxWorkSocket)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.SetDataLocationPath, err = getLoaderProcAddress(dll, "SetDataLocationPath", SetDataLocationPath)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.InjectWxWorkPid, err = getLoaderProcAddress(dll, "InjectWxWorkPid", InjectWxWorkPid)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.DestroyWxWork, err = getLoaderProcAddress(dll, "DestroyWxWork", DestroyWxWork)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.InjectWxWork, err = getLoaderProcAddress(dll, "InjectWxWork", InjectWxWork)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.InjectWxWorkMultiOpen, err = getLoaderProcAddress(dll, "InjectWxWorkMultiOpen", InjectWxWorkMultiOpen)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
funcs.SendWxWorkData, err = getLoaderProcAddress(dll, "SendWxWorkData", SendWxWorkData)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
globalLogger.Info("[辅助程序] 成功获取Loader DLL函数指针")
|
||
return funcs, nil
|
||
}
|