关于我为什么不用 vs2022 : 因为编译的时候,会出现 error xxxxx , 而且无法消除。。。 太新了果然不好
环境搭建
使用工具:
vs2019
ida 7.5 skd
ida 7.5
sdk 下载: https://github.com/m1n9yu3/AutoNop/raw/master/IDASDK75.rar
开始配置
vs2019 创建新项目 -> 带有导出项的 dll , 这里可以尝试一下 下面的动态链接库, 我没试过,没写过多少次
创建完成后, 选择解决方案资源管理器->项目-> 右键属性
勾选所有配置, 平台为 x64
项目配置
- 项目属性 -> 常规 -> 配置类型 选择 .dll (如果创建的是dll 项目,这一步可以省略)
- c/c++ -> 常规 -> 附加包含目录 这里手动选择一下 sdk/inclde 目录
- c/c++ -> 预处理器 -> 预处理定义 这里的话, 如果是 编译 ida64 所用的插件, 则要多添加一个__EA64__ , 其他的话 __NT__ 这个
__NT__ __EA64__
- c/c++ 代码生成->禁用安全检查(/GS)
- 链接器 常规设置
输出文件: 这里我为了省事,直接输出到 ida/plugins/ 目录下了, 设不设置都可以
启用增量链接: 可有可无,暂时没影响
附加库目录: 这里选择 sdk/lib/x64_win_vc_xx 如果你要编译 ida64 使用的 插件 xx 就是 64, 反之就是 32
- 连接器->输入 -> 附加依赖项
只需添加一个 ida.lib 即可
小 tips
我这里编译的话, 是直接新建了两个编译配置 ida32 和 ida64
项目属性页->项目管理器->活动解决方案配置->新建
插件编写
插件遵循格式
然后这里简单讲一下编写 插件, 首先 ida 插件要导出一个类 PLUGIN
1 2 3 4 5 6 7 8 9 10 11
| plugin_t PLUGIN = { int version; int flags; size_t (idaapi *init)(void); void (idaapi *term)(void); bool (idaapi *run)(size_t arg); const char *comment; const char *help; const char *wanted_name; const char *wanted_hotkey; };
|
然后按照 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() {
return PLUGIN_OK; }
void idaapi term(void) { return; }
bool idaapi run(size_t arg) { return FALSE; }
plugin_t PLUGIN = { IDP_INTERFACE_VERSION, 0, init, term, run, comment, NULL, "插件名称", "热键" };
|
然后头文件, 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
| #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) { qstring msg_buff[] = {0}; acp_utf8(msg_buff, comment); msg(msg_buff->c_str());
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) {
patch_byte(cur_add, 0x90); msg("Patch NOP Sucess: %08X\n", get_screen_ea()); jumpto(cur_add + 1);
} else { qstrncpy(msg_buff, (const char*)"未选中任何地址!!", 255); qstring *msg_buff1 = NULL; acp_utf8(msg_buff1, msg_buff); warning(msg_buff1->c_str()); }
return true; }
plugin_t PLUGIN = { IDP_INTERFACE_VERSION, 0, init, term, run, comment, "", "AutoNop", "Shift-P" };
|
参考资料:
https://github.com/fjqisba/IDADoc
https://github.com/fjqisba/E-Decompiler
https://hex-rays.com/products/ida/support/sdkdoc/index.html