IDA7.5下的idapython使用


开始学习IDApython的使用

网上的教程都是基于7.0版本的IDA,自IDA7.4之后,idapython的语法就有了变化,且由py2转移到了py3,所以需要对照着Hexray官方的说明来修改,链接

跟着这个教程一点点学习

IDApython由三个独立模块组成,第一个是idc,它是封装IDA的IDA函数的兼容性模块,现在已经很少使用。第二个模块是idautils,这是IDA里的一个高级实用函数。第三个模块是idaapi,它允许访问更多低级的数据,这些数据能够被类使用通过IDA。

0x1.基础

.text:00012529 mov esi, [esp+4+arg_0]

.text是段名称,地址是00012529。mov是助记符,第一个操作是esi,第二个操作是[esp+4+arg_0]

ea=here()/idc.get_screen_ea
获取当前光标所在位置的地址,返回一个16进制的整型值

Python>here()
0x40d478
Python>idc.get_screen_ea()
0x40d478
Python>type(here())
<class 'int'>

ida_ida.inf_get_min_ea() 获取最小地址

ida_ida.inf_get_max_ea() 获取最大地址

Python>ida_ida.inf_get_min_ea()
0x400000
Python>ida_ida.inf_get_max_ea()
0x50c9fc
Python>type(ida_ida.inf_get_max_ea())
<class 'int'>

idc.get_segm_name() 获取当前段的名称

Python>idc.get_segm_name(ea)
'.text'

idc.GetDisasm() 获取当前地址的指令

Python>idc.GetDisasm(ea)
'li      $gp, unk_4EC460'

idc.print_insn_mnem 获取当前地址助记符

Python>idc.print_insn_mnem(ea)
'li'

idc.print_operand 获取当前地址操作数

Python>idc.print_operand(ea,0)
'$gp'
Python>idc.print_operand(ea,1)
'unk_4EC460'

idaapi.BADADDR 验证地址是否存在

import idautils
import idaapi
ea=here()
if ea!=idaapi.BADADDR:
    print('valid address')

遍历所有段 idautils.Segments()返回一个遍历类型对象

import idautils
import idaapi
import idc
for seg in idautils.Segments():
    print("%s 0x%x 0x%x"%(idc.get_segm_name(seg),idc.get_segm_start(seg),idc.get_segm_end(seg)))

遍历所有已知函数 idautils.Functions() idautils.Functions()将返回一个已知函数列表

import idautils
import idaapi
import idc
for func in idautils.Functions():
    print(hex(func),idc.get_func_name(func))

idaapi.get_func() 获取当前地址的函数

dir(class)查询python中类的有效函数

import idautils
import idaapi
import idc
func=idaapi.get_func(ea)
print("start:0x%x end:0x%x"%(func.start_ea,func.end_ea))
print(dir(func))

idc.get_func_attr来获取下个指令的开始和继续,直到我们到达这个函数的末尾

idc.next_head来获取下个指令的开始和继续,直到我们到达这个函数的末尾

import idautils
import idaapi
import idc
ea=here()
start=idc.get_func_attr(ea,FUNCATTR_START)
end=idc.get_func_attr(ea,FUNCATTR_END)
cur_addr=start
while cur_addr<=end:
    print(hex(cur_addr),idc.GetDisasm(cur_addr))
    cur_addr=idc.next_head(cur_addr,end)

idc.get_func_attr(ea, FUNCATTR_FLAGS) 收集有关于函数的信息


文章作者: Lock
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lock !
评论
 上一篇
STM32学习(1) STM32学习(1)
开始学习STM32,我买的开发板是正点原子的STM32F103ZET6战舰v3 相对比51,STM32的知识量要大出许多许多,这里学一点记一点吧。 1.STM32F103ZET6有144个引脚,7组IO口,每组IO有16个IO,一共7*16
2021-02-13 Lock
下一篇 
pwntrick pwntrick
记录一下pwn的一些小技巧以及一些利用方式,想到哪个写哪个吧。 0x1.stack smashing detected的利用stack smash技术的利用基础就是栈溢出导致canary被覆盖之后的报错流程 extern char **__
2021-01-02
  目录