DLL远程注入一则

2023-05-16

1. 线程注入一注入的可行性
kernel32.dll user32.dll 是两个在大部分程序上都会调用的 DLL 同一个 DLL ,在不同的进程中,不一定被映射(加载)在同一个内存地址下。但是 kernel32.dll和 user32.dll 例外。他们总是被映射到进程的内存首选地址因此,在所有使用这两个 DLL 的 进程中,这两个 DLL 的内存地址是相同的。我们在本进程获取的 kernel32.dli 中函数的地址, 在目标进程中也是一样的。
2. 涉及的 API
OpenProcess // 获取已知进程的句柄
VirtualAllocEx // 在进程申请空间
WriteProcessMemory // 向进程写入东西
GetProcAddress // 取得函数在 DLL 的地址
CreateRemoteThreadEx // 在其他进程中创建新线程
CloseHandle // 关闭句柄
3. 待注入dll项目testDll.dll的代码
// dllmain.cpp : 定义 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"if you see this, testDll.dll had been inject in this Process", L"hi", MB_ICONINFORMATION | MB_OK);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

4. 注入代码

// RemoteInject.cpp : 定义应用程序的入口点。
//

#include "framework.h"
#include <shellapi.h>
#include <tlhelp32.h>
#include <string>
#include <thread>

DWORD processFind(LPCWSTR exeName) 
{ 
    HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 
    if(!hProcess) 
        return 0; 

    PROCESSENTRY32 info; 
    info.dwSize = sizeof(PROCESSENTRY32); 
    if(!Process32First(hProcess, &info))
        return 0; 

    while(true) 
    { 
        if(!wcscmp(info.szExeFile, exeName)) 
            return info.th32ProcessID; 

        if(!Process32Next(hProcess, &info)) 
            return 0; 
    }

    return 0;
}

BOOL Inject(DWORD processId, LPCWSTR dllPath) 
{ 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, processId);
    if(!hProcess) 
        return FALSE; 
    
    SIZE_T pathSize = (wcslen(dllPath) + 1) * sizeof(wchar_t);
    LPVOID startAddr = VirtualAllocEx(hProcess, NULL, pathSize, MEM_COMMIT, PAGE_READWRITE); 
    if(!startAddr) 
        return FALSE; 
    if(!WriteProcessMemory(hProcess, startAddr, dllPath, pathSize, NULL)) 
        return FALSE; 
    
    PTHREAD_START_ROUTINE pFuncStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW"); 
    if(!pFuncStartAddr) 
        return FALSE; 
    
    HANDLE hThread = CreateRemoteThreadEx(hProcess, NULL, NULL, pFuncStartAddr, startAddr, NULL, NULL, NULL); 
    if(!hThread) 
        return FALSE; 
    
    WaitForSingleObject(hThread, INFINITE); 
    CloseHandle(hThread);
    CloseHandle(hProcess); 
    
    return TRUE; 
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    //运行windows自带的记事本程序
    ShellExecute(0, L"open", L"notepad.exe", L"", L"", SW_SHOWNORMAL);
    bool b = false;

    std::thread th([&]() {
        ::Sleep(100);
        DWORD id = processFind(L"notepad.exe");
        if (!id)
        {
            b = true;
            return;
        }

        wchar_t szPath[MAX_PATH];
        if (!GetModuleFileNameW(NULL, szPath, MAX_PATH))
        {
            b = true;
            return;
        }

        std::wstring str = szPath;
        size_t pos = str.find_last_of(L"\\");
        str = str.substr(0, pos + 1);
        str += L"testDll.dll";
        Inject(id, str.c_str());
        b = true;
        });

    th.detach();
    
    while (!b)
    {
        std::this_thread::yield();
    }

    return 0;
}

