C Windows DLL注入记事本崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C Windows DLL注入记事本崩溃相关的知识,希望对你有一定的参考价值。

我在Program Notepad.exe上尝试过DLL注入

但如果我启动我的注射器,记事本会崩溃。这是我的注射器代码:

#include <windows.h>
#include <stdio.h>

char const Path[]="C:\Users\IEUser\Desktop\Mydll.dll";
int main(void) {

    HANDLE hWnd, hProcess, AllocAdresse, hRemoteThread;
        DWORD PID;

        hWnd = FindWindow(0,"Untitled - Notepad");
        GetWindowThreadProcessId((HWND)hWnd, &PID);

        hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);

        AllocAdresse = VirtualAllocEx(hProcess, 0, sizeof(Path), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        WriteProcessMemory(hProcess, (void*)AllocAdresse, (void*)Path, sizeof(Path), 0);
        hRemoteThread=CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), AllocAdresse, 0, 0);
        WaitForSingleObject(hRemoteThread, INFINITE);
        VirtualFreeEx(hProcess, AllocAdresse, sizeof(Path), MEM_DECOMMIT);
        CloseHandle(hProcess);
        return 0;
}

这是我的DLL文件的代码:

#include <windows.h>
#include <stdio.h>

void InjNachricht() {
    MessageBox(0, "It Works", "My DLL File", 0);
}

int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved) {
    if(reason==DLL_PROCESS_ATTACH)
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InjNachricht, 0, 0, 0);
    return 0;
}

我使用MinGW在我的Linux机器上编译此代码:

(注射器)i686-w64-mingw32-gcc -o Injector.exe injector.c (DLL-File)i686-w64-mingw32-gcc -o Mydll.dll mydll.c

我还写了一个设置调试权限的函数:

void SetDebugPrivilege() {
    HANDLE hProcess=GetCurrentProcess(), hToken;
    TOKEN_PRIVILEGES priv;
    LUID luid;

    OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
    LookupPrivilegeValue(0, "seDebugPrivilege", &luid);

    priv.PrivilegeCount = 1;
    priv.Privileges[0].Luid = luid;
    priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);

    CloseHandle(hToken);
}

如果我在我的虚拟机中运行我的程序:Notepad.exe Crash

为什么记事本会崩溃?如果我用程序注入我的DLL文件它工作:enter image description here

请不要现在跟我来“然后我用程序而不是写一个单独的注射器”!!这对我没有任何帮助!

答案

首先,您可以使用strlen / wcslen(首先用于Ascii编码,后者用于Unicode编码)来计算缓冲区的长度。在我看来这更合适。

这是通过远程线程进行DLL注入的正常工作变体,我已经为您编写了示例。这是一个快速的例子,所以不要期望太多,非常简单。您可以使用shell代码注入来改进它,然后使用手动地图加载器或LdrLoadDll。

BOOLEAN InjectDll(
    HANDLE ProcessHandle,
    CHAR *DllPath
)
{
    BOOLEAN BlStatus = FALSE;
    HANDLE ThreadHandle = 0;
    PVOID LoadLibraryAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    PVOID DllMemory = 0;
    SIZE_T DllLength = strlen(DllPath);

    if (!ProcessHandle ||
        !DllPath ||
        !LoadLibraryAddress)
    {
        return FALSE;
    }

    DllMemory = VirtualAllocEx(ProcessHandle,
        NULL,
        DllLength,
        MEM_RESERVE | MEM_COMMIT,
        PAGE_READWRITE);

    if (!DllMemory)
    {
        return FALSE;
    }

    BlStatus = WriteProcessMemory(ProcessHandle,
        DllMemory,
        DllPath,
        DllLength,
        NULL);

    if (!BlStatus)
    {
        goto cleanup;
    }

    ThreadHandle = CreateRemoteThread(ProcessHandle,
        NULL,
        0,
        (LPTHREAD_START_ROUTINE)LoadLibraryAddress,
        DllMemory,
        0,
        0);

cleanup:
    if (!ThreadHandle)
    {
        if (DllMemory)
        {
            VirtualFree(DllMemory,
                NULL,
                MEM_RELEASE);
        }

        BlStatus = FALSE;
    }
    else
    {
        BlStatus = TRUE;
    }

    return BlStatus;
}

在这方面,您可能对NtOpenProcess,NtAllocateVirtualMemory,NtWriteVirtualMemory,RtlCreateUserThread / NtCreateThreadEx和NtAdjustPrivilegesToken感兴趣。至于CreateRemoteThread,它不适用于其他用户帐户上的进程,而RtlCreateUserThread / NtCreateThreadEx都会(只要你有调试权限 - SeDebugPrivilege)。

作为最后一个指针,请确保使用/ MT进行编译,以便运行时静态链接(特别是对于您正在注入的DLL)。如果我的示例代码对您没有帮助,但您仍然无法解决问题,请尝试使用调试程序来诊断问题。您应该已经尝试过这样做,调试器是有原因的!

另一答案

我做了这些事情已经有一段时间了,所以我可能会离开,但是:

  1. 您尝试在运行远程线程时映射LoadLibrary方法。大多数现代应用程序使用LoadLibrary或仅使用LoadLibrary,它将使用基于编译器模式的默认值。
  2. 你使用gcc,为什么不使用Microsoft编译器?编译器之间可能存在映射问题,这会阻止您将gcc生成的代码与(可能)vcc编译器链接起来....

跳它有帮助

以上是关于C Windows DLL注入记事本崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用挂钩函数时应用程序崩溃

将 dll 注入 Windows 10 记事本

程序在 Windows 中跨 DLL 边界使用嵌入式 Python/C++ 代码崩溃

我在试着做一个木马Loader注入记事本然后CreateRemoteThread启动DLL 但是似乎注入成功,DLL没有启动

C# Dll 注入器、VB.Net Dll 注入器

dll文件怎么打开