C Windows DLL注入记事本崩溃



我已经在programmnepad.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 indector.exe indector.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崩溃

为什么记事本崩溃了?如果我将DLL文件注入程序,则可以工作:在此处输入图像描述

,现在请不要随身携带"然后我使用该程序而不是编写单独的喷油器"!这对我没有任何帮助!

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

  1. 运行远程线程时,尝试映射LoadLibrarya方法。大多数现代应用都使用LoadLibraryw或仅根据编译器模式使用默认值的LoadLibrary。
  2. 您使用GCC,为什么不使用Microsoft编译器?编译器之间可能存在映射问题,以阻止您将GCC生成的代码与(可能)VCC编译器..
  3. 链接起来。

hop它有助于

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

这是我通过远程线程的DLL注入的正确工作变体,我将其写为您的演示示例。这是一个快速的例子,所以不要期望太多,非常简单。您可以使用Shell-Code注入来改进它,然后使用手动地图加载程序或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感兴趣。至于createMoteThread,它将无法与其他用户帐户上的流程一起使用,而rtlCreateuserThread/ntcreateThreadex都将(只要您拥有调试权利 - sedebugprivilege)。

)。 )。

作为最后一个指针,请确保使用/MT编译,以便在静态上链接运行时(尤其是对于您要注入的DLL)。如果我的示例代码对您没有帮助,并且您仍然无法解决问题,请尝试使用调试器诊断问题。您应该已经尝试这样做了,辩论者在那里是有原因的!

最新更新