C DLL 注入失败[重复]

问题描述 投票:0回答:1

我试图将 DLL 注入记事本并使其显示 MessageBox,但什么也没有发生。我对此很陌生,但我确信它应该有效。

我目前正在将此代码用于 DLL 文件 (Dllinj.dll):

#include <Windows.h>
    
/*
__declspec(dllexport) int message() {
          
}
*/
    
BOOL APIENTRY DllMain(HMODULE hModule,  DWORD  nReason, LPVOID lpReserved) {
   MessageBox(NULL,"Injected!",MB_OK);
   return TRUE;
}

并用这一行进行编译:

gcc dllinj.cpp -o dllinj.dll -shared

我已经尝试过nefarius注射器。它返回错误远程进程中对 LoadLibraryW 的调用失败。,但我检查了进程架构,我知道它已经是 64 位,并且我正在编译为 64 位。

我读过这篇关于同样问题的文章,但由于解决方案只是改变IDE,我无法自己修复它,因为我没有使用任何IDE。是的,我看到答案说 MessageBox 在 DllMain 函数中不起作用,所以这就是它不显示的原因,但在我的例子中,dll 甚至没有首先注入。

还尝试了我在此页面上找到的注入器代码。它实际上返回了一个错误,但我不确定我在这里做错了什么。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <tlhelp32.h>

char evilDLL[] = "C:\\Users\\ACER\\Desktop\\tcc\\Dllinj.dll";
unsigned int evilLen = sizeof(evilDLL) + 1;

void HandleError(const char* message) {
    perror(message);
    exit(EXIT_FAILURE);
}

int main(int argc, char* argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
        return EXIT_FAILURE;
    }

    HANDLE ph = OpenProcess(PROCESS_ALL_ACCESS, FALSE, atoi(argv[1]));
    if (ph == NULL) {
        HandleError("Error opening process");
    }

    LPVOID rb = VirtualAllocEx(ph, NULL, evilLen, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (rb == NULL) {
        CloseHandle(ph);
        HandleError("Error allocating memory in the remote process");
    }

    if (!WriteProcessMemory(ph, rb, evilDLL, evilLen, NULL)) {
        CloseHandle(ph);
        VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
        HandleError("Error writing to remote process memory");
    }

    HMODULE hKernel32 = GetModuleHandle("Kernel32");
    if (hKernel32 == NULL) {
        CloseHandle(ph);
        VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
        HandleError("Error getting handle to Kernel32");
    }

    FARPROC lb = GetProcAddress(hKernel32, "LoadLibraryA");
    if (lb == NULL) {
        CloseHandle(ph);
        VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
        HandleError("Error getting address of LoadLibraryA");
    }

    HANDLE rt = CreateRemoteThread(ph, NULL, 0, (LPTHREAD_START_ROUTINE)lb, rb, 0, NULL);


    if (rt == NULL) {
        CloseHandle(ph);
        VirtualFreeEx(ph, rb, 0, MEM_RELEASE);
        HandleError("Error creating remote thread");
    }

    // Wait for the remote thread to finish
    WaitForSingleObject(rt, INFINITE);



    CloseHandle(rt);
    CloseHandle(ph);
    VirtualFreeEx(ph, rb, 0, MEM_RELEASE);

    return 0;
}

用这一行编译:

g++ -O2 injector.cpp -o injector.exe -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive

用这行代码运行:

injector.exe 10008

我得到以下输出:

Error creating remote thread: No error

是的,我确定进程 PID 是 10008,我在进程黑客和进程管理器中检查过。

我还尝试使用process hacker来查看我的dll是否被上面的代码注入到记事本中,但我也没有找到任何名为“Dllinj.dll”的dll。

我也尝试过作弊引擎 dll 注入器,但出现此错误: Error

所有这些让我相信问题出在 dll 编译过程或代码本身,尽管我不确定问题是什么。

我对这种对 Windows 内核的低级访问很陌生,所以请不要对我无礼。预先感谢。

c++ c winapi dll
1个回答
0
投票
HANDLE rt = CreateRemoteThread(..., NULL);

该参数 (lpThreadId) 不是可选的。将指针传递给您自己的堆栈上的

DWORD

DWORD junk;
HANDLE rt = CreateRemoteThread(..., &junk);
© www.soinside.com 2019 - 2024. All rights reserved.