IDApython 命令

因为网上对于IDApython的介绍太少,所以在这里列举了一些常用函数:

ScreenEA()
  获取 IDA 调试窗口中,光标指向代码的地址。通过这个函数,我们就能够从一个已知 的点运行我们的脚本。

GetInputFileMD5()
  返回 IDA 加载的二进制文件的 MD5 值,通过这个值能够判断一个文件的不同版本是否 有改变。

FirstSeg()
  访问程序中的第一个段。

NextSeg()
  访问下一个段,如果没有就返回 BADADDR。

SegByName( string SegmentName )
  通过段名字返回段基址,举个例子,如果调用.text 作为参数,就会返回程序中代码段的开始位置。

SegEnd( long Address )
  通过段内的某个地址,获得段尾的地址。

SegStart( long Address )
  通过段内的某个地址,获得段头的地址。

SegName( long Address )
  通过段内的某个地址,获得段名。

Segments()
  返回目标程序中的所有段的开始地址。

Functions( long StartAddress, long EndAddress )
  返回一个列表,包含了从 StartAddress 到 EndAddress 之间的所有函数。

Chunks( long FunctionAddress )
  返回一个列表,包含了函数片段。每个列表项都是一个元组(chunk start, chunk end)

LocByName( string FunctionName )
  通过函数名返回函数的地址。

GetFuncOffset( long Address )
  通过任意一个地址,然后得到这个地址所属的函数名,以及给定地址和函数的相对位移。 然后把这些信息组成字符串以"名字+位移"的形式返回。

GetFunctionName( long Address )
  通过一个地址,返回这个地址所属的函数。

CodeRefsTo( long Address, bool Flow )
  返回一个列表,告诉我们 Address 处代码被什么地方引用了,Flow 告诉 IDAPython 是否要 跟踪这些代码。

CodeRefsFrom( long Address, bool Flow )
  返回一个列表,告诉我们 Address 地址上的代码引用何处的代码。

DataRefsTo( long Address )
  返回一个列表,告诉我们 Address 处数据被什么地方引用了。常用于跟踪全局变量。

DataRefsFrom( long Address )
  返回一个列表,告诉我们 Address 地址上的代码引用何处的数据。

Heads(start=None, end=None)
  得到两个地址之间所有的元素

GetDisasm(addr)
  得到addr的反汇编语句

GetMnem(addr)
  得到addr地址的操作码

BADADDR
  验证是不是错误地址

GetOpnd(addr,long n)
  第一个参数是地址,第二个long n是操作数索引。第一个操作数是0和第二个是1。

idaapi.decode_insn(ea)
  得到当前地址指令的长度

idc.FindFuncEnd(ea)
  找到当前地址的函数结束地址

Entries()
  入口点信息

Structs()
  遍历结构体

StructMembers(sid)
  遍历结构体成员

DecodePrecedingInstruction(ea) 获取指令结构
DecodePreviousInstruction(ea)
DecodeInstruction(ea)

Strings(object) 获取字符串
GetIdbDir() 获取idb目录
GetRegisterList() 获取寄存器名表
GetInstructionList 获取汇编指令表

atoa(ea) 获取所在段
Jump(ea) 移动光标
Eval(expr) 计算表达式
Exec(command) 执行命令行
MakeCode(ea) 分析代码区
MakeNameEx(ea, name, flags) 重命名地址
MakeArray(ea, nitems) 创建数组
MakeStr(ea, endea) 创建字符串
MakeData(ea, flags, size, tid) 创建数据
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) 修改程序字节
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() 获取光标所在行反汇编

ItemSize(ea) 获取指令或数据长度

FindText(ea, flag, y, x, searchstr)查找文本
FindBinary(ea, flag, searchstr, radix=16) 查找16进制

GetEntryPointQty() 获取入口点个数
GetEntryOrdinal(index) 获取入口点地址
GetEntryName(ordinal) 入口名

idc.GetFunctionAttr(ea, attr) //得到当前地址所在函数的数据
(
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

这个类包含了我们在创建调试脚本时,会经常用到的几个调试事件处理函数。安装 hook 的方式如下:
debugger = DbgHook()
debugger.hook()
现在运行调试器,hook 会捕捉所有的调试事件,这样就能非常精确的控制 IDA 调试器。 下面的函数在调试的时候非常有用:
AddBpt( long Address )
在指定的地点设置软件断点。
GetBptQty()
返回当前设置的断点数量。
GetRegValue( string Register )
通过寄存器名获得寄存器值。
SetRegValue( long Value, string Register )

这个是用IDApytohon编写的查找strcpy函数以及他的参数是否在栈区域

 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

原文地址:https://www.cnblogs.com/0xHack/p/9399321.html

时间: 2024-08-17 09:20:37

IDApython 命令的相关文章

linux常用命令--netstat

简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接等等. 常用参数 -a (all)显示所有选项,提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化成数字.-l 仅列出有在 Listen (监听) 的服務状态 -p 显示建立相关链接的程序名-r 显示路由信息,路由

使用fruitstrap实现命令行将IPA包安装到iOS设备上

Requirements Mac OS X. Tested on Snow Leopard only. You need to have a valid iPhone development certificate installed. Xcode must be installed, along with the SDK for your iOS version. Usage fruitstrap [-d] -b <app> [device_id] Optional -d flag laun

Linux基础命令小结

注意:Linux严格区分大小写 老男孩方法论经验之谈: 有一种方法叫做没方法 有两种方法,左右为难 有三种方法才叫有方法 停止一个命令:CTR + C 1.创建目录 英文:make directorys 命令:mkdir 实例:三种方式 mkdir /data cd / mkdir data cd /;mkdir data mkdir x y z    表示同时创建多个目录 mkdir -p /data/x/y   表示同时创建多级目录(递归创建),切记不可用mkdir /data/x/y 2.

10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包

- 10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包 - 扩展tcp三次握手四次挥手 http://www.doc88.com/p-9913773324388.html  - tshark几个用法:http://www.aminglinux.com/bbs/thread-995-1-1.html  # 10.6 监控io性能 ![mark](http://oqxf7c508.bkt.clouddn.com/b

uboot下的命令使用示例

1.usb 可以使用此命令读取u盘里的内容,此命令加上相关参数可以有以下功能: 1.1usb start 在使用u盘之前必须启动此命令以初始化好fat文件系统环境,笔者的输出如下: jello # usb start(Re)start USB...USB:   Starting the controllerscanning bus for devices... 5 USB Device(s) found       scanning bus for storage devices... usb_

reset master和reset slave命令解析和区别

reset master删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库, 注意: reset master 不同于purge binary log的两处地方1.reset master 将删除日志索引文件中记录的所有binlog文件,创建一个新的日志文件 起始值从000001 开始,然而purge binary log 命令并不会修改记录binlog的顺序的数值2.reset maste

【Windows10&nbsp;IoT开发系列】Powershell命令行实用程序

原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Administrator [new password]​ (其中 [new password] 表示你选择的强密码). 创建本地用户帐户: 如果你想要授予其他人访问你的 Windows IoT Core 设备的权限,你可以通过在 net user [username] [password] /add​ 中键

windows下cmd命令行显示UTF8字符设置(CHCP命令)

在中文windows系统中,如果一个文本文件是utf-8编码的,那么在cmd.exe命令行窗口(所谓的dos窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集. 如果想正确显示UTF-8字符,可以按照以下步骤操作: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码页为65001 1 chcp 65001 执行该操作后,代码页就被变成UTF-8了.但是,在窗口中仍旧不能正确显示UTF-8字符

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.