安裝 ipyida#
ipyida 的安裝參考:ida 如何安裝插件 - lca
ipython 如何使用#
安裝完成後,從編輯-插件
處選擇 ipyida 插件,打開後界面如下:
按?可以顯示幫助信息,按 esc 退出幫助信息界面,按 tab 鍵會自動補全命令,如輸入 imp 按 tab 可補全 import,import 後輸入空格,再按 tab 可列出需要導入的模塊。
導入模塊後,可以再模塊後面接?顯示模塊信息。
idaapi?
idaapi?? # 顯示更加詳細
輸入 % hist 可列出歷史命令,% history -n 顯示歷史命令及行號
% edit 打開文本編輯器
% edit x-y 打開文本編輯器並寫入指定範圍內的命令
ida python 的基礎使用#
ida python 由下面的三個獨立模塊組成,分別是:
- idc
- idaapi
- idautils
ida python 中大小寫敏感,命名方式是駝峰命名法。
idc.here()#
獲取當前指令地址
idc.GetDisasm()#
獲取當前的匯編指令
idc.SegName()#
獲取當前處於的段
idc.MinEA&idc.MaxEx#
獲取該程序最低和最高地址
ea = idc.here()
next_str = idc.NextHead(ea)
pre_instr = idc.prev_head(ea)
獲取上(下)一條匯編指令的地址
SceenEA#
表示反匯編中當前光標的位置
需要導入模塊import idaapi
如果用 ScreenEa 函數,則會報錯,可能和 python 版本有關係,如下是 python3 報錯
運行腳本命令,首先創建一個腳本(python3環境下)
然後通過文件-運行文件
加載腳本運行,運行結果如下:
idc.GetDisasm (start_ea) 命令輸出當前光標處的指令(python3環境下)
如果把光標指向其他位置,ea 會重新查找光標的位置和值。
通過idc.GetOpnd()
函數可以輸出指令的第一個或第二個操作數。
獲取當前光標位置的函數名
import idc
import idaapi
ea = idc.ScreenEA()
func = idaapi.get_func(ea)
funcname = idc.GetFunctionName(func.startEA)
print funcname
獲取當前函數名
import idc
import idautils
ea = idc.ScreenEA()
start = idc.SegStart(ea)
end = idc.SegEnd(ea)
for funcea in idautils.Functions(start,end):
name = idc.GetFunctionName(funcea)
print name
獲取區塊的所有函數名
E = list(idautils.FuncItems(ea))
for e in E:
print "%X"%e,idc.GetDisasm(e)
輸出函數的所有指令
對比反匯編視圖中的指令
將光標移動到 WndProc 處,可以查看引用
將光標移動到CARTEL_BUENO函數
處,按 X 鍵顯示wndproc函數
調用了CARTEL_BUENO函數
。
通過調用 coderefs () 函數獲取調用它的函數名。
獲取 CARTEL_BUENO 參照。