我尝试使用 Go 进行 DLL 注入,但失败了。我正在准备将用 C++ 注入的 DLL 文件。那是问题吗?用 C++ 编写的 DLL:我厌倦了像这样用 Go 注入 DLL 文件:但是当CreateRemoteThread()函数工作时,Notepad++ 被关闭了。为什么我失败了?我哪里做错了?TestD.dll 代码:#include "pch.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { MessageBox(NULL, L"DLL_PROCESS_ATTACH STARTED", L"DLL_PROCESS_ATTACH TITLE", MB_RETRYCANCEL); } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}Go InjectApp 代码:var dllPath = "C:\\Users\\RecaiCingoz\\go\\src\\TestD.dll" className := syscall.StringToUTF16Ptr("Notepad++") hwnd := win32services.FindWindowW(className, nil) fmt.Println("Process HWND", hwnd) _, processID := win32services.GetWindowThreadProcessId(hwnd) hProcess, _ := win32services.OpenProcess(win32services.PROCESS_ALL_ACCESS, false, uint32(processID)) baseAddress, _ := win32services.VirtualAllocEx(hProcess, 0, len(dllPath), win32services.MEM_COMMIT, win32services.PAGE_READWRITE) err := win32services.WriteProcessMemory(hProcess, uint32(baseAddress), []byte(dllPath), 0) if err != nil { fmt.Println(err) } modLib, _ := syscall.LoadLibrary("kernel32.dll") loadLib, err := syscall.GetProcAddress(modLib, "LoadLibraryA") if err != nil { fmt.Println(err) } hRemoteThread, _, err := win32services.CreateRemoteThread(hProcess, nil, 0, loadLib, baseAddress, 0)fmt.Println(hRemoteThread)}CreateRemoteProcess 函数:func CreateRemoteThread(hprocess HANDLE, sa *syscall.SecurityAttributes, stackSize uint32, startAddress uintptr, parameter uintptr, creationFlags uint32) (HANDLE, uint32, error) { var threadId uint32 if int(r1) == 0 { return INVALID_HANDLE, 0, e1 } return HANDLE(r1), threadId, e1}如何在 Go 中进行 DLL 注入?谁能帮我?
1 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
LoadLibrary 返回类型:syscall.Handle - 类型句柄 uintptr 。返回值:140715276042240 GetProcAddress 返回类型 uintptr。返回值:140715276174480
140715276042240 和 140715276174480 是截断的 x64 地址。x86的最大地址是0xFFFFFFFF,转换成十进制后变成4294967295。
你使用 GO(x64 版本) 编译程序,并使用uint32将地址转换为 x86 地址。最后,你得到一个无效的地址。这就是notepad++崩溃的原因。
解决方案:使用 GO(x86) 编译程序。
- 1 回答
- 0 关注
- 178 浏览
添加回答
举报
0/150
提交
取消
