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)

  • 主要显示汇编代码、地址、控制流图
  • 文本模式和图形模式(按空格切换)
notion image
notion image
  • 文本模式:(汇编代码)指令地址、指令间线性关系、机器码
  • 图形模式: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键,输入自定义名称

指定代码高亮

notion image

显示类型转换

伪代码窗口,[右键] → hide/show casts 按" \ "键快速切换
显示变量数据类型转换

数据十进制、hex、字符转换

伪代码窗口,点击待转化数据,按H 十进制和hex互转 按R,数据转换为对应ascii码的字符

不同类型数据转换

IDA view的本文模式下,在数据段某个数据处 可以按D转换(从db → dw → dd → dq)

lazyIDA提取数据

注意多选一项
notion image

数据与代码的转换

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

  1. 直接修改数据:数据窗口F2
  1. lazyIDA修改:文本模式 右键 → [Paste Data]
  1. 修改汇编代码: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字节的修改

函数获取

z3学习NSSCTF
Loading...
Sh4d0w
Sh4d0w
漫长学习路ing
最新发布
360加固复现学习
2025-6-15
java反射机制
2025-6-14
classLoader机制
2025-6-14
dex文件结构
2025-6-14
APP启动流程
2025-6-14
JNI学习
2025-6-14
公告
Welcome to Sh4dw’s blog!
敬请指导,Q 467194403