注射C ++ DLL(Injecting C++ DLL)

2019-06-25 07:22发布

我知道有这个各种问题和书籍,但我似乎无法让我的C ++ DLL注入到所有进程。

代码注入DLL:

#include <iostream>
#include "windows.h"

bool Inject(DWORD pId, char *dllName);

using namespace std;

int main()
{
    Inject(600, "C:\\d.dll");
    return 0;
}

bool Inject(DWORD pId, char *dllName)
{
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, pId);
    if(h)
    {
        LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
        LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
        WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
        HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
        WaitForSingleObject(asdc, INFINITE);
        VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
        CloseHandle(asdc);
        CloseHandle(h);
        return true;
    }
    return false;
}

和DLL我试图注入:

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

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
switch (reason)
    {
      case DLL_PROCESS_ATTACH:
           MessageBox (0, "From DLL\n", "Process Attach", MB_ICONINFORMATION);
        break;

      case DLL_PROCESS_DETACH:
           MessageBox (0, "From DLL\n", "Process Detach", MB_ICONINFORMATION);
        break;

      case DLL_THREAD_ATTACH:
           MessageBox (0, "From DLL\n", "Thread Attach", MB_ICONINFORMATION);
        break;

      case DLL_THREAD_DETACH:
           MessageBox (0, "From DLL\n", "Thread Detach", MB_ICONINFORMATION);
        break;
    }

    return TRUE;
}

我不知道足够的C ++就知道这是怎么回事错误。 我对过程我试图注入到(以管理员身份运行藏汉过程)中运行进程资源管理器,但它不被注入。 当我运行它,什么都不会发生,任何想法?

Answer 1:

不要做MessageBoxDllMain 。 为什么? 看到:

  • DLL_PROCESS_ATTACH无法在Windows 7个C ++执行
  • 一些原因,不要做任何可怕的在你的DllMain
  • 不要在静态初始化/ DllMain中使用标准库/ CRT功能!

您的消息框可能显示有之前刚刚发生死锁。 为了确保你达到感兴趣的代码行中,使用OutputDebugString来代替。 正如你指出你所熟悉的进程资源管理器,您可能会注意到创建的线程有(你可以在你提供的最后一个参数获得它在你的发射器标识符CreateRemoteThread ),并与内核库里面执行其锁定状态。

这就是你需要把OutputDebugString

BOOL APIENTRY DllMain(HMODULE hModule, DWORD nReason, VOID* pvReserved)
{
    pvReserved;
    TCHAR pszMessage[1024] = { 0 };
    _stprintf_s(pszMessage, _T("GetCurrentProcessId() %d, hModule 0x%p, nReason %d\r\n"), GetCurrentProcessId(), hModule, nReason);
    OutputDebugString(pszMessage);
    /*switch(nReason)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }*/
    return TRUE;
}

确保另一件事是,你是正确加载的位元DLL。 Win32 DLL到Win32过程中,或x64 DLL到x64的过程。

UPDATE。 我把这个了来自评论:这里是在Visual Studio 2010项目,做事情的源代码: SVN或Trac的 。

  • 你把进程标识符为源代码
  • 该可执行文件创建远程线程和负载库
  • 图书馆从开始的DllMain并生成调试输出
  • DebugView显示了输出
  • ProcessExplorer显示您所创建的线程,你也有它的标识印刷


Answer 2:

你可能会碰到的问题是,LoadLibraryA()的应用程序中的地址可能不是在目标进程相同,由于ASLR -专为阻止你尝试活动的技术。 的Windows(Vista的+)的现代版本的这种默认的系统DLL启用

为了做到你想要什么,你需要实现在应用程序中加载您的DLL适当ThreadProc的,分配在你的目标过程中的一些可执行内存(PAGE_EXECUTE)内存,复制它在那里,并使用该地址作为线程启动点。



Answer 3:

管理员帐户不需要含蓄自己SE_DEBUG特权。 如果您在Vista / Win7的运行,确保UAC被禁用。 使用此代码,使您尝试打开进程的内存之前:

BOOL EnableDebugPrivilege()
{
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    if(!OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ))
    {
        return FALSE;
    }

    if(!LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid ))
    {
        return FALSE;
    }

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = luid;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if(!AdjustTokenPrivileges( hToken, false, &tkp, sizeof( tkp ), NULL, NULL ))
    {
        return FALSE;
    }

    if(!CloseHandle( hToken ))
    {
        return FALSE;
    }

    return TRUE;
}


Answer 4:

我将开始与其他人的工作实例,并从那里走。 示例项目,教程,并在CodeProject上的解释是非常坚实的。

这是一个对挂钩和DLL 。

而另一个 。 和谷歌搜索给你。

对于某些类型的挂钩,还有,你必须克服的许可限制,或者你必须接受,你不能挂钩每一道工序的事实。

设置界面,进入真实,并具有用C可执行文件:/ Program Files文件/,并让您的DLL数字签名有助于访问一些安全的Windows的Windows中。 这里有一个文章 ,讨论一些事情。

希望帮助。



Answer 5:

SetWindowsHookEx函数也可以注入你的DLL到另一个进程。



文章来源: Injecting C++ DLL
标签: c++ dll