没有找到适合的图片
好久没写博客了随便写写
反射dll技术什么的已经出现了很久了原理什么的自己谷歌看看吧,懒得写
这里利用的就是cgo(golang 和 C 语言相互调)把go和c的反射dll核心代码结合了一下
这个模板可以很方便的把go代码编译成反射dll文件
直接上关键文件代码
dllmain.c
#include "dllmain.h" #includeDWORD WINAPI MyThreadFunction() { OnProcessAttach(); return 0; } BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpReserved) // reserved { switch (_fdwReason) { case DLL_PROCESS_ATTACH: { OnProcessAttach(); MyThreadFunction(); } break; case DLL_PROCESS_DETACH: // Perform any necessary cleanup. break; case DLL_THREAD_DETACH: // Do thread-specific cleanup. break; case DLL_THREAD_ATTACH: // Do thread-specific initialization. break; } return TRUE; // Successful. }
main.go
package main import "C" import ( "syscall" "unsafe" ) func IntPtr(n int) uintptr { return uintptr(n) } func StrPtr(s string) uintptr { return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s))) } func MessageBox(title, text string) { user32 := syscall.NewLazyDLL("user32.dll") MessageBoxW := user32.NewProc("MessageBoxW") MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0)) } //export OnProcessAttach func OnProcessAttach() { MessageBox("OnProcessAttach","OnProcessAttach") } //export test func test() { MessageBox("test","test") } func main() { }
其他文件去github看吧
支持编译为x86和x64
x64.bat编译为x64 dll
x86.bat编译为x86 dll
测试
github地址:https://github.com/WBGlIl/go-ReflectiveDLL
想深入了解原理的可以自己去研究一下其中使用的一些技术比如反射dll cgo什么的