001.Creating IDA Plug-ins with C# or VB6 https://www.openrce.org/articles/full_view/13

这篇文章提供了如何使用高级语言如C#或者VB6为IDA插件创建图形用户界面的技术。

这两种语言实现复杂用户界面非常简单,也容易调试,更为强大的是快速原型化开发。

我将要完成的是使用VC创建一个传统的IDA桩插件,这个插件可以向IDA添加菜单项,

并且导出可以供高级语言插件利用的一系列预先包装的IDA API函数。我们将要完成的程序的基本图表示意如下:

                 概念图

为了使VB6,.NET和VC能够一起使用,我们已经建立了自己的插件以便它们将DLL作为 COM类进行存取。为了作为COM类来访问.NET的dll,你将不得不使用regasm效用来建立界面的适当的注册入口,同样需要生成供在我们的VC桩模块早期绑定使用的类型库文件(.tlb)。VB6只能产生ActiveX DLL,并且在编译的时侯已经建立所有注册入口和在DLL中增加了类型库信息。如果你仅仅想看看演示,你必须使用regsvr32注册VB6示例dll。

因此,为了能快速进入代码,在我们的两个例子插件中,我们都早期绑定了我们的DLLs。这也就意味着你必须先编译VB6和.NET的DLLs,并且你要确认所设置的二进制的兼容性,以便下次你编译后不会改变用户界面(或者你重新编译了你的桩模块)。这不是实际的问题,因为启动插件的界面非常简单,也不需要改变。仅仅用于初始化库文件和运行。在我们的VC桩模块中你将看到下面的声明:

#import "./bin_4.7/CSharpIDASample.tlb" raw_interfaces_only

using namespace CSharpIDASample;

ICpluginPtr pIPlug(__uuidof(Cplugin));

这里使用了一些VC声明来加载类型库界面,创建我们主类的一个已经初始化的实例指针。命名空间、类、和界面指针的名字都已经在类型库中设定,可以使用类型库查看器(来自Matt CurlandsPower VB

站点的免费演示版程序或者其他的工具象Microsoft Ole View utility)查看。

下面来显示我们的界面,我们要做的就是调用我们的类方法启动它。在下面的例子代码中,我们传递了IDA主窗口的句柄,以便使我们的窗口能够以模态形式显示。(在这一点上我没有试着将主窗体设为MDI子窗体,使用SetParent也许能做)。

    int h = (int)callui(ui_get_hwnd).vptr; //ida main window hwnd

pIPlug->DopluginAction( h , &lRet);

这里Iret变量将接收HRESULT COM的返回值,这我们不用担心。一旦我们的插件窗口显示,IDA API功能将经过在我们窗口中声明的函数执行。这些声明提供给VB开发着执行标准Win32 API的方法,同样也在.NET提供了,以便你能访问定制的C dlls。下面是C原型声明和相应的C#和VB6声明:
C Prototypes:
    int __stdcall NumFuncs(void)
    int __stdcall FunctionStart(int n)
    int __stdcall FunctionEnd(int n)
VB6:
    Private Declare Function NumFuncs Lib "vcSample.plw" () As Long
    Private Declare Function FunctionStart Lib "vcSample.plw" (ByVal functionIndex As Long) As Long
    Private Declare Function FunctionEnd Lib "vcSample.plw" (ByVal functionIndex As Long) As Long
 
C#:
    [DllImport("c_stub.plw")]
    public static extern int NumFuncs();
    
    [DllImport("c_stub.plw")]
    public static extern int FunctionStart(int index);
    
    [DllImport("c_stub.plw")]
    public static extern int  FunctionEnd(int index);

使用这种机制来访问从我们CPP桩模块中导出的预先封装的API带给我们一定的机动性.,并且使我们不用担心COM的兼容性带来的界面改变问题。

另外提供了基本例子框架,另外还包含了另外的36IDA API包,你可以在你的程序中使用。如果你喜欢晚绑定COM类,你可以在我们的站点找其他的老例子。我在这里使用早绑定的原因是晚绑定??需要花一页半的通信??代码。

确信已经阅读了应用程序目录中的README文件,去学习如何建立工程,IDA4.7提供了预编译功能。

Anyway, enjoy..