hook .NET程序的难点在于.NET程序都是JIT临时编译的,函数的地址不确定。我翻了一下MSDN,发现可以用RuntimeMethodHandle的GetFunctionPointer获取编译后的函数地址,于是用C++/CLI调用.NET的反射和GetFunctionPointer就可以实现hook了(用C#也可以,不过C++做底层的事比较方便)
假设有这样的C#程序要hook:
namespace TestExe
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnButtonClick(object sender, RoutedEventArgs e)
{
TestFunction("test");
}
private static void TestFunction(string msg)
{
MessageBox.Show(msg);
}
}
}
首先可以通过调试或静态分析获得要hook的函数名称
新建一个C++ DLL项目,然后启用CLR支持:
dllmain.cpp:
#include