gpt4 book ai didi

c# - 是否可以使用 C# 代码注入(inject) dll 并覆盖返回值?

转载 作者:行者123 更新时间:2023-12-02 09:22:13 25 4
gpt4 key购买 nike

假设有一个正在运行的简单 C# 应用程序,它以值为 2 的 int 形式返回 1+1 的答案,我有它的源代码,但出于好奇,我想更改什么它不需要在运行前修改 dll。

是否可以使用您自己的 .dll 注入(inject)正​​在运行的应用程序,并将其在同一类和方法中返回的答案更改为 2 以外的值?

我已经知道我可以在程序运行时进入内存,理论上将“2”的答案更改为其他内容,我很好奇是否可以更改程序逻辑。

我也已经知道可以通过注入(inject)另一个 .dll 并向应用程序“添加”附加功能来“扩展”正在运行的应用程序,我对更改已在原始 .dll 中运行的代码的理论上的可能性感兴趣。 dll。

最佳答案

“更改”外部 DLL 内的代码并不容易,但是如果您想修改传入的参数或返回的结果,这并不难。拦截修改输入或输出的调用的过程称为“Hooking”。

在 C# 中,有一个易于使用的库可以为您完成大部分工作,名为 EasyHook ,这将允许您拦截调用并用您自己的结果替换返回值。

static IntPtr CreateFile_Hooked(
String InFileName,
UInt32 InDesiredAccess,
UInt32 InShareMode,
IntPtr InSecurityAttributes,
UInt32 InCreationDisposition,
UInt32 InFlagsAndAttributes,
IntPtr InTemplateFile)
{
try
{
Main This = (Main)HookRuntimeInfo.Callback;

lock (This.Queue)
{
if (This.Queue.Count < 1000)
This.Queue.Push(InFileName);
}
}
catch
{
}

// call original API...
return CreateFile(
InFileName,
InDesiredAccess,
InShareMode,
InSecurityAttributes,
InCreationDisposition,
InFlagsAndAttributes,
InTemplateFile);
}

在上面的代码中,它获取传递给 InFileName 的参数并将其记录下来以供以后在外部监控程序中使用。您可以轻松地捕获从 CreateFile(或您正在调用的任何实际 dll 函数)返回的结果,将其修改为您想要的任何内容,然后返回修改后的值。

对于原始函数的调用者来说,他们不知道从 DLL 调用返回的值在收到之前已被修改。

关于c# - 是否可以使用 C# 代码注入(inject) dll 并覆盖返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20199225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com