IDApython 命令
因?yàn)榫W(wǎng)上對(duì)于IDApython的介紹太少,所以在這里列舉了一些常用函數(shù):
?
ScreenEA()
獲取 IDA 調(diào)試窗口中,光標(biāo)指向代碼的地址。通過這個(gè)函數(shù),我們就能夠從一個(gè)已知 的點(diǎn)運(yùn)行我們的腳本。
GetInputFileMD5()
返回 IDA 加載的二進(jìn)制文件的 MD5 值,通過這個(gè)值能夠判斷一個(gè)文件的不同版本是否 有改變。
FirstSeg()
訪問程序中的第一個(gè)段。
NextSeg()
訪問下一個(gè)段,如果沒有就返回 BADADDR。
SegByName( string SegmentName )
通過段名字返回段基址,舉個(gè)例子,如果調(diào)用.text 作為參數(shù),就會(huì)返回程序中代碼段的開始位置。
SegEnd( long Address )
通過段內(nèi)的某個(gè)地址,獲得段尾的地址。
SegStart( long Address )
通過段內(nèi)的某個(gè)地址,獲得段頭的地址。
SegName( long Address )
通過段內(nèi)的某個(gè)地址,獲得段名。
Segments()
返回目標(biāo)程序中的所有段的開始地址。
Functions( long StartAddress, long EndAddress )
返回一個(gè)列表,包含了從 StartAddress 到 EndAddress 之間的所有函數(shù)。
Chunks( long FunctionAddress )
返回一個(gè)列表,包含了函數(shù)片段。每個(gè)列表項(xiàng)都是一個(gè)元組(chunk start, chunk end)
LocByName( string FunctionName )
通過函數(shù)名返回函數(shù)的地址。
GetFuncOffset( long Address )
通過任意一個(gè)地址,然后得到這個(gè)地址所屬的函數(shù)名,以及給定地址和函數(shù)的相對(duì)位移。 然后把這些信息組成字符串以"名字+位移"的形式返回。
GetFunctionName( long Address )
通過一個(gè)地址,返回這個(gè)地址所屬的函數(shù)。
CodeRefsTo( long Address, bool Flow )
返回一個(gè)列表,告訴我們 Address 處代碼被什么地方引用了,Flow 告訴 IDAPython 是否要 跟蹤這些代碼。
CodeRefsFrom( long Address, bool Flow )
返回一個(gè)列表,告訴我們 Address 地址上的代碼引用何處的代碼。
DataRefsTo( long Address )
返回一個(gè)列表,告訴我們 Address 處數(shù)據(jù)被什么地方引用了。常用于跟蹤全局變量。
DataRefsFrom( long Address )
返回一個(gè)列表,告訴我們 Address 地址上的代碼引用何處的數(shù)據(jù)。
Heads(start=None, end=None)
得到兩個(gè)地址之間所有的元素
GetDisasm(addr)
得到addr的反匯編語句
GetMnem(addr)
得到addr地址的操作碼
BADADDR
驗(yàn)證是不是錯(cuò)誤地址
GetOpnd(addr,long n)
第一個(gè)參數(shù)是地址,第二個(gè)long n是操作數(shù)索引。第一個(gè)操作數(shù)是0和第二個(gè)是1。
idaapi.decode_insn(ea)
得到當(dāng)前地址指令的長(zhǎng)度
idc.FindFuncEnd(ea)
找到當(dāng)前地址的函數(shù)結(jié)束地址
Entries()
入口點(diǎn)信息
Structs()
遍歷結(jié)構(gòu)體
StructMembers(sid)
遍歷結(jié)構(gòu)體成員
DecodePrecedingInstruction(ea) 獲取指令結(jié)構(gòu)
DecodePreviousInstruction(ea)
DecodeInstruction(ea)
Strings(object) 獲取字符串
GetIdbDir() 獲取idb目錄
GetRegisterList() 獲取寄存器名表
GetInstructionList 獲取匯編指令表
atoa(ea) 獲取所在段
Jump(ea) 移動(dòng)光標(biāo)
Eval(expr) 計(jì)算表達(dá)式
Exec(command) 執(zhí)行命令行
MakeCode(ea) 分析代碼區(qū)
MakeNameEx(ea, name, flags) 重命名地址
MakeArray(ea, nitems) 創(chuàng)建數(shù)組
MakeStr(ea, endea) 創(chuàng)建字符串
MakeData(ea, flags, size, tid) 創(chuàng)建數(shù)據(jù)
MakeByte(ea)
MakeWord(ea)
MakeDWord(ea)
MakeQWord(ea)
MakeOWord(ea)
MakeYWord(ea)
MakeFlot(ea)
MakeDouble(ea)
MakePackReal(ea)
MakeTbyte(ea)
MakeStructEx(ea)
MakeCustomDataEx(ea)
PatchByte(ea, value) 修改程序字節(jié)
PatchWord(ea, value)
PatchDword(ea, value)
PatchByte(ea, value)
PatchByte(ea, value)
Byte(ea) 將地址解釋為Byte
Word(ea)
DWord(ea)
QWord(ea)
GetFloat(ea)
GetDouble(ea)
GetString(ea, length = -1, strtype = ASCSTR_C) 獲取字符串
GetCurrentLine() 獲取光標(biāo)所在行反匯編
ItemSize(ea) 獲取指令或數(shù)據(jù)長(zhǎng)度
FindText(ea, flag, y, x, searchstr)查找文本
FindBinary(ea, flag, searchstr, radix=16) 查找16進(jìn)制
GetEntryPointQty() 獲取入口點(diǎn)個(gè)數(shù)
GetEntryOrdinal(index) 獲取入口點(diǎn)地址
GetEntryName(ordinal) 入口名
idc.GetFunctionAttr(ea, attr) //得到當(dāng)前地址所在函數(shù)的數(shù)據(jù)
(
FUNCATTR_START = 0 # function start address
FUNCATTR_END = 4 # function end address
FUNCATTR_FLAGS = 8 # function flags
FUNCATTR_FRAME = 10 # function frame id
FUNCATTR_FRSIZE = 14 # size of local variables
FUNCATTR_FRREGS = 18 # size of saved registers area
FUNCATTR_ARGSIZE = 20 # number of bytes purged from the stack
FUNCATTR_FPD = 24 # frame pointer delta
FUNCATTR_COLOR = 28 # function color code
FUNCATTR_OWNER = 10 # chunk owner (valid only for tail chunks)
FUNCATTR_REFQTY = 14 # number of chunk parents (valid only for tail chunks)
)
class DbgHook(DBG_Hooks):
# Event handler for when the process starts
def dbg_process_start(self, pid, tid, ea, name, base, size)
return
# Event handler for process exit
def dbg_process_exit(self, pid, tid, ea, code):
return
# Event handler for when a shared library gets loaded def
dbg_library_load(self, pid, tid, ea, name, base, size):
return
# Breakpoint handler
def dbg_bpt(self, tid, ea):
return
這個(gè)類包含了我們?cè)趧?chuàng)建調(diào)試腳本時(shí),會(huì)經(jīng)常用到的幾個(gè)調(diào)試事件處理函數(shù)。安裝 hook 的方式如下:
debugger = DbgHook()
debugger.hook()
現(xiàn)在運(yùn)行調(diào)試器,hook 會(huì)捕捉所有的調(diào)試事件,這樣就能非常精確的控制 IDA 調(diào)試器。 下面的函數(shù)在調(diào)試的時(shí)候非常有用:
AddBpt( long Address )
在指定的地點(diǎn)設(shè)置軟件斷點(diǎn)。
GetBptQty()
返回當(dāng)前設(shè)置的斷點(diǎn)數(shù)量。
GetRegValue( string Register )
通過寄存器名獲得寄存器值。
SetRegValue( long Value, string Register )
?
這個(gè)是用IDApytohon編寫的查找strcpy函數(shù)以及他的參數(shù)是否在棧區(qū)域
1 def is_stack_buffer(addr, idx): 2 inst = DecodeInstruction(addr) 3 4 # IDA < 7.0 5 try: 6 ret = get_stkvar(inst[idx], inst[idx].addr) != None 7 # IDA >= 7.0 8 except: 9 from ida_frame import * 10 v = inst[idx].addr 11 if sys.maxint < v: 12 v = twos_compl(v) 13 ret = get_stkvar(inst, inst[idx], v) 14 return ret 15 16 def find_arg(addr,arg_num): ##This is x86 17 function_h=LocByName(GetFunctionName(addr)) 18 step=0 19 arg_cou=0 20 while step<0 : 21 step=step+1 22 addr=idc.PrevHead(addr) 23 op=GetMnem(addr).lower() 24 if op in ("ret","jmp","retn","b") or addr<function_h: 25 return 26 if op =="push": 27 arg_count=arg_count+1 28 if arg_count==arg_num: 29 return GetOpnd(addr,0) 30 31 for functionaddr in Functions(): 32 if "strcpy" in GetFunctionName(functionaddr): 33 xref=CodeRefsTo(functionaddr,0) 34 for xxx in xref: 35 if GetMnem(xxx).lower()=="call": 36 oped= find_arg(xxx,1) 37 function_h=LocByName(GetFunctionName(xxx)) 38 addr_=xxx 39 lalal=xxx 40 while True: 41 __add=idc.PrevHead(addr_) 42 __op=GetMnem(__add).lower() 43 44 if __op in ("ret", "retn", "jmp", "b") or __add < function_h: 45 break 46 if __op == "lea" and GetOpnd(__add,0)==oped: 47 if is_stack_buffer(addr_,1): 48 prinf "STACK at 0x%X"%lalal 49 break 50 if __op == "mov" and GetOpnd(addr_,0)==oped: 51 op_type = GetOpType(addr_, 1) 52 if op_type == o_reg: 53 oped = GetOpnd(addr_, 1) 54 lalal = addr_ 55 else: 56 break?
轉(zhuǎn)載于:https://www.cnblogs.com/0xHack/p/9399321.html
總結(jié)
以上是生活随笔為你收集整理的IDApython 命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jackson 问题定位
- 下一篇: Python入门学习笔记13(线程锁与信