我查閱了一下相關C#方面的資料,卻沒有發現有提供過關於api-hook方面的資
料包括應用庫由此本人編寫一套inline-hook的庫用於支持x64、x86上的基於在
clr的公共語言,如: c#、c+/clr、vb.net 全部都可以使用該類庫改變底層api執
行結果,如我們需要制作抓包工具,或者攔截某個ActiveX對象內部調用的函數
用處廣泛 有些人在制作“截包”工具時是通過使用SPI,但也可以通過本技術實現
調用MessageBox.Show("Hello world", "Advapi32")時會跳轉到CB_MessageBox函數
MessageBox.Show()這個方法在下層中會調用MessageBoxW函數,不信我們可以試
- [DllImport("user32", EntryPoint = "MessageBoxW", CharSet = CharSet.Unicode)]
- public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, uint uType);
- [STAThread]
- static void Main(string[] args)
- {
- InlineHook ich = new InlineHook();
- ich.Install(ich.GetProcAddress("user32", "MessageBoxW"), ich.GetProcAddress(new MessageBoxW(CB_MessageBox)));
- // MessageBox.Show("Hello world", "Advapi32");
- MessageBox(IntPtr.Zero, "Hello world", "Advapi32", 0);
- Console.ReadKey(false);
- }
試,上面的代碼執行后結果與最上面的相同。本類庫提供分別需求.net 2 / 4的兩種
不同的類庫,基本滿足開發的需要 不過這一塊一直是C++方面的哦不過我相信以后
會是C#做這一塊,不過與其等到到時候再提供類庫 不如早些提供類庫,大家不需要
去研究我類庫中怎么去實現的,雖然類庫我稍微混淆了一下 不過你們要去學習也不
是很困難,不過我是懶得去討論在下層怎么實現的 DLL是沒有打入版權的信息,很
簡單你在屬性中看不到任何信息,除了一個內部名稱之外沒有任何信息,所以你不
必擔心 下面是解釋InlineHook中導出的函數接口及釋義。
InlineHook.GetProcAddress(string strLibraryName, string strMethodName) // 取函數地址(庫文件, 函數名)
InlineHook.GetProcAddress(System.Delegate d) // 取函數地址(有效委托)
InlineHook.Install(System.IntPtr oldMethodAddress, System.IntPtr newMethodAddress) // 安裝鈎子(源函數地址, 新函數地址)
InlineHook.Resume() // 恢復鈎子
InlineHook.Suspend() // 掛起鈎子
InlineHook.Uninstall() // 卸載鈎子
Sample:
CAT(inline-hook) http://pan.baidu.com/s/1kTKjFPt // 示例地址含類庫
每個版本文件夾中都包含x86 / x64兩份不同的類庫,如果使用本類庫有疑惑的地方可以在本人下方留言。