vs2019开发ida7.5插件环境搭建

本文最后更新于:2 年前

关于我为什么不用 vs2022 : 因为编译的时候,会出现 error xxxxx , 而且无法消除。。。 太新了果然不好

环境搭建

使用工具:

  1. vs2019

  2. ida 7.5 skd

  3. ida 7.5

sdk 下载: https://github.com/m1n9yu3/AutoNop/raw/master/IDASDK75.rar

开始配置

vs2019 创建新项目 -> 带有导出项的 dll , 这里可以尝试一下 下面的动态链接库, 我没试过,没写过多少次

img

创建完成后, 选择解决方案资源管理器->项目-> 右键属性

勾选所有配置, 平台为 x64

img

项目配置

  1. 项目属性 -> 常规 -> 配置类型 选择 .dll (如果创建的是dll 项目,这一步可以省略)

img

  1. c/c++ -> 常规 -> 附加包含目录 这里手动选择一下 sdk/inclde 目录

img

  1. c/c++ -> 预处理器 -> 预处理定义 这里的话, 如果是 编译 ida64 所用的插件, 则要多添加一个__EA64__ , 其他的话 __NT__ 这个

__NT__ __EA64__

img

  1. c/c++ 代码生成->禁用安全检查(/GS)

img

  1. 链接器 常规设置

输出文件: 这里我为了省事,直接输出到 ida/plugins/ 目录下了, 设不设置都可以

启用增量链接: 可有可无,暂时没影响

附加库目录: 这里选择 sdk/lib/x64_win_vc_xx 如果你要编译 ida64 使用的 插件 xx 就是 64, 反之就是 32

  1. 连接器->输入 -> 附加依赖项

只需添加一个 ida.lib 即可

img

小 tips

我这里编译的话, 是直接新建了两个编译配置 ida32 和 ida64

项目属性页->项目管理器->活动解决方案配置->新建

img

插件编写

插件遵循格式

然后这里简单讲一下编写 插件, 首先 ida 插件要导出一个类 PLUGIN

1
2
3
4
5
6
7
8
9
10
11
plugin_t PLUGIN = {
int version; // 应该等于 IDP_INTERFACE_VERSION, 所以直接填上去即可
int flags; // 这里指定 插件的类型
size_t (idaapi *init)(void); // 指定 ida插件的 初始化函数, 并且 该函数的格式是 size_t idaapi init();
void (idaapi *term)(void); // 指定 ida 插件卸载的函数 void idaapi term();
bool (idaapi *run)(size_t arg); // 指定 ida 运行的函数 bool idaapi run();
const char *comment; // 插件的注释
const char *help; // 插件的帮助
const char *wanted_name; // 插件的名称
const char *wanted_hotkey; // 插件的热键,我理解的是 触发热键时,执行一下插件的run 函数
};

然后按照 PLUGIN 上面的东西,填充完整,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
size_t idaapi init() {
// 可以编写一些 函数初始化的代码

// PLUGIN_OK: 使用快捷键立刻调用插件 run 函数
return PLUGIN_OK;
}

void idaapi term(void) {
// 如果在 插件运行的时候, 注册了什么东西
// 比如说菜单啥的,结束的时候必须要在此处卸载掉
return;
}

bool idaapi run(size_t arg) {
// 插件执行代码, 返回值暂时没查到有啥用, 有知道的可以告我下,谢谢
return FALSE;
}



plugin_t PLUGIN = {
IDP_INTERFACE_VERSION,
0, // 此处应该是一个宏, 写在 plugin_t 旁边了
init,
term,
run,
comment,
NULL, // 帮助
"插件名称", // 插件名称
"热键" // 形似: Shift-S
};

然后头文件, ida 插件的头文件至少包含下面这么多

1
2
3
4
5
#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>
#include <kernwin.hpp>
#include <name.hpp>

AutoNop

下面给出一个 自己写的一段 shift + p 可以直接使 view-a 视图选中的数据变成 0x90 , 即 nop

项目地址: https://github.com/m1n9yu3/AutoNop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>
#include <kernwin.hpp>
#include <name.hpp>


#pragma warning(disable: 6011) // 取消对空指针的引用
char comment[] = "-------------------------------------\nAutoNop Loader Complete!!!\n一个快捷键自动nop 的插件, 只支持 windows x86 系统, 因为 x64 很少看到有 花指令 \n-------------------------------------\n";


size_t idaapi init(void)
{
//char message[10] = { "123" };
qstring msg_buff[] = {0};
acp_utf8(msg_buff, comment);
msg(msg_buff->c_str());

//warning("123");

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


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

bool idaapi run(size_t)
{
//当按下热键时候,执行功能的入口函数
char msg_buff[255] = { 0 };
ea_t cur_add = get_screen_ea();

if (cur_add != 0xFFFFFFFF) {
//qsnprintf(msg_buff, 255, "cur_select_address:%X", get_screen_ea());

// 开始 patch
patch_byte(cur_add, 0x90);
msg("Patch NOP Sucess: %08X\n", get_screen_ea());
// Patch 完成后, 跳转到下一个地址
jumpto(cur_add + 1);


}
else {
qstrncpy(msg_buff, (const char*)"未选中任何地址!!", 255);
// 三行代码,让 ida plugin 弹出中文
qstring *msg_buff1 = NULL;
acp_utf8(msg_buff1, msg_buff);
warning(msg_buff1->c_str());
}

return true;
}


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
"AutoNop", // 插件在列表中显示的名称
"Shift-P" // 插件想要注册的功能快捷键
};

参考资料:

https://github.com/fjqisba/IDADoc

https://github.com/fjqisba/E-Decompiler

https://hex-rays.com/products/ida/support/sdkdoc/index.html