private void buttonTest_Click(object sender, EventArgs e)
{
//篡改方法1到方法2去
Hijack(() => Test1(), () => Test2());
Test1();
}
private void Test1()
{
MessageBox.Show("Test1");
}
private void Test2()
{
MessageBox.Show("Test2");
}
static void Hijack(Expression<Action> originalCall, Expression<Action> targetCall)
{
var originalMethod = ((MethodCallExpression)originalCall.Body).Method;
var targetMethod = ((MethodCallExpression)targetCall.Body).Method;
RuntimeHelpers.PrepareMethod(originalMethod.MethodHandle);
RuntimeHelpers.PrepareMethod(targetMethod.MethodHandle);
var sourceAddress = originalMethod.MethodHandle.GetFunctionPointer();
var targetAddress = (long)targetMethod.MethodHandle.GetFunctionPointer();
int offset = (int)(targetAddress - (long)sourceAddress - 5);
byte[] instruction = { 0xE9, (byte)(offset & 0xFF), (byte)((offset >> 8) & 0xFF), (byte)((offset >> 16) & 0xFF), (byte)((offset >> 24) & 0xFF) };
Marshal.Copy(instruction, 0, sourceAddress, instruction.Length);
}