常用IDA脚本开发API
                    目录
                    
                
                
            常用IDA脚本开发API
本文所提及的api适用于IDA Pro 7.5,python3,内容来自权威指南和IDA官网,本文将其中的idc api找到了对应的python3 api,并省略了一些字符串操作函数以及文件输入输出函数,因为这些工作可以由python单独完成,故不对该类函数多做介绍。记录一下方便查阅。
1读取和修改数据的函数
idc.get_wide_byte(addr),从虚拟地址addr处读取一个字节值idc.get_wide_word(addr),从虚拟地址addr处读取一个字(2字节)值idc.get_wide_dword(addr),从虚拟地址addr处读取一个双字(4字节)值idc.get_qword(addr),从虚拟地址addr处读取一个四字(8字节)值ida_bytes.patch_byte(addr,byte),设置虚拟地址addr处的一个字节值ida_bytes.patch_word(addr,word),设置虚拟地址addr处的一个字值ida_bytes.patch_dword(addr,dword),设置虚拟地址addr处的一个双字值ida_bytes.patch_qword(addr,qword),设置虚拟地址addr处的一个四字值ida_bytes.is_loaded(addr),如果addr包含有效数据,则返回1,否则返回0
2用户交互函数
ida_kernwin.warning(string format, ...),在对话框中显示一条格式化消息ida_kernwin.ask_str(defval, hist, prompt),显示一个输入框,要求用户输入一个字符串值。defval为输入框中的默认值,hist为history id传入数字,用途不明,prompt代表输入字符串的意图。操纵成功后返回用户输入的字符串,若取消操作则返回Noneida_kernwin.ask_file(saving, defval, title),显示一个文件选择对话框,saveing为1时为保存文件,为0时为读取文件;defval为文件名输入框中的默认值,能够起到一定的筛选格式的作用;title为对话框标题。操作成功后返回目标文件的绝对路径,否则返回Noneida_kernwin.ask_yn(deflt,msg),弹出用户确认对话框,deflt为默认选项,1为确认,0为否认,-1为取消;msg为对话框的提示信息。返回值为用户的选项。idc.get_screen_ea(),返回当前光标所在的虚拟地址ida_kernwin.jumpto(addr),跳转到反汇编窗口的addr地址所在处
由于IDA脚本开发没有调试工具(不清楚IDA Pro 7.5有没有,至少老版本没有),所以需要使用print等函数来作为主要的调试工具。
3操纵数据库名称
idc.get_name(ea,flag=0),返回与给定地址ea处有关的名称,如果没名称则返回空字符串。flag可忽略,作用不明。idc.set_name(ea,name,flag=0),将给定的名称分配给指定的地址,如果name == ""则删除已有名称。flag可忽略,作用不明。idc.get_name_ea_simple(name),返回指定名称所在的地址,不支持正则匹配,如果找不到则返回0xffffffffffffffff
4处理函数的函数
idc.get_func_attr(ea,attr),返回ea处函数的attr属性值。attr有四个选项:FUNCATTR_START=0,FUNCATTR_END=8,FUNCATTR_OWNER=24,FUNCATTR_REFQTY=32。其中ea不一定要求是函数的开头,可以是函数内的某一个地址,这点很好用。idc.get_func_name(ea),返回ea处函数的名称。失败则返回空字符串。其中ea不一定要求是函数的开头,可以是函数内的某一个地址,这点很好用。idc.get_next_func(ea),从给定地址ea处向下寻找第一个function,并返回其虚拟地址,若找不到则返回-1idc.get_prev_func(ea),从给定地址ea处向上寻找第一个function,并返回其虚拟地址,若找不到则返回-1
5代码交叉引用函数
ida_xref.get_first_cref_from(frm),返回给定地址向其转交控制权的第一个位置。如果没有则返回-1ida_xref.get_next_cref_from(frm, current),如果current已经在前一次调用Rfirst或Rnext时返回,则返回给定地址frm转交控制权的下一个位置。如果没有则返回-1idc.get_xref_type(),返回一个常量,说明某个交叉引用查询函数(如Rfirst)返回的最后一个交叉引用的类型。对于代码交叉引用,这些常量包括fl_CN(近调用)、fl_CF(远调用)、fl_JN(近跳转)、fl_JF(远跳转)和fl_F(普通顺序流)ida_xref.get_first_cref_to(to),返回转交控制权到给定地址的第一个位置。如果没有则返回-1ida_xref.get_next_cref_to(to, current),如果current已经在前一次调用Rfirst或Rnext时返回,则返回下一个转交控制权到给定地址的第一个位置。如果没有则返回-1
6数据交叉引用函数
ida_xref.get_first_dref_from(frm),返回给定地址引用一个数据值的第一个位置。如果没有则返回-1ida_xref.get_next_dref_from(frm, current),如果current已经在前一次调用Dfirst或Dnext时返回,则返回给定地址frm向其引用一个数据值的下一个位置。如果没有则返回-1idc.get_xref_type(),返回一个常量,说明某个交叉引用查询函数(如Dfirst)返回的最后一个交叉引用的类型。对于数据交叉引用,这些常量包括dr_0(提供的偏移量)、dr_W(数据写入)和dr_R(数据读取)ida_xref.get_first_dref_to(to),返回将给定地址to作为数据引用的第一个位置。如果没有则返回-1ida_xref.get_next_dref_to(to, current),如果current已经在前一次调用Dfirst或Dnext时返回,则返回将给定地址to作为数据引用的下一次位置。如果没有则返回-1
7数据库操纵函数
ida_bytes.del_items(ea,flag=0,nbytes=1,may_destroy=None),取消给定地址ea处的定义,其他参数可省略,意义不明。相当于按快捷键Uidc.create_insn(ea),将目标地址解释为汇编代码,相当于按快捷键C,成功后返回True,否则返回Falseida_bytes.create_data,将目标地址识别为指定类型的数据。用法如下create_data(ea, FF_BYTE, 1, ida_idaapi.BADADDR) == MakeByte(ea);create_data(ea, FF_WORD, 2, ida_idaapi.BADADDR) == MakeWord(ea);create_data(ea, FF_DWORD, 4, ida_idaapi.BADADDR) == MakeDword(ea);create_data(ea, FF_QWORD, 8, ida_idaapi.BADADDR) == MakeQword(ea);create_data(ea, FF_OWORD, 16, ida_idaapi.BADADDR) == MakeOword(ea);create_data(ea, FF_YWORD, 32, ida_idaapi.BADADDR) == MakeYword(ea);create_data(ea, FF_FLOAT, 4, ida_idaapi.BADADDR) == MakeFloat(ea);create_data(ea, FF_DOUBLE, 8, ida_idaapi.BADADDR) == MakeDouble(ea);create_data(ea, FF_PACKREAL, 10, ida_idaapi.BADADDR) == MakePackReal(ea);create_data(ea, FF_TBYTE, 10, ida_idaapi.BADADDR) == MakeTbyte(ea);create_data(ea, FF_CUSTOM, size, dtid|((fid)<<16)) == MakeCustomData(ea, size, dtid, fid);idc.set_cmt(ea, cmt, isRepeatable),在指定地址ea处添加注释,isRepeatable表明是否可重复注释ida_funcs.add_func(ea1, ea2=BADADDR),在指定地址处创建函数,相当于按快捷键P
8数据库搜索函数
ida_search.find_code(ea,flag),从给定的地址搜索一条指令ida_search.find_data(ea,flag),从给定的地址搜索一个数据项ida_search.find_binary(start_ea, y, x, binary, sflag),在给定的地址,从给定行的给定列搜索binaryida_search.find_text(start_ea, y, x, ustr, sflag),在给定的地址,从给定行的给定列搜索字符串
9反汇编行组件
idc.generate_disasm_line(ea,flag),返回反汇编窗口中目标地址的代码(包括但不限于汇编代码),flag填个0就行。idc.print_insn_mnem(ea),返回反汇编窗口中目标地址的指令助记符部分,若非汇编代码则返回空字符串idc.print_operand(ea,index),返回反汇编窗口中目标地址的操作数的文本形式,index为操作数编号从0开始。idc.get_operand_type(ea,index),返回一个整数,指出给定地址的给定操作数的类型,具体需参考IDC文档了解操作数类型代码idc.get_operand_value(ea,index),返回与给定地址的给定操作数有关的整数值。返回值的性质取决于GetOpType指定的给定操作数的类型