5. 界面显示

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DLL远程注入一则 的相关文章

  • 将.exe项目转换为类库

    我在 Visual Studio 2010 Ultimate 中有一个半大型 C exe 项目 我想将其转换为 DLL 类库 有没有一种简单的方法可以做到这一点 而不涉及创建新的类库项目 预先感谢 项目 gt 属性 gt 应用程序选项卡 将
  • LNK2028 托管 C++ DLL 在另一个托管 C++ DLL 中调用函数

    我正在将 VS2010 与托管 C DLL 一起使用 调用另一个托管 C DLL 中的函数 并且我得到了很多LNK2028 http msdn microsoft com en us library ms235590 28v vs 80 2
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • 为什么我的 DLL 无法注册?

    我正在 VS2005 中构建一个项目 但我的几个 DLL 无法注册 我在 Visual Studio 中收到的错误消息是 项目 错误 PRJ0019 工具从 注册 ActiveX 控件 返回错误代码 这很模糊 当我通过命令行手动注册DLL时
  • VBA FreeLibrary 不卸载 DLL

    当我使用完一个 DLL 文件后 我需要删除它 代码完成后清理 我尝试在 Excel VBA 中使用 LoadLibrary 和 FreeLibrary 但无论我做什么 Excel exe 都会坚持 DLL 文件 Public Declare
  • 创建简单的 c++.net 包装器。一步步

    我有一个 C 项目 我承认我在c 方面完全是零 但我仍然需要编写一个 c net 包装器 以便我可以使用它来处理非托管 c 库 所以我有什么 1 非托管项目的头文件 2 非托管项目的库 dll 和 lib 3 一个空的 C NET 项目 我
  • 在生产数据库上部署应用程序时无法加载文件或程序集“System.Data”错误

    问题 将我的应用程序部署到生产数据库时 出现以下错误 无法加载文件或程序集 System Data Version 2 0 0 0 Culture neutral PublicKeyToken b77a5c561934e089 或其依赖项之
  • 在 C/C++ 中捕获 DLL 崩溃

    我正在从 DLL 调用函数 如下所示 declspec dllimport bool dll function int main if dll function 在某些情况下 我传递给DLL函数的数据会导致DLL崩溃 是否可以捕获此问题 以
  • 使用 CoCreateInstance 从 C++ 调用 COMVisible VB.Net dll

    自从我上一个问题以来 在某种程度上取得了进展 我已经编译了以下项目 它是基于https stackoverflow com a 10949784 846550 https stackoverflow com a 10949784 84655
  • 使用 Mupen64Plus 非托管 C dll API 命令填充 C# 结构

    我在用着木盆64Plus https github com mupen64plus mupen64plus core以及包含的m64p test rom v64 file 我在用着C 与mupen64plus dllAPI 是写在C Pro
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • matlab mex 文件和 C++ dll (Windows)

    我有一个带有 Test 类的 DLL 标题 class MY EXPORT Test public int doit const string str 和来源 int Test doit const string str return in
  • 从 C++ 源文件创建 Windows DLL

    我有多个 C 源文件 我想使用它们创建动态链接库 我在 linux 中使用 gcc shared 和 ln 看到这种情况发生 但是对于 Windows 我想我必须修改源文件才能生成 DLL 有没有办法用提供的源文件生成DLL 类似于linu
  • 将 Visual Studio 2012 C++ 单元测试项目链接到 exe 会导致访问冲突

    我从现有的整体 exe 本机 Visual Studio 2012 项目开始 我想添加一个本机单元测试项目 根据http msdn microsoft com en us library hh419385 aspx objectRef ht
  • 如何在Electron App中调用C# dll方法?

    我有一个电子应用程序 可以从读卡器读取信用卡详细信息 他们提供了一个 c dll 来与应用程序交互 我不知道如何从电子应用程序读取 dll 方法 首先使用以下命令检查 dll 中公开的函数依赖步行者 http www dependencyw
  • 使用createremotethread注入dll

    createremotethread如何在进程内执行dll 它使用的参数之一是 loadlibraryA 所以我得到了它在进程中执行 loadlibrary 函数的部分 然后它应该将上下文切换到内核模式 dll 是否由具有 loadlibr
  • 在 Visual Studio 中引用同一解决方案中的项目

    我有一个包含两个项目的解决方案 其中一个项目是一个带有 DLL 文件的库 我希望能够在其他项目中引用该项目库以使用其类 我的最终目标是做到这一点 同时仍然可以访问库源代码 我尝试过引用 dll 也尝试过引用 csproj 这两种情况都有效
  • Visual Studio 2019 能否将所需的 DLL 打包到一个小的 .exe 文件中?

    我使用 Visual Studio 2019 使用 C WinAPI 制作了一个 Windows 应用程序 完成后 我构建了它 并在我的计算机上执行 它工作完美 然后我发给我没有Visual Studio的朋友 它说需要 msvcp140d
  • 跨 dll 边界的内存分配和释放

    我知道在一个 dll 中进行内存分配然后在另一个 dll 中释放内存可能会导致各种问题 尤其是与 CRT 相关的问题 当涉及到导出 STL 容器时 此类问题尤其成问题 我们之前遇到过此类问题 在编写与我们的库链接的自定义 Adob e 插件
  • 使用 PIMPL 习惯用法删除 DLL 中的 std::vector 时出错

    我有以下代码 In DLL1 在 h文件中 class MyClass public MyClass private std string m name class declspec dllexport Foo private struct

随机推荐