type
status
date
slug
summary
tags
category
icon
password
静态分析基础
IDA插件安装方式
对应IDA版本,python版本的.py插件放到IDA的Plugins目录中
IDAswitch.exe
"D:\Tools\IDA_Pro_7.7\IDA_Pro_7.7\idapyswitch.exe"
扫出IDA中的python,自由选择python版本,最佳3.8.X
二进制基础知识
位、字节、字、比特的关系
位等同于比特,是最小的单位
字节(byte):1 byte == 8 bit
字(word):1 word == 2 byte == 16 bit
不同类型的整数
- byte/char/uint8/int8 → db 1个字节
- word/short/uint16/int16 → dw 2个字节
- dword/int/uint → dd 4个字节(32位指针)
- qword/int64 → dq 8个字节(64位指针)
大部分情况下,整数以小端序存储在内存
例:0xA1B2C3D4, 内存中为 D4 C3 B2 A1
IDA窗口
IDA反汇编窗口(IDA-view)
- 主要显示汇编代码、地址、控制流图
- 文本模式和图形模式(按空格切换)
- 文本模式:(汇编代码)指令地址、指令间线性关系、机器码
- 图形模式:ctrl+滚轮缩放,方便观察控制流
IDA伪代码窗口
反汇编 → 伪代码:Tab键/F5
伪代码 → 反汇编:Tab键
光标处按Tab可以快速切换到对应地方
IDA的字符串表(strings)
shift + F12切换
[view] → [Open subviews] → [strings]
列举出IDA识别出的字符串
ctrl + F 快速筛选(表格窗口都可)
双击某字符串会跳转至该字符串对应的数据内存区域
IDA数据窗口(Hex view)
[view] → [Open subviews] → [Hex dump]
以hex数据记录静态数据内存
F2键进入编辑模式,再按F2退出(不推荐操作,其它窗口是下断点)
G键弹出地址跳转窗口(反汇编、伪代码同)
静态分析技巧
交叉引用
在符号名上按X键,查找当前引用X的代码或数据
代码定位
- 字符串定位法
运行,看是否有特征字符串,用交叉引用去溯源找到关键代码
重命名
对已经分析的符号命名,单击选中符号,按下N键,输入自定义名称
指定代码高亮
显示类型转换
伪代码窗口,[右键] → hide/show casts
按" \ "键快速切换
显示变量数据类型转换
数据十进制、hex、字符转换
伪代码窗口,点击待转化数据,按H 十进制和hex互转
按R,数据转换为对应ascii码的字符
不同类型数据转换
IDA view的本文模式下,在数据段某个数据处
可以按D转换(从db → dw → dd → dq)
lazyIDA提取数据
注意多选一项
数据与代码的转换
IDA view文本模式下:
某地址按U,取消IDA对当前地址的解释
某地址按C,将地址标记为代码并反汇编
创建的代码函数头处按P,创建函数
IDA调用图
查看函数调用关系图
反汇编窗口,函数符号单击选中,右键 → "Xref Graph to"
常数搜索
[Search] → [Immediate Value] (勾选"Find all")
- 用于搜索对结构体便宜的引用代码
- 搜索ollvm真实块代码
指令文本搜索
[Search] → [Text] (勾选"Find all")
- 用于搜索特殊指令
字节序列搜索
搜索满足匹配HEX串的序列
[Search] → [Sequence of bytes] / ALT + B
- 特征码查找
- 花指令查找
- 代码定位
IDA patch
- 直接修改数据:数据窗口F2
- lazyIDA修改:文本模式 右键 → [Paste Data]
- 修改汇编代码:Keypacth
保存patch:[Edit] → [Patch program] → [Apply Patches]
查看patch:[Edit] → [Patch program] → [Patched bytes] / Ctrl + alt + P
去简单控制流混淆/基本块混乱
IDA view图形模式下,若有控制流混淆,基本块混乱
右键 → [Layout graph]
IDA的符号恢复
适用于已知目标程序使用的库
需要插件BinDiff
操作:比较两份代码,查找相似函数,并将匹配上的相似函数命名为对应的符号
[Edit] → [BinDiff] / shitf + D
动态分析技巧
windows本地调试和linux远程调试
调试基本操作
- 单步执行:
F7:执行一条指令(反汇编窗口) / 执行一行语句(伪代码),不进入函数调用
F8:执行一条指令(反汇编窗口) / 执行一行语句(伪代码),进入函数调用
Ctrl + F7:执行到当前函数的返回后位置(步入函数后快速步出)
F4:执行到光标位置停下来(跳出循环等)
F9:运行
Ctrl + N:强制代码从光标位置处开始执行
寄存器窗口
"General registers"
当前进程所有寄存器的情况
可以按右侧蓝色箭头快速跳转(IDA_view和数据窗口都可以)
Moudules窗口
展示当前调试进程所调用的所有动态链接库
双击某动态链接库,可以进入当前动态链接库的导出的函数列表窗口
Stack view窗口
栈窗口,在General registers窗口找到RSP寄存器,点击右侧箭头跳转至栈顶
Hex view窗口
数据窗口跟随寄存器自动切换地址:右键 → [syscnc with] → 选择跟随寄存器
'G'键打开跳转地址窗口
动态链接库调试
调试动态链接库的宿主程序即可,IDA自动识别动态链接库
IDA会根据动态链库加载的基地址重定位(rebase)
- 启动调试模式
[Debugger] → [Process Option] → Application 修改为宿主程序路径
- 附加调试模式
无需修改,直接附加(Android调试Native库)
调试后,IDA会询问 xxx.dll / xxx.so与当前分析的模块文件名一致,是否真的一致,选"yes"即可
Android Native库调试
- Android Native调试 = Linux调试 + 动态链接库调试
- 需要上传dbgsrv / android_server 到Android设备
- Android Native调试一般以附加模式进行
- adb push命令快速上传文件
- adb shell命令可以进入Android 的shell
硬件断点
由硬件提供的断电机制,同时需要内核支持
硬件断点不会修改内存数据(隐蔽性高,不会破坏壳数据、自解密代码、代码校验等)
支持对数据 / 代码设置断点,一般有数量限制
硬件断点设置方法:
先设置普通断点,编辑断点,选中[hardware],并配置
- Read:断点地址被读取时命中
- Write:断点地址被写入时命中
- Execute:断点地址被执行时命中
- Size:地址的范围大小(指令写1即可)
内存断点
下断点后,设置断点,开启[hardware],在选择读写即可
- 设置方法:在IDA-view窗口按G,定位到目标内存,再按下F2键
- 默认情况下,内存断点,IDA使用硬件断点实现,若要修改则在[edit Break Pointer]中手动修改
- 内存断点也可以设置IDApython脚本
API断点
跳转到API的方法:(设置方法同普通断点)
- 方法1:IDA-View窗口 → G键 → 输入导出符号名
- 方法2:[Debugger] → [Debugger Window] → [Module List] → 双击API所在模块 → 双击对应函数
调试内存相关
- 提取
右键 → [Lazy Dumper] → 填入地址和大小
- 修改
修改内存起始地址(IDA-view) → 右键 → [Paste Date]
Trace分析
指令级 Trace,开启后IDA记录每一条指令的执行情况
- 打开菜单项[Debugger] → [Tracing] → [Tracing Options]配置Trace选项
- 在准备开始Trace的指令位置设置断点,并使该断点命中
- 开启Trace:[debugger] → [Tracing] → [Instruction Tracing]
- 开启后,单步执行一条指令,发现已经执行的指令变色表示开启Trace成功
- 按下F9继续运行,直到下一个断点手动停止Trace或直到程序结束
IDApython
使用方式总结
第一种,直接按Shift+F2快捷键调出界面,也可以直接在菜单中选择命令脚本(File -> Script command);
第二种,写一个脚本文件直接进行引用(File -> Script file);
第三种,直接在IDA底部写命令。
IDAPython由三个独立模块组成:
idc: idc函数的兼容模块,包含IDA内置函数声明和内部定义
idautils: 实用函数模块
idaapi: 用于访问更多底层数据的模块
访问原数据
数据打补丁
- 用于对ea地址开始X字节的修改
函数获取
- 作者:Sh4d0w
- 链接:https://sh4d0w.life//article/e027496f-bf94-41bf-b5b6-a209a01c9b87
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。