Gal*_*har 2 c# dll code-injection
让我们说有一个简单的c#应用程序正在运行,以一个值为2的int的形式返回1 + 1的答案,我有它的源代码但是为了好奇,我想改变它的作用而不用在运行时修改dll.
是否可以使用您自己的.dll注入正在运行的应用程序,并将它在同一类和方法中返回的答案更改为除2之外的值?
我已经知道我可以在程序运行时进入内存并理论上将"2"的答案更改为其他内容,我很好奇我是否可以更改程序逻辑.
我也已经知道可以通过向应用程序注入另一个.dll和"添加"附加功能来"扩展"正在运行的应用程序,我对理论上可能更改已经在原始.dll中运行的代码感兴趣.
在外部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调用中获取的值在收到它之前被修改了.