为了账号安全,请及时绑定邮箱和手机立即绑定

如何进行dll注入

如何进行dll注入

Go
慕哥6287543 2022-06-27 11:06:06
我尝试使用 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) 编译程序。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号