是否可以使用c#代码注入一个dll并覆盖返回值?

Gal*_*har 2 c# dll code-injection

让我们说有一个简单的c#应用程序正在运行,以一个值为2的int的形式返回1 + 1的答案,我有它的源代码但是为了好奇,我想改变它的作用而不用在运行时修改dll.

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

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

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

Sco*_*ain 6

在外部DLL中"更改"代码并不容易,但是如果要修改进入的参数或返回的结果并不难做到.拦截调用以修改输入或输出的过程称为" 挂钩 ".

在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);
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,它接受传入的参数InFileName并记录它以供以后在外部mointoring程序中使用.您可以轻松地捕获从CreateFile(或您正在调用的任何真正的dll函数)返回的结果将其修改为您想要的任何内容,然后返回修改后的值.

对于原始函数的调用者,他们不知道他们从DLL调用中获取的值在收到它之前被修改了.