前缀 | 说明 |
---|---|
sub_ | 指令和子函数起点 |
locret_ | 返回指令 |
loc_ | 指令 |
off_ | 数据,包含偏移量 |
seg_ | 数据,包含段地址值 |
asc_ | 数据,ASCII字符串 |
byte_ | 数据,字节(或字节数组) |
word_ | 数据,16位数据(或字数组) |
dword_ | 数据,32位数据(或双字数组) |
qword_ | 数据,64位数据(或4字数组) |
_OWORD | (8个字=16个字节=128位) |
flt_ | 浮点数据,32位(或浮点数组) |
dbl_ | 浮点数,64位(或双精度数组) |
tbyte_ | 浮点数,80位(或扩展精度浮点数) |
stru_ | 结构体(或结构体数组) |
algn_ | 对齐指示 |
unk_ | 未处理字 |
XMMWORD | 128位 |
IDA的使用教程
转载自先知社区
原文链接:IDA Pro7.0使用技巧总结
俗话说,工欲善其事,必先利其器,在二进制安全的学习中,使用工具尤为重要,而IDA又是玩二进制的神器,以前在使用IDA的时候,只是用几个比较常用的功能,对于IDA的其他功能没有去研究,于是本着学习的精神,参考着《IDA pro权威指南》(第二版),写下这篇文章,记录自己的学习心得,下面的记录都是在Windows平台下的IDA pro7.0进行的
一些二进制工具
在《IDA pro权威指南》的开篇一两章中,先是介绍了几款常用于二进制研究的工具,我这里简单的记了几个,介绍一波:
C++filt:
可以用于显示出c++中复杂的重载后的函数名称
PE tools:
是一组用于分析Windows系统中正在运行的进程和可执行文件的工具
string:
可以用于直接搜索出elf文件中的所有字符串
参数-a 表示搜索整个文件,参数-t 可以显示出每一个字符串的偏移,参数-e 可以用于搜索更多的字符编码的字符串,如Unicode编码
strip:
可用于elf去符号,去符号后仍然保持正常功能但增加了逆向的难度,出题恶人必备
开发了IDA的天才是Ilfak,他的个人博客有很多IDA的教程
https://www.hexblog.com/
IDA目录结构
在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容
cfg:包含各种配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用户界面配置文件idatui.cfg,
idc:包含IDA内置脚本语言IDC所需要的核心文件
ids:包含一些符号文件
loaders:包含用于识别和解析PE或者ELF
plugins:附加的插件模块
procs:包含处理器模块
常用快捷键
IDA中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上你只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个常用的:
a:将数据转换为字符串
f5:一键反汇编
esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
ctrl+w:保存ida数据库
ctrl+s:选择某个数据段,直接进行跳转
ctrl+鼠标滚轮:能够调节流程视图的大小
x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
g:直接跳转到某个地址
n:更改变量的名称
y:更改变量的类型,ida函数参数不对也可以用这个.
/ :在反编译后伪代码的界面中写下注释
\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
;:在反汇编后的界面中写下注释
ctrl+shift+w:拍摄IDA快照
u:undefine,取消定义函数、代码、数据的定义
常用设置
拍摄快照
由于IDA不提供撤销的功能,如果你不小心按到某个键,导致ida数据库发生了改变,就得重新来过,所以要记得在经常操作的时候,加上快照:file–>take database snapshot
加完快照后,会生成一个新的ida数据库文件,本质上是有点像另存的操作
快捷键:ctrl+shift+w
菜单栏常用设置
view–>open subviews: 可以恢复你无意中关闭的数据显示窗口
windows–>reset desktop: 可以恢复初始ida布局
option–>font: 可以改变字体的相关属性
在流程视图中添加地址偏移
IDA中的流程视图可以说是非常的好用,简单明了地能看出程序的执行流程,尤其是在看if分支代码和循环代码的时候,能够非常直观
但是,我们还可以改得更加好用,在这个视图中添加地址偏移的话,我们取地址就非常方便,不再需要按空格切换视图去找,在菜单栏中设置:option–>general
将该选项打钩后就可以看到效果了:
自动添加反汇编注释
同样是在菜单栏中设置:option–>general
这个功能对于萌新来说非常友好,在刚刚初学汇编的时候, 难免遇到几个不常用的蛇皮汇编指令,就得自己一个个去查,很麻烦,开启了自动注释的功能后,IDA就可以直接告诉你汇编指令的意思
效果如下:
其他目前暂时用不到,具体请看原作者文章吧。=-=
[IDA Python 常用函数 | 4nsw3r's Blog](https://4nsw3r.top/2022/02/11/IDA Python 常用函数/)
IDA Python 常用函数
官方文档
https://www.hex-rays.com/products/ida/support/idapython_docs/
读取
读取汇编信息
获取指定地址助记符
print_insn_mnem(ea)
获取上一条/下一条指令的地址
prev_head(ea)`
`next_head(ea)
超出当前函数边界后会跳至下一个函数
获取指定地址的第 n 个操作数
print_operand(ea,n)
如对于 0x40100 vpxor ymm3,ymm4,ymm5
python
>>>print_operand(0x40100,0)
ymm3
>>>print_operand(0x40100,1)
y4
获取指定地址的第 n 个立即数
get_printable_immvals(ea, n)
获取指定地址处的反汇编
GetDisasm(ea)
读取函数信息
获取一个地址范围内所有函数的地址
Functions(start_ea,end_ea)
返回一个 Python ·迭代器·对象
获取函数边界
get_func_attr(0x140008070,FUNCATTR_START)
get_func_attr(0x140008070,FUNCATTR_END)
获取当前地址的下一个/上一个函数
get_next_func(ea)
get_prev_func(ea)
读取数据
获取指定地址的字符串
get_strlit_contents(ea)
返回 Python bytes 类型
获取指定地址指定数量的bytes
get_bytes(ea,num)
返回 Python bytes 类型
获取指定地址的数据
python
ida_bytes.get_qword()
ida_bytes.get_dword()
ida_bytes.get_word()
ida_bytes.get_byte()
ida_bytes.get_64bit()
ida_bytes.get_32bit()
ida_bytes.get_16bit()
读取调试时寄存器的值
get_reg_val()
写入
修改数据
python
ida_bytes.patch_byte(ea,number)
ida_bytes.patch_word(ea,number)
ida_bytes.patch_dword(ea,number)
常用脚本片段
读取某地址范围内所有汇编助记符
python
ea=startAddress
while True:if ea>endAddress:print(opcode)ea=next_head(ea)
列出某地址范围内的所有函数地址
python
for i in Functions(startAddress,endAddress):print(i)
使用脚本控制调试,dump 数据
python
from idaapi import *while True:# print(get_reg_val('eax'))# print(GetDisasm(GetEventEa()))# print(get_dword(address))continue_process()wait_for_next_event(WFNE_SUSP,-1)