三年磨一劍之IDACSharp
自2007年3月開始研究IDA以來,已3年有余!自認為對idc腳本比較熟悉,最大的成果就是重寫老外的vb.idc為vb.c。期間還有其它大大小小的腳本。雖如此,仍感力不從心,idc腳本難以構建中大型應用(vb.c有2100多行)。
正如2005年我猶豫是否應該選擇Java等高級語言以構建中大型應用,此時也在猶豫是否應該利用C++等高級語言編寫IDA插件。
老外的一篇關于使用VB和C#編寫IDA插件的文章點醒了我,除了C++,我們還有很多的選擇。那時候開始,我選擇了C#來做IDA插件,直到今天。
且不論使用C#來做IDA插件是否會成功,這研究的3年里,我得到了非常非常多的東西!
老外的思路是VB和C#做成COM,然后用C++包裝,Easy,很容易做好一個插件。但是需要暴露IDA的接口給插件使用的時候,才發現那是一個登月工程。并且C#做成的COM,部署和調試都不方便。
后來向微軟的大牛請教,得知一個新的方法,利用C++加載.Net運行時,從而啟動C#插件。這下子漂亮多了,但是仍然解決不了暴露接口的問題。IDA的接口很多,大多數都是用不上的,其實只要實現了IDC中的幾十個函數即可,于是我開始了登月工程,手工包裝暴露接口,歷時兩年!
直到上個月,例行工作的時候,一時沖動,把包裝項目改成CLR來編譯,IDA居然還認!?。∵@可是巨大的發現,這意味著:可以直接使用C++/CLI實現IDA插件!
同時,看到網上更新了IDAPython,忍不住研究一下,看看它是如何實現的。原來它是通過SWIG做的包裝,基本做到自動化。還發現,IDA接口本身就提供了對SWIG的支持。SWIG的資料不多,我想借助它來包裝C#版本的時候,總是失敗。想想算了,三年都過來了,也不在乎這一回,繼續手工包裝。因為是使用C++/CLI,工作量就大大減少了,同時有IDAPython在那里作為參考,找起接口函數來非常方便。
期間,還有一些小插曲,C++/CLI調用C#沒有問題,C#調用C++/CLI編寫的插件的時候就有問題了。原來C#類庫項目引用C++/CLI項目失敗,因為它的輸出是plw,vs直接阻止。只好改名dll后調用。在使用的時候,還得用上dll的這一份拷貝,并且要放在IDA根目錄才行。
一些額外的收獲:
1,C#可以直接操作匯編(是Native Asm,不是IL)。通過委托,可以隨意調用PE里面的任意函數,不管它共有私有,因為這個調用是匯編指令級的。
2,學習了.Net的核心機制,知道它是怎么工作的。
3,C#也可以給Native下鉤子,結合第一點,就是愛怎么整就怎么整。
4,基本上,C++的開源項目,使用CLR編譯后,都有辦法供C#使用。
5,意志的磨練……
回到正題!
這是一個IDA插件,名為IDACSharp,同時又是C#插件管理器,它的作用就是充當IDA和C#的橋梁(雙向)。
一共四個文件:
1,IDACSharp.plw是主插件,同時也是包裝器,已經把常用的接口包裝為.Net接口,該文件應該放在Plugins目錄;
2,IDACSharp.dll跟IDACSharp.plw就是同一個東西,只是后綴不同而已,該文件應該放在IDA根目錄;
3,CSharpLoader.dll是C#編寫的插件管理器,放在CSharp目錄下,IDACSharp.plw會找到并加載它;
4,IDATest.dll是C#編寫的插件例子,列出當前IDA數據庫前30個函數,雙擊跳轉到函數所在位置,也是放在CSharp目錄下。
IDACSharp尚未完工,CSharpLoader的插件管理還沒有做,這塊問題不大,重要的是,所包裝的接口,絕大部分都還沒有測試過,并且還有一些沒有包裝完成,打算在后面逐步完善!
大石頭
nnhy(at)vip.qq.com
QQ群1600800
2010-05-06 03:19

試用地址:
https://files.cnblogs.com/nnhy/%e5%8f%91%e5%b8%83_20100506032141.rar

浙公網安備 33010602011771號