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