IDA PRO笔记

【快捷键】

-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

相关推荐
Yang_jie_035 小时前
笔记:数据结构(顺序表)
数据结构·windows·笔记
Tom@敲代码7 小时前
js学习笔记-01
javascript·笔记·学习
巴巴媛6669 小时前
STM32学习笔记【32.BKP + RTC】
笔记·stm32·学习
能摆一天是一天9 小时前
Spring ai vectorstore 使用本地模型导致只能匹配可行度为1.0的内容的解决方法笔记
java·笔记·spring
进阶的DW10 小时前
Wiki + Graph + RAG 知识库建设笔记2
笔记
AOwhisky10 小时前
Linux(CentOS)系统管理入门笔记(第四期)——文件系统(下篇):文件与目录操作实战——cpmvmkdirrmln
linux·运维·笔记·centos·云计算·文件系统
bmy-happy10 小时前
网安专业课程笔记sale
笔记
浩瀚地学11 小时前
【Java基础复习】IO流(二)
java·开发语言·经验分享·笔记·学习
智者知已应修善业13 小时前
【利用proteus设计微型CPU,完成寻址相加数据的过程。】2025-2-26
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程