使用 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)实现穿墙与隐藏进程