IDA的基础和使用
IDA 的下载安装
另外,IDA Pro 7.7 需要
python3
环境,否则在 IDA Pro 7.7 的output
处会显示如下报错:
WARNING: Python 3 is not configured (Python3TargetDLL value is not set).
Please run idapyswitch to select a Python 3 install.
- 确保安装了
python3
环境后,打开 IDA 的安装路径,在根目录下有一个idapyswitch.exe
双击运行后,会有一个弹窗,让你选择 python 的版本,一般默认是 0
如果安装了多个 python,可以根据自己的需要选择具体的 python 版本
IDA 的常用快捷键
作用 | 快捷键 |
---|---|
查看字符串 | Shift + F12 |
反汇编 | F5 |
快速查看16进制数的ASCii码对应的字符 | r |
在反汇编后的界面中写下注释 | ; |
在反编译后伪代码的界面中写下注释 | / |
查看、隐藏变量的类型 | \ |
对着某个函数、变量按该快捷键,查看它的交叉引用 | x |
直接跳转到某个地址 | g |
更改变量的名称 | n |
拍摄IDA快照 | ctrl + shift + w |
嵌入脚本 | shift + F2 |
文本搜索字符串 | alt + t |
将数据转换为16 进制 | h |
获取数组的数据 | shift + e |
对数据db/dw/dd之间进行切换 | d |
转化为函数 | p |
将数据转化为代码 | c |
将数据转化为字符串 | a |
将代码转换为数据 | u |
IDA 命名前缀的含义
IDA 会自动生成假名字,用于表示子函数、程序地址和数据,根据不同的类型和值,假名字有不同的前缀
前缀 | 意义 |
---|---|
sub_ | 指令和子函数起点 |
locret_ | 返回指令 |
loc_ | 指令 |
off_ | 数据,包含偏移量 |
seg_ | 数据,包含段地址值 |
asc_ | 数据,ASCII字符串 |
byte_ | 数据,字节(或字节数组) |
word_ | 数据,16位数据(或字数组) |
dword_ | 数据,32位数据(或双字数组) |
qword_ | 数据,64位数据(或4字数组) |
flt_ | 浮点数据,32位(或浮点数组) |
dbl_ | 浮点数,64位(或双精度数组) |
tbyte_ | 浮点数,80位(或扩展精度浮点数) |
stru_ | 结构体(或结构体数组) |
algn_ | 对齐指示 |
unk_ | 未处理字节 |
IDA 远程调试
有时候程序是 Linux 平台的 elf 文件,可以使用 Windows 端的 IDA 对 Linux 端的程序远程调试
- 首先到 Windows 端 IDA 路径的
dbgsrv
目录下:
找到 linux_server
和 linux_server64
两个文件
linux_server
是连接 32 位程序的,linux_server64
连接 64 位程序
将这两个文件拷到 Linux 虚拟机中
- 给这两个文件增加执行权限,然后运行(需要调试多少位的程序就运行哪一个)
记住端口号:23946
保持运行,不要关
- 先在 Windows 端 IDA 中
快捷键 F2
下好断点
然后选择调试器
然后按 快捷键 F9
运行程序
会弹出一个输入框:
这里的 Hostname
是你的 Linux 虚拟机的 ip 地址
可以在 Linux 虚拟机终端输入 ifconfig
获取 ip 地址,我这里是 192.168.171.128
将其他参数填完整:
注意:这里所有的参数都是填 Linux 的
Application
和 Input file
填:调试程序在 Linux 的绝对路径Directory
填:调试程序所在目录的绝对路径
- 如果弹出
"Input file is missing: xxx"
的报错
IDA 会询问是否向 Linux 端拷贝这个调试程序
点 "OK"
就行,然后选择 Windows 本地的调试程序,IDA 会自动拷贝过去(一般是路径输错了,但是 IDA 拷贝过去也可以调试)
- 成功连接的界面如下:
同时,可以看到 Linux 端执行的程序:
IDA 中的汇编基础
字符串末尾用 ‘0’ 表示结束
- Format 的内容:”Welcome The System\nPlease Input Key:”
.rdata:00402100 57 65 6C 63 6F 6D 65 20 54 68+ Format db 'Welcome The System' , 0Ah ; DATA XREF: _main+28↑o
.rdata:00402100 65 20 53 79 73 74 65 6D 0A 50+ db 'Please Input Key:' , 0
- byte_402150 的内容:
2a49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6
byte_402151 的内容:a49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6
.rdata:00402150 ; char byte_402150[]
.rdata:00402150 32 byte_402150 db '2' ; DATA XREF: sub_401090:loc_4010CC↑r
.rdata:00402151 ; char byte_402151[]
.rdata:00402151 61 byte_402151 db 'a' ; DATA XREF: sub_401090:loc_4010E9↑r
.rdata:00402152 34 39 66 36 39 63 33 38 33 39+a49f69c38395cde db '49f69c38395cde96d6de96d6f4e025484954d6195448def6e2dad67786e21d5adae6' , 0
用 dup(?)
开辟未初始化的空间
str2 db 68h dup(?)
是指开辟一个 68h 长度的空间,且不进行初始化
评论