天行健 发表于 2025-3-18 11:02:05

IDAPRO插件开发环境配置

# Windows下开发环境配置:

1.建立一个空的Visual Studio项目,添加IDADemo.cpp文件

2.由于7.0版本以后的IDA插件必须都是64位的,因此编译平台选择x64

3.进行如下设置

配置属性->常规:更改"配置类型"为**动态库(.dll)**

C/C++ -> 常规:添加SDK的include路径到"附加包含目录"一栏,比如D:\idasdk74\include

C/C++ -> 预处理器:添加`__NT__`

C/C++ -> 代码生成:更改"安全检查"为**禁用安全检查(/GS-)**

链接器 -> 常规:添加SDK的lib库路径到"附加库目录"一栏,比如针对ida.exe所写的插件添加D:\idasdk74\lib\x64_win_vc_32,针对ida64.exe所写的插件添加D:\idasdk74\lib\x64_win_vc_64。

链接器 -> 附加依赖项: 添加`ida.lib`到"附加依赖项"一栏。

这样一个IDA插件开发环境就搭建好了。

### 插件模板介绍:

在IDADemo.cpp添加如下模板代码:

```c++
#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>
#include <kernwin.hpp>

//以上是导入的SDK头文件

int idaapi init(void)
{
//IDA在启动的时候会调用每个插件的init函数。
//返回值有三种选项:
//PLUGIN_SKIP适合那些不支持的插件,IDA将不会加载该插件
//PLUGIN_OK适合那些执行一次性功能的插件
//PLUGIN_KEEP适合那些需要一直保持功能的插件
return PLUGIN_OK;
}

void idaapi term(void)
{
//当结束插件时,一般您可以在此添加一点任务清理的代码。
return;
}

bool idaapi run(size_t)
{
//当按下热键时候,执行功能的入口函数
warning("Hello, world!");
return true;
}

static char comment[] = "It's a plugin to show Hello world!";

plugin_t PLUGIN =
{
IDP_INTERFACE_VERSION,
0,                  // 插件的一些属性,一般为0即可
init,               // initialize
term,               // terminate. this pointer may be NULL.
run,                  // invoke plugin
comment,            // 插件的说明,会显示在IDA下方的状态栏中
"",                   // multiline help about the plugin
"Hello, world",                // 插件在列表中显示的名称
"Alt-F1"            // 插件想要注册的功能快捷键
};

```

编译运行该插件后,会显示出提示框Hello,world!

---

当IDA加载文件后,会生成一个idainfo信息,该信息存在在数据库文件中(即IDB文件)。

idainfo结构体定义在<ida.hpp>文件中,下面列出一部分值

```c++
struct idainfo
{
        char tag;                //固定为'IDA'
        char zero;                //没用
        ushort version;                //数据库版本
        char procname;        //当前处理器名称

        ...
        ushort filetype;        // 被反汇编的文件类型,例如f_PE,f_ELF,参考filetype_t
        ea_t startIP;                // 程序开始运行时,IP寄存器的值
        ea_t startSP;                // 程序开始运行时,SP寄存器的值
        ea_t main;                // IDA解析出的主函数入口点的线性地址
        ea_t minEA;                // 程序的最小线性地址
        ea_t maxEA;                // 程序的最大线性地址
        ...
};
```

该结构体以全局变量inf的形式定义在<ida.hpp>头文件中,我们可以直接使用。

比方说,我们想要编写的插件,只想处理Intel x86处理器类型下的PE和ELF两种格式的文件,编写以下代码:

```c++
#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>

int idaapi init(void)
{
        qstring ProcName = inf.procname;
        if (ProcName != "metapc" || (inf.filetype != f_ELF && inf.filetype != f_PE))
        {
                return PLUGIN_SKIP;
        }

        return PLUGIN_OK;
}
```

这样遇到不符合的文件,插件将不会载入。

---

898727201 发表于 2025-3-18 20:37:03

感谢分享各种强大的技术.
页: [1]
查看完整版本: IDAPRO插件开发环境配置