多かれ少なかれそれはすべてです。 this記事に基づいて、私はこれを作ってみた:これが実際に動作実行時にメソッドにILを注入する方法
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");
}
}
記事のコードは...私はそれがまったく動作するようにはできませんでした。
アイデア/代替品はありますか?
なぜこれをやりたいですか?これは恐ろしい考えのように聞こえる。 – Amy
悪意のあるものはありません。ちょうど知識のために:D – YellPika
これを行う唯一の安全な方法は、アセンブリがロードされる前にコードを注入することだと思います。 – porges