logo资料库

IDA插件编写详细教程.doc

第1页 / 共106页
第2页 / 共106页
第3页 / 共106页
第4页 / 共106页
第5页 / 共106页
第6页 / 共106页
第7页 / 共106页
第8页 / 共106页
资料共106页,剩余部分请下载后查看
用 C/C++编写 IDA 插件 用 C/C++编写 IDA 插件 [1.0 版] 版权® 2005 Steve Micallef steve@binarypool.com
用 C/C++编写 IDA 插件 内容目录 1. 入门........................................................6 1.1 为什么会有这本手册?.......................................6 1.2 涵盖的内容................................................6 1.3 不包括的内容..............................................6 1.4 前置知识..................................................6 1.5 居家旅行必备良药..........................................6 1.6 C/C++之外的选择...........................................7 1.7 关于这本手册..............................................7 1.8 致谢......................................................7 1.9 其他资料..................................................7 2. IDA SDK全局组织.............................................8 2.1 安装方法..................................................9 2.2 目录结构..................................................9 2.3 头文件介绍................................................9 2.4 使用SDK..................................................10 3. 配置一个编译环境............................................11 3.1 Windows 下使用 Visual Studio.............................. 11 3.2 Windows 下使用 GCC 的 Dev-C++和 MinGW.......................12 3.3 Linux下使用GCC........................................... 12 3.4 一份插件模板............................................. 13 3.5 配置及运行插件........................................... 14 4.IDA插件原理.................................................15 4.1 重要的数据类型............................................15 4.2 核心结构以及类........................................... 16 4.2.1 元数据信息(Meta Information) ........................ 16 4.2.2 域的概念............................................. 17 4.2.2.1 area_t 结构....................................... 17 4.2.2.2 areacb_t类....................................... 18 4.2.3 段和函数............................................... 18 4.2.3.1 段............................................... 18 4.2.3.2 函数............................................. 19 4.2.4 代码的表示............................................. 20 4.2.4.1 操作数类型....................................... 21 4.2.4.2 操作数........................................... 21 4.2.4.3 助记符........................................... 22 4.2.4.4 指令............................................. 22 4.2.5 交叉引用参考........................................... 23 4.2.5.1 xrefblk_t 结构....................................23 4.2.5.2 代码............................................. 24 4.2.5.3 数据............................................. 25 1
用 C/C++编写 IDA 插件 4.3 字节标志.................................................26 4.4 调试器...................................................27 4.4.1 debugger_t 结构......................................27 4.4.2 寄存器...............................................28 4.4.3 断点.................................................29 4.4.4 跟踪.................................................30 4.4.5 进程和线程...........................................32 4.5 事件通知.................................................32 4.5.1 接收通知.............................................33 4.5.2 UI 事件通知.......................................... 34 4.5.3 调试器事件通知.......................................35 4.5.3.1 底层型事件.......................................35 4.5.3.2 高层型事件通知...................................37 4.5.3.3 函数返回型通知...................................37 4.6 字符串...................................................38 5.函数........................................................40 5.1 常用函数的替代...........................................40 5.2 消息框...................................................40 5.2.1 msg.................................................. 41 5.2.2 info................................................. 41 5.2.3 warning.............................................. 41 5.2.3 error................................................ 41 5.3 UI浏览...................................................41 5.3.1 get_screen_ea........................................ 41 5.3.2 jumpto............................................... 42 5.3.3 get_cursor........................................... 42 5.3.4 get_curline.......................................... 42 5.3.5 read_selection....................................... 42 5.3.6 callui............................................... 43 5.3.7 askaddr............................................. .43 5.3.8 AskUsingForm_c....................................... 44 5.4 入口点...................................................44 5.4.1 get_entry_qty........................................ 44 5.4.2 get_entry_ordinal.................................... 44 5.4.3 get_entry............................................45 5.4.4 get_entry_name.......................................45 5.5 域.......................................................45 5.5.1 get_area............................................. 46 5.5.2 get_area_qty......................................... 46 5.5.3 getn_area............................................ 46 5.5.4 get_next_area........................................ 47 5.5.5 get_prev_area........................................ 47 5.6 段...................................................... 48 5.6.1 get_segm_qty........................................ 48 2
用 C/C++编写 IDA 插件 5.6.2 getnseg............................................. 48 5.6.3 get_segm_by_name.................................... 48 5.6.4 getseg.............................................. 49 5.6.5 get_segm_name(IDA 4.8) ............................. 49 5.6.6 get_segm_name(IDA 4.9) ............................. 50 5.7 函数.....................................................50 5.7.1 get_func_qty........................................ 50 5.7.2 get_func............................................ 50 5.7.3 getn_func........................................... 51 5.7.4 get_func_name....................................... 51 5.7.5 get_next_func....................................... 52 5.7.6 get_prev_func....................................... 52 5.7.7 get_func_comment.................................... 52 5.8 指令.....................................................53 5.8.1 generate_disasm_line................................ 53 5.8.2 ua_ana0............................................. 53 5.8.3 ua_code............................................. 54 5.8.4 ua_outop............................................ 54 5.8.5 ua_mnem............................................. 55 5.9 交叉引用.................................................56 5.9.1 first_from.......................................... 56 5.9.2 first_to............................................ 57 5.9.3 next_from........................................... 57 5.9.4 next_to............................................. 58 5.10 名称....................................................58 5.10.1 get_name........................................... 58 5.10.2 get_name_ea........................................ 59 5.10.3 get_name_value..................................... 59 5.11 搜索....................................................60 5.11.1 find_text(仅支持IDA 4.9) ...........................60 5.11.2 find_binary........................................ 61 5.12 IDB.....................................................62 5.12.1 open_linput........................................ 62 5.12.2 close_linput....................................... 62 5.12.3 load_loader_module................................. 62 5.12.4 load_binary_file................................... 63 5.12.5 gen_file........................................... 64 5.12.6 save_database...................................... 65 5.13 标志....................................................65 5.13.1 getFlags........................................... 65 5.13.2 isEnabled.......................................... 65 5.13.3 isHead............................................. 66 5.13.4 isCode............................................. 66 5.13.5 isData............................................. 67 3
用 C/C++编写 IDA 插件 5.13.6 isUnknown..........................................67 5.14 数据................................................... 68 5.14.1 get_byte...........................................68 5.14.2 get_many_bytes.....................................68 5.14.3 patch_byte.........................................69 5.14.4 patch_many_bytes...................................69 5.15 I/O.................................................... 70 5.15.1 fopenWT............................................70 5.15.2 openR..............................................70 5.15.3 ecreate............................................70 5.15.4 eclose.............................................70 5.15.5 eread..............................................71 5.15.6 ewrite.............................................71 5.16 调试函数............................................... 72 5.16.0 请求(Request)中的注意事项........................72 5.16.1 run_requests.......................................72 5.16.2 get_process_state..................................72 5.16.3 get_process_qty....................................73 5.16.4 get_process_info...................................73 5.16.5 start_process *....................................74 5.16.6 continue_process*..................................74 5.16.7 suspend_process*...................................74 5.16.8 attach_process*....................................74 5.16.9 detach_process*....................................75 5.16.10 exit_process*.....................................75 5.16.11 get_thread_qty....................................76 5.16.12 get_reg_val.......................................76 5.16.13 set_reg_val*......................................76 5.16.14 invalidate_dbgmem_contents........................77 5.16.15 invalidate_dbgmem_config..........................77 5.16.16 run_to *..........................................78 5.16.17 step_into*........................................78 5.16.18 step_over*........................................78 5.16.19 step_until_ret*...................................78 5.17 断点................................................... 79 5.17.1 get_bpt_qty........................................79 5.17.2 getn_bpt...........................................79 5.17.3 get_bpt............................................80 5.17.4 add_bpt*...........................................80 5.17.5 del_bpt*...........................................80 5.17.6 update_bpt.........................................81 5.17.7 enable_bpt*........................................81 5.18 跟踪................................................... 82 5.18.1 set_trace_size.....................................82 4
用 C/C++编写 IDA 插件 5.18.2 clear_trace*......................................82 5.18.3 is_step_trace_enabled.............................82 5.18.4 enable_step_trace*................................82 5.18.5 is_insn_trace_enabled.............................83 5.18.6 enable_insn_trace*................................83 5.18.7 is_func_trace_enalbed.............................83 5.18.8 enable_func_trace*................................83 5.18.9 get_tev_qty.......................................84 5.18.10 get_tev_info.....................................84 5.18.11 get_insn_tev_reg_val.............................84 5.18.12 get_insn_tev_reg_result..........................85 5.18.13 get_call_tev_callee..............................85 5.18.14 get_ret_tev_return...............................86 5.18.15 get_bpt_tev_ea...................................86 5.19 字符串................................................ 87 5.19.1 refresh_strlist...................................87 5.19.2 get_strlist_qty...................................87 5.19.3 get_strlist_item..................................87 5.20 其它.................................................. 88 5.20.1 tag_remove........................................88 5.20.2 open_url..........................................88 5.20.3 call_system.......................................89 5.20.4 idadir............................................89 5.20.5 getdspace.........................................89 5.20.6 str2ea............................................89 5.20.7 ea2str............................................90 5.20.8 get_nice_colored_name.............................90 6. 示例.....................................................91 6.1 搜索sprintf,strcpy,和sscanf的调用....................91 6.2 输出含有MOVS指令的函数...............................93 6.3 自动加载动态链接库到IDA数据库........................95 6.4 断点设置器,记录器...................................97 6.5 可选式跟踪(方法一) .................................100 6.6 可选式跟踪(方法二)................................101 6.7 二进制代码拷贝&粘贴.................................103 5
第一章 入门 用 C/C++编写 IDA 插件 1.1 为什么会有这本手册? 花了大量时间在IDA SDK中,来阅读那些头文件,以及学习别人的 插件源代码后,我觉得应该有一个更简单的方法来开始IDA插件编写。 尽管这些头文件中的注释十分翔实,但我发现这样浏览和搜索这些注释 有点困难,因为我需要它们时,并不想通过大劳动量的搜索。我想我该 写这样一本手册,来帮助那些希望开始学习插件开发的朋友。因此,我 决定用一个篇章来介绍如何配置开发环境,让您能更快速地入门。 1.2 涵盖的内容 这本手册将引导您开始编写IDA插件,首先将介绍SDK,然后是介绍 在多个平台下,配置插件开发环境。您将得到如何使用各种类和结构的 经验,接下来是介绍一些作用广泛的SDK导出函数。最后,我将介绍如何 使用IDA API来完成基本的任务,例如,用循环来分析函数,钩挂调试器 和操作IDA数据库文件(IDB文件)。当您读完后,您应该能运用自己的 知识来编写您自己的插件,希望您能通过社区把您的插件公布出来。 1.3 不包括的内容 尽管IDA的标准版和高级版支持许多其他的平台,但我主要关注于 x86平台,因为我在这平台上面有最多的经验。因此,如果您需要全面掌 握所有的IDA函数,我建议您去看看其他的那些头文件。 这本手册主要介绍的是“只读(read only)”函数,而不大介绍其他 的函数,如添加注释,错误校验,定义结构等等函数。SDK资料中的种类 很庞大,不介绍这些函数,是想让手册体积适中。 我开始想介绍netnodes的概念,可是因为IDA SDK的结构和类的成员 很复杂,而且还有很多特殊原因,您知道的,手册不会包含一切。如果 您确实需要这些知识,请您写信告诉我,可能会在下一个手册版本中来 介绍这些,如果没别的特殊原因的话。 1.4 前置知识 首先最重要的是,您应该掌握如何使用IDA,这样您就能够舒服地浏 览反汇编代码,以及配置调试器。还有,您应该准备C/C++语言的知识, 最好还有x86汇编语言。在这里,C++是非常重要的,因为SDK有相当多的 C++代码。如果您对C++不熟悉,但很精通C,您应该至少理解OOP的概念, 如类,对象,方法以及继承。 1.5 居家旅行必备良药 编写、运行IDA插件,您需要IDA pro反汇编器4.8版或4.9版,还有 IDA SDK(您可以从 http://www.datarescue.com处获得,但需要IDA授 6
用 C/C++编写 IDA 插件 权许可),以及一个C/C++编译器,象Visual Studio,GCC平台,Borland 系列,或其他的。 请注意,4.9版中所做的一些改变,已经被写进手册了。而且,对于 4.9版,SDK是稳定的,4.9版的一些函数将不会再改变,也就是说,给4.9 版写的插件(通常是二进制形式)也可以在以后的版本中正常工作。 1.6 C/C++之外的选择 如果您对C也不感冒,那么可以看看IDAPython,它是一个函数集, 用高级语言Python封装了所有C++ API。要获取更多详细资料,请去 http://d-home.net/idapython 。 还 有 一 份 使 用 IDApython 的 手 册 在 http://dkbza.org/idapython_intro.html,里面有很多详尽的介绍,作 者是Ero Carrera。 还有一份介绍使用VB6和C#编写IDA插件的文章,请登陆: http://www.openrce.org/articles/full_view/13。 1.7 关于这本手册 如果您有任何问题、建议或您发现一些错误,请您告诉我,Steve Micallef,邮箱是 steve@binarypool.com。如果您真的从手册中读到对 您有帮助的内容,我仍然会写信感谢您,这么做是非常值得的。 因为SDK会不断“长胖”,所以,这本手册也会适时的升级。您将从 这里 http://www.binarypool.com/idapluginwriting/ 处获得最新版 本的手册拷贝。 1.8 致谢 我必须感谢下面列出的朋友,他们对本手册提供了,审校、鼓励以 及反馈,下列牛人排名不分顺序: Iifak Guilfanov , Pierre Vandevenne , Eric Landuyt , Vitaly Osipov,Sccott Madison,Andrew Griffiths,Thorsten Schneider和 Pedram Amini。 1.9 其他资料 在手册的编写过程中,参考了一份关于IDA插件的文档,该文档介绍 了如何使用4.9版的通用脱壳插件,其中包括如何编写这种插件,以及如 何运行插件。它可以在: http://www.datarescue.com/idabase/unpack_pe/unpacking.pdf 处被 找到。如果您对编写插件很积极,您可以去Dataresuce的论坛去寻求帮 助(http://www.dataresuce.com/cig-local/ultimatebb.cgi),当没有 官方支持的时候,您可以向Datarescue的人(或者IDA老手)求助,他们 会乐意帮助您。 另一个非常棒的地方是 http://www.openrce.org, 在那儿,您将 不仅仅找到很多逆向工程方面的好文章,还有工具,插件以及文档。那 儿还有牛人在论坛里,他们将尽可能帮您解决IDA或者一般的逆向工程问 题。 7
分享到:
收藏