【发布时间】:2011-06-17 21:46:44
【问题描述】:
标题或多或少说明了一切。根据this 文章,我想出了这个:
public static unsafe void Replace(this MethodBase destination, MethodBase source)
{
IntPtr srcHandle = source.MethodHandle.GetFunctionPointer();
IntPtr dstHandle = destination.MethodHandle.GetFunctionPointer();
int* dstPtr = (int*)dstHandle.ToPointer();
*dstPtr = srcHandle.ToInt32();
}
这确实有效...偶尔-.-
例如,这是可行的。
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void A()
{
Console.WriteLine("Hai World");
}
public static void B()
{
Console.WriteLine("Bai World");
}
}
但是,这不是 (SEHException)。我所做的只是改变定义函数的顺序。
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void B()
{
Console.WriteLine("Bai World");
}
public static void A()
{
Console.WriteLine("Hai World");
}
}
至于文章中的代码......我根本无法让它工作。
有什么想法/选择吗?
【问题讨论】:
-
为什么要这样做?这听起来像个可怕的主意。
-
别担心 - 没有恶意。只是为了知识:D
-
我认为唯一安全的方法是在程序集加载之前注入代码。
-
@Porges 也许是这样,但我认为更明智的做法是假设这永远不安全。永远。
-
这是个好问题。我希望有一个答案。
标签: c# .net code-injection il