一、創建代碼工程
創建一個生成動態庫的空工程。
工程屬性配置
1、 配置體調試信息
將D:\Program Files\IDA 7.2\ida64.exe添加到配置屬性\命令(注*此處配置是為了調試方便)
2、添加SDK路徑
將IDASDK 的include、module的路徑添加到配置屬性\C/C++\常規\附加包含目錄
$(ProjectDir)idasdk72\include
$(ProjectDir)idasdk72\module
3、配置預處理器定義
將__NT__、_DEBUG、_CONSOLE加到配置屬性\C/C++\預處理器\預處理器定義
4、配置輸出路徑和依賴庫路徑
4.1將D:\Program Files\IDA 7.2\procs\$(TargetName)64$(TargetExt)添加到配置屬性\鏈接器\常規\輸出文件(注*:此處目的是將生成的DLL直接輸出大IDA安裝目錄,方便調試)
4.2將$(ProjectDir)idasdk72\lib\x64_win_vc_32添加到配置屬性\鏈接器\常規\附加庫目錄(該處的路徑選擇根據你電腦的系統屬性來選擇)
5、添加依賴庫
將ida.lib添加到配置屬性\鏈接器\輸入\附加依賴項
6、從IDASDK\module目錄下找出於要編寫的處理器類似的代碼文件即可創建好的工程如下
二、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,在處理器選擇界面出現下圖所示一欄選擇即加載成功