【快捷键】
-Tab/F5 :伪代码/反汇编切换
-Ctrl + F :表格窗口搜索功能
-N :重命名符号
字符串表(Strings window):
-Shift + F2 :打开字符串表
反汇编窗口(IDA View):
-空格 :切换图形/文本模式
-Ctrl + 鼠标滚轮 :调整反汇编图形模式大小
-G :地址跳转窗口
-X :查看交叉引用
-CTRL+ALT+X 全局查看交叉引用
-H :数据转换
-U/C :代码和数据相互转换
-M 修改常量为枚举值
伪代码窗口(Pseudocode):
-H :10进制和16进制转换
-R :切换对应的字符
Y键修改函数类型,包括函数返回值类型
【字符类型】
db :1字节 byte/char/uint8/int8
dw :2字节 word/short/uint16/int16
dd :4字节 dword/int/uint
dq :8字节 qword/int64
快捷键d转换字节类型
【增加类型】
在LocalTypes中添加类型
调试
F2加断点
F7单步进入函数
F8单步不进入函数
Ctrl+F7执行到当前函数返回后位置
F4执行到光标为止停下来
F9运行直到断点
SetIP(Ctrl+N)强制代码从光标位置处开始执行
动态调试时修改指定内存的值
idc.patch_dword(0x000000B039FAFDC0, 8)
--------------------------------------------------------------IDA Python----------------------------------------------------------------------
1.寄存器操作
idc.get_reg_value('rax')
idaapi.set_reg_val("rax",1234)
2.调试内存操作
idc.read_dbg_byte(addr)
idc.read_dbg_memory(addr,size)
idc.read_dbg_dword(addr)
idc.read_dbg_qword(addr)
idc.patch_dbg_byte(addr,val)
3.调试内存读写封装
def patch_dbg_mem(addr,data):
for i in range(len(data)):
idc.patch_dbg_byte(addr+i,datai)
def read_dbg_mem(addr,size):
dd=\[\]
for i in range(size):
dd.append(idc.read_dbg_byte(addr+i))
return bytes(dd)
4.本地内存操作(会修改idb数据库)
idc.get_qword(addr)
idc.patch_qword(addr,val)
idc.patch_dword(addr,val)
idc.patch_word(addr,val)
idc.patch_byte(addr,val)
idc.get_db_byte(addr)
idc.get_bytes(addr,size)
5.反汇编操作
GetDisasm(addr) #获取反汇编文本
idc.next_head(ea) #获取吓一跳指令地址
6.交叉引用分析
for ref in idautils.XrefsTo(ea):
print(hex(ref.frm))
7.杂项常用接口
idc.add_bpt(0x409437) 添加断点
idaapi.get_imagebase() 获取基地址
idc.create_insn(addr) #c,MakeCode
ida_funcs.add_func(addr) #p, create function
ida_bytes.create_strlit(addr) #创建字符串,A键效果
8.函数遍历
for func in idautils.Function():
print("px%x, %s" % (func, idc.get_func_name(func))
9.基本块遍历
fn = 目标函数地址
f_blocks = idaapi.FlowChar(idaapi.get_func(fn),flags=idaapi.FC_FREDS)
for block in f_blocks:
print hex(block.start_ea)
10.基本块的前驱
for pred in block.preds():
print hex(pred.start_ea)
11.基本块的后继
for succ in block.succs():
print hex(succ.start_ea)
12.指令遍历
for ins in idautils.FuncItems(0x401000):
print(hex(ins))
13.条件断点编写
0.编写断点函数脚本,本在IDA底部导入该函数
1.设置普通断点,在call rand之后设置(此时能获取rand的返回值)
2.右键->【Edit Bread ...】
3.点击Condition->...
4.输出bp(),并选择语言Python
def bp():
rax = idc.get_reg_value('rax')
return rax==16949
LazyIDA
HappyIDA
KeyPatch
BinDiff
Microcode展示插件https://github.com/gaasedelen/lucid