一、创建代码工程
创建一个生成动态库的空工程。
工程属性配置
1、 配置体调试信息
将D:Program FilesIDA 7.2ida64.exe添加到配置属性命令(注*此处配置是为了调试方便)
2、添加SDK路径
将IDASDK 的include、module的路径添加到配置属性C/C++常规附加包含目录
$(ProjectDir)idasdk72include
$(ProjectDir)idasdk72module
3、配置预处理器定义
将__NT__、_DEBUG、_CONSOLE加到配置属性C/C++预处理器预处理器定义
4、配置输出路径和依赖库路径
4.1将D:Program FilesIDA 7.2procs$(TargetName)64$(TargetExt)添加到配置属性链接器常规输出文件(注*:此处目的是将生成的DLL直接输出大IDA安装目录,方便调试)
4.2将$(ProjectDir)idasdk72libx64_win_vc_32添加到配置属性链接器常规附加库目录(该处的路径选择根据你电脑的系统属性来选择)
5、添加依赖库
将ida.lib添加到配置属性链接器输入附加依赖项
6、从IDASDKmodule目录下找出于要编写的处理器类似的代码文件即可创建好的工程如下
二、IDA指令解析流程
分析(Ana)
在notify_ana(self, insn)中,需要做的是读取数据并解析成指令。根据opcode找到对应的指令,读取并设置好指令的参数与属性。其中insn为一个insn_t类型的变量,即为要设置的指令对象。调用insn.get_next_byte()系列方法可以获取到当前的数据,也就是下一步要解析的指令或操作数。设置insn的itype属性为指令的itype,根据操作数数量设置insn.Op1及insn.Op2的系列属性如type(操作数类型):o_imm(立即数)/o_reg(寄存器)/o_mem(内存)……、dtype(操作数大小):dt_byte/dt_word/dt_dword和value(操作数的值),在不需要调试的情况下主要需要更改的代码区即为分析。
模拟(Emu)
体现在notify_emu(self)中,用于设置数据与代码之间的关系,例如当前指令执行完毕后如果顺序执行下一条指令就要通过add_cref(insn.ea, insn.ea + insn.size, fl_F)来告诉ida这条指令的下一条在哪。其中第一个参数为出发点,多数时候为当前指令地址,第二个参数为将跳到的地址,第三个参数有可能为 fl_F(顺序),fl_JN/fl_JF(跳转)以及fl_CN/fl_CF(调用)。以及使用add_dref(op.addr, op.offb, dr_O)类似指令来添加数据的引用信息。如果有对栈数据的分析也在模拟过程中处理,可参考ebc.py中emu回调所调用的trace_sp方法。再笔者的理解中,除了个别情况,大多数修改ida数据库中数据的操作都在模拟部分进行。
输出(output)
体现在notify_out_operand(self, ctx, op)与notify_out_insn(self, ctx)两个方法。notify_out_operand用来输出参数,notify_out_insn用来输出指令。注释中特意指出在这两个方法中不应该有任何操作数据库,修改标志位等操作。笔者认为与output操作执行次数较多有关。
三、使用方法
1、将.cfg文件拷贝到IDA安装目录下的cfg文件夹下
2、将.dll文件拷贝到IDA安装目录下的procs文件夹下
在次打开IDA,在处理器选择界面出现下图所示一栏选择即加载成功