首页
社区
课程
招聘
[原创]三年磨一剑之IDACSharp
发表于: 2010-5-6 03:23 28128

[原创]三年磨一剑之IDACSharp

2010-5-6 03:23
28128

自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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 236
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
虽然我不是很懂!
但是支持你开发出更好的东西
2010-5-6 03:29
0
雪    币: 86
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很强大 等写好了控制台再来玩
2010-5-6 04:18
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
用过你的  VB.C ,佩服
2010-5-6 10:19
0
雪    币: 221
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
经典实用,谢谢大大无私分享
2010-5-6 10:53
0
雪    币: 4902
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个不得不服
LZ的技术好
耐心更足
2010-5-6 11:15
0
雪    币: 215
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
强帖留名
2010-5-6 14:23
0
雪    币: 420
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
山上的人物啊。牛人
2010-5-20 20:00
0
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
好东西啊。膜拜
2010-5-20 20:51
0
雪    币: 254
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
大石头,搞的不错哦,多谢你当初的提点啊,IDA插件与C#的联系。
2010-5-22 08:35
0
雪    币: 89
活跃值: (171)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好工具好插件,期待更好,只能膜拜
2010-5-22 08:49
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
强悍的大侠   留名
2010-5-22 13:50
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
13
呵呵,不用客气!

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

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

然后,我提醒一下楼主。可以写个解释器,批量把C接口转换成C#接口。网上有很多类似的东西:C语言自动导出到Python;C++到Lua等等,不胜其数。你也可以写一个C to C#,会省下很多时间的。而且一劳永逸。
2014-7-17 00:48
0
雪    币: 132
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
用 VC.NET 恩
2014-8-14 20:34
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
25
感谢...
2014-8-14 20:36
0
游客
登录 | 注册 方可回帖
返回
//