使用 C# 将 dll 注入当前进程

Posted

技术标签:

【中文标题】使用 C# 将 dll 注入当前进程【英文标题】:Inject dll into current process with C# 【发布时间】:2020-12-06 11:20:24 【问题描述】:

所以我的问题与本网站上发布的其他问题有点不同,理论上,我正在寻找的东西应该比将 DLL 注入“任何”进程的注入器要简单得多。

我有一个进程,我们可以将其称为 game.exe,它在启动时会加载一系列 dll。这些 dll 是用 C# 编写的,基本上是我可以毫无问题地编辑的“脚本”。我用 C++ 编写了一个 DLL,当它被任何通用注入器“nop(s)”注入到 game.exe 进程中时,会出现一系列地址。我已确认 c++ dll 按预期工作。

现在回到我的问题,我希望用 c# 代码编写自动将 c++ dll 注入 game.exe 进程而不是“任何”进程的代码。我说这应该更容易的原因是 c# dll 基本上已经在与 game.exe 相同的“空间”中运行,所以应该更容易做?

提前致谢。如果此处需要 c++ 代码,则为:

constexpr AddrDescriptor addresses[] =  0x1001bbea, 2, 0x1001bc4d, 2, 0x1001bc61, 7 ;

DWORD WINAPI EntryPoint(LPVOID _arguments)

    for (size_t i = 0; i < (sizeof(addresses) / sizeof(AddrDescriptor)); i++)
    
        addresses[i].nop_address();
    
    return 0x1337;


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)

    switch (ul_reason_for_call)
    
    case DLL_PROCESS_ATTACH:
        ::CreateThread(0, 0, static_cast<LPTHREAD_START_ROUTINE>(EntryPoint), 0, 0, 0);
        [[fallthrough]];
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    
    return TRUE;

编辑 1: 一位好心的用户向我指出了该网站上的另一个问题。这很有帮助,但如果我可以要求澄清一下。在c++中使用dll导出:(以上参考代码)

extern "C"

    __declspec(dllexport) DWORD WINAPI EntryPoint(LPVOID _arguments)
    
        for (size_t i = 0; i < (sizeof(addresses) / sizeof(AddrDescriptor)); i++)
        
            addresses[i].nop_address();
        
        return 0x1337;
    

现在可以导入此函数并在 C# 中调用它吗?数据类型 DWORD WINAPI(LPVOID...) 我不确定如何在 C# 中完成类似的操作

【问题讨论】:

这能回答你的问题吗? How to call C++ DLL in C# 谢谢江淮,为了彻底解决我的所有疑问,你能检查我的编辑吗? 【参考方案1】:

这解决了我的答案:C++ 代码

extern "C" 

    __declspec(dllexport) int NopTheFrickOut() 
    
        for (size_t i = 0; i < (sizeof(addresses) / sizeof(AddrDescriptor)); i++)
        
            addresses[i].nop_address();
        
        return 0x1337;
    

C#代码:

public class ExtensionScript : BaseScript

        [DllImport("RemoveTeknoChecks.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int NopTheFrickOut(); 
...

Calling NopTheFrickOut() in the main function of the C# DLl correctly nops the addresses.

【讨论】:

以上是关于使用 C# 将 dll 注入当前进程的主要内容,如果未能解决你的问题,请参考以下文章

如何实现静态dll注入

如何在 C# 程序中注入恶意 DLL ?

安全之路 —— 利用远程线程注入的方法(使用DLL)实现穿墙与隐藏进程

从非托管 dll 文件(注入到正在运行的进程中)调用托管 dll

如何从WOW64进程注入x86 DLL到x64进程

反射式DLL注入--方法