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

时间:2013-11-25 17:19:59

标签: c# dll code-injection

假设有一个简单的c#应用程序正在运行,它以1的形式返回1 + 1的答案,值为2,我有源代码,但为了好奇,我想改变一下它不会在运行时修改dll。

是否可以使用您自己的.dll注入正在运行的应用程序,并在同一类中更改它返回的答案&除了2?

以外的某个值的方法

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

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

1 个答案:

答案 0 :(得分:6)

在外部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并将其记录下来以供以后在外部mointoring程序中使用。您可以轻松地捕获从CreateFile(或您正在调用的任何真正的dll函数)返回的结果,将其修改为您想要的任何内容,然后返回修改后的值。

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