如何进行dll注入

我尝试使用 Go 进行 DLL 注入,但失败了。

我正在准备将用 C++ 注入的 DLL 文件。那是问题吗?

用 C++ 编写的 DLL:

http://img3.mukewang.com/62b91eb30001d62514200947.jpg

我厌倦了像这样用 Go 注入 DLL 文件:

http://img3.mukewang.com/62b91ebe0001967b18551076.jpg

但是当CreateRemoteThread()函数工作时,Notepad++ 被关闭了。

http://img4.mukewang.com/62b91ecc0001779d17611077.jpg

为什么我失败了?我哪里做错了?


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 注入?谁能帮我?


慕哥6287543
浏览 179回答 1
1回答

子衿沉夜

LoadLibrary 返回类型:syscall.Handle - 类型句柄 uintptr 。返回值:140715276042240 GetProcAddress 返回类型 uintptr。返回值:140715276174480140715276042240 和 140715276174480 是截断的 x64 地址。x86的最大地址是0xFFFFFFFF,转换成十进制后变成4294967295。你使用 GO(x64 版本) 编译程序,并使用uint32将地址转换为 x86 地址。最后,你得到一个无效的地址。这就是notepad++崩溃的原因。解决方案:使用 GO(x86) 编译程序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go