3

[原创]三年磨一剑之IDACSharp

nnhy 2010-5-6 03:23 22089
自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

上传的附件:
最新回复 (26)
helpmsg 2010-5-6 03:29
2
虽然我不是很懂!
但是支持你开发出更好的东西
estelle 2010-5-6 04:18
3
很强大 等写好了控制台再来玩
yingyue 2010-5-6 10:19
4
用过你的  VB.C ,佩服
prize 2010-5-6 10:53
5
经典实用,谢谢大大无私分享
奘和 2010-5-6 11:15
6
这个不得不服
LZ的技术好
耐心更足
frip 2010-5-6 14:23
7
强帖留名
basaiyv1 2010-5-20 20:00
8
山上的人物啊。牛人
1
NWMonster 2010-5-20 20:51
9
好东西啊。膜拜
1
terren 2010-5-22 08:35
10
大石头,搞的不错哦,多谢你当初的提点啊,IDA插件与C#的联系。
sjclch 2010-5-22 08:49
11
好工具好插件,期待更好,只能膜拜
柯睡 2010-5-22 13:50
12
强悍的大侠   留名
3
nnhy 2010-5-22 20:38
13
呵呵,不用客气!

IDACSharp插件已经完成,目前正在开发基于它的VBKiller插件,纯C#实现。
现在正在做VB文件格式的解析,目前我收集的资料太少,并且残缺不全,所以进度慢了点。

我在这里非常欢迎各位C#开发者前来参与IDACSharp的测试
cnsgp 2010-6-4 22:43
14
向大牛请教几个问题:
1、能不能通过改写SDK,使用Delphi来开发插件?
2、能不能编一个可以调用脚本的插件?我编了不少IDC,结果在IDC面板上密密麻麻,而且在不用IDC时还必须一个个手动关闭,很是麻烦。如果有插件可以调用脚本,相当于每个脚本都自动转为插件了,大大方便操作!
3
nnhy 2010-6-5 12:33
15
1,实现Delphi插件不难,但是要把SDK的众多接口函数导出来,可就不容易了,我花了一个多月才完成部分常用函数的导出(导出为.Net函数)
2,调用IDC的插件很容易,因为本身就有这个函数。等闲点的时候,我做一个。默认把你的所有IDC放到一个指定文件夹,我的插件会自动查找这些IDC,然后列出来,双击对应项就能执行,我想你要的是这样的效果吧。
lixupeng 2010-6-10 12:48
16
下载试试效果
blueeagle 2010-11-12 23:00
17
路过,膜拜大牛。
AngelBoy 2011-4-17 22:08
18
确实很强大,以后就可以直接用C#来写插件了。。。。。。嗯,我没用C#,不过还是要强烈支持LZ。。。。。。期待完成
3
nnhy 2011-4-18 06:55
19
谢谢支持!
BTW:昨天觉得把IDACSharp作为开源项目,让更多的人参与进来。
项目地址:http://IDACSharp.codeplex.com
wxq 2011-8-12 08:34
20
我的IDA没有CSharp这个目录,把包里的文件夹直接复制过来,启动IDA载入文件,提示CSharp.plw and windbg_user.plw have the same ID 9   然后就自动关闭退出了。
缘份天琊 2012-5-7 17:49
21
膜拜楼主牛人呀
windowsa 2012-5-7 17:51
22
楼主强悍啊!等一个!!
1
weizehua 2014-7-17 00:48
23
看了楼主,我异常感动。
首先,我很佩服楼主的任性。有这样韧性的人,一般都会成功的。

然后,我提醒一下楼主。可以写个解释器,批量把C接口转换成C#接口。网上有很多类似的东西:C语言自动导出到Python;C++到Lua等等,不胜其数。你也可以写一个C to C#,会省下很多时间的。而且一劳永逸。
luyikk 2014-8-14 20:34
24
用 VC.NET 恩
34
安于此生 2014-8-14 20:36
25
感谢...
3
nnhy 2014-8-30 13:41
26
不好意思啊!设计插件的时候是随意选取的ID号,没想到跟WinDbg冲突了。。。
你可以到CodePlex上下载源码修改后自己编译
3
nnhy 2014-8-30 13:46
27
C++/CLI是调用.Net类库,C#可以,VC.Net/VB.Net同样可以啦
返回