使用C#将dll注入当前进程
Inject dll into current process with C#
所以我的问题与本网站上发布的其他问题有点不同,理论上,我要找的东西应该比将 DLL 注入 'any' 进程的注入器简单得多。
我有一个我们可以称为 game.exe 的进程,它在启动时加载一系列 dll。这些 dll 是用 C# 编写的,基本上是 'scripts',我可以毫无问题地进行编辑。我用 C++ 编写了一个 DLL,当它使用任何通用注入器 'nop(s)' 注入到 game.exe 进程时,会出现一系列地址。我已确认 c++ dll 按预期工作。
现在回到我的问题,我希望用 c# 代码编写自动将 c++ dll 注入 game.exe 进程而不是 'any' 进程的代码。我说这应该更容易的原因是 c# dll 已经 运行 基本上与 game.exe 相同 'space' 所以它应该更容易做?
提前致谢。如果这里需要 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# 中如何完成这样的事情
这解决了我的答案: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.
所以我的问题与本网站上发布的其他问题有点不同,理论上,我要找的东西应该比将 DLL 注入 'any' 进程的注入器简单得多。
我有一个我们可以称为 game.exe 的进程,它在启动时加载一系列 dll。这些 dll 是用 C# 编写的,基本上是 'scripts',我可以毫无问题地进行编辑。我用 C++ 编写了一个 DLL,当它使用任何通用注入器 'nop(s)' 注入到 game.exe 进程时,会出现一系列地址。我已确认 c++ dll 按预期工作。
现在回到我的问题,我希望用 c# 代码编写自动将 c++ dll 注入 game.exe 进程而不是 'any' 进程的代码。我说这应该更容易的原因是 c# dll 已经 运行 基本上与 game.exe 相同 'space' 所以它应该更容易做?
提前致谢。如果这里需要 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# 中如何完成这样的事情
这解决了我的答案: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.