IDA脚本笔记

获取当前光标所指向的地址

idaapi.here()
idc.get_screen_ea()
返回一个整型地址,为光标所在行的地址

1
2
curEA = idc.here()
print("CurEA: %08X" % curEA)

通过一个地址 获得命中的函数

idc.GetFunctionAttr(EA, idc.FUNCATTR_START)
idc.GetFunctionAttr(EA, idc.FUNCATTR_END)
分别得到IDA自动分析得到的函数头和函数尾部的地址

1
2
dwFunStart = idc.GetFunctionAttr(curEA, idc.FUNCATTR_START)
dwFunEnd = idc.GetFunctionAttr(curEA, idc.FUNCATTR_END)

通过一个地址,得到一个函数对象

idaapi.get_func(EA)
通过一个地址,得到一个函数对象,对象类型(idaapi.func_t)

1
2
3
4
5
6
7
curFun = idaapi.get_func(dwFunStart)
if curFun is not None:
dwFunStart = curFun.start_ea
dwFunEnd = curFun.end_ea
print("GetFunSucess\r\nFunStart: %08X\r\nFunEnd: %08X" % (dwFunStart, dwFunEnd))
else:
print ("GetFunError")

通过一个地址,得到一个函数中,所有行的地址

idautils.FuncItems(EA)
传入一个函数的开始地址,然后返回一个生成器
每次调用生成器,返回一条指令地址

lstFunAddr = list(idautils.FuncItems(dwFunStart))

1
2
3
4
lstFunAddr = list(idautils.FuncItems(dwFunStart))
print ("ShowLst:")
for i in lstFunAddr:
print ('Addr: %08X' % i)

通过一个地址,获得当前行的注释

idaapi.get_cmt(EA, flag)
参数1,地址;参数2,是否获取重复,返回一个注释字符串

1
2
cmt = idaapi.get_cmt(addr, 0)
print(cmt)

给地址设置名称

idc.MakeNameEx(ea, name, flags)

地址, 名称字符串, 什么类型的名称

1
idc.set_name(0x004086B9, "Test1", idc.SN_NOWARN)

扫描特征码

1
2
3
4
5
6
7
8
9
10
11
12

decode_func_code = '\x55\x8B' # 绝对地址特征码

def get_decode_func_addr():

for func in idautils.Functions(): # 获得已解析的函数
func_code = idc.GetManyBytes( func, len(decode_func_code) ) # 得到特征码长度的二进制字符串
#print 'func=%08X, func_code=%s, decode_code=%s' %(func,func_code,decode_func_code)
if func_code == decode_func_code: # 比对特征码
print 'decode addr = %08X' %( func )
return func
return idc.BADADDR # 返回一个错误值

通过一个地址得到数据

1
2
3
idc.Byte(EA) # 得到指定地址的一个字节数据
idc.Word(EA) # 得到一个DWORD
idc.QWord(EA) # 得到一个QWORD

文章目录
  1. 1. 获取当前光标所指向的地址
  2. 2. 通过一个地址 获得命中的函数
  3. 3. 通过一个地址,得到一个函数对象
  4. 4. 通过一个地址,得到一个函数中,所有行的地址
  5. 5. 通过一个地址,获得当前行的注释
  6. 6. 给地址设置名称
  7. 7. 扫描特征码
  8. 8. 通过一个地址得到数据
|