首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >046_逆向工程实战进阶:GDB动态调试技术全面详解与二进制程序分析实战指南

046_逆向工程实战进阶:GDB动态调试技术全面详解与二进制程序分析实战指南

作者头像
安全风信子
发布2025-11-18 15:22:08
发布2025-11-18 15:22:08
990
举报
文章被收录于专栏:AI SPPECHAI SPPECH

引言

在逆向工程领域,静态分析工具如IDA Pro或Ghidra提供了二进制程序的静态视图,但要深入理解程序的运行时行为,动态调试是必不可少的技能。GDB(GNU Debugger)作为Linux/Unix系统上最强大的命令行调试器,为逆向工程师提供了丰富的功能,可以实时观察程序执行流程、修改内存值、跟踪函数调用等。本文将系统地介绍GDB的核心功能、高级技巧以及在逆向工程中的实际应用,帮助读者掌握动态分析的精髓。

目录

代码语言:javascript
复制
目录
├── 第一章:GDB调试器基础概述
├── 第二章:GDB基本命令详解
├── 第三章:断点设置与管理高级技巧
├── 第四章:程序状态检查与内存操作
├── 第五章:多线程与多进程调试
├── 第六章:逆向工程中的GDB高级应用
├── 第七章:GDB脚本自动化
└── 第八章:实战案例分析

第一章:GDB调试器基础概述

1.1 GDB简介与工作原理

GDB是GNU项目开发的功能强大的调试器,支持多种编程语言(如C、C++、Assembly等)和多种目标平台。它的核心功能包括:

  • 程序控制:启动、暂停、继续、单步执行程序
  • 断点管理:设置条件断点、硬件断点、临时断点等
  • 内存检查与修改:查看和修改寄存器、内存内容
  • 堆栈跟踪:分析函数调用栈和变量作用域
  • 符号解析:加载和使用调试符号信息

GDB的工作原理主要基于以下机制:

代码语言:javascript
复制
GDB工作流程:
1. 启动目标程序(或附加到已运行程序)
2. 插入断点(通过修改内存为断点指令)
3. 程序执行直到断点触发
4. 保存程序状态(寄存器、内存等)
5. 允许用户检查和修改状态
6. 根据用户命令继续执行程序
1.2 GDB安装与配置

在大多数Linux发行版上,GDB通常预装或可以通过包管理器轻松安装:

代码语言:javascript
复制
# Debian/Ubuntu
apt-get install gdb

# RedHat/CentOS
yum install gdb

# Fedora
dnf install gdb

为了提高GDB的使用效率,推荐进行以下配置:

  1. 创建.gdbinit配置文件:
代码语言:javascript
复制
# 创建GDB配置文件
cat > ~/.gdbinit << 'EOF'
# 设置显示格式
set print pretty on
set print array on
set print elements 0

# 设置反汇编格式
set disassembly-flavor intel

# 彩色输出
syntax highlight
EOF
  1. 安装GDB插件:
代码语言:javascript
复制
# 安装GEF (GDB Enhanced Features)
git clone https://github.com/hugsy/gef.git ~/.gef
echo "source ~/.gef/gef.py" >> ~/.gdbinit

# 或安装PEDA (Python Exploit Development Assistance for GDB)
git clone https://github.com/longld/peda.git ~/.peda
echo "source ~/.peda/peda.py" >> ~/.gdbinit

第二章:GDB基本命令详解

2.1 启动与退出命令

命令

描述

示例

start

启动程序并停在main函数入口

start

run

运行程序

run arg1 arg2

attach

附加到运行中的进程

attach 1234

detach

从进程中分离

detach

quit

退出GDB

quit

kill

终止被调试程序

kill

基本工作流程:

代码语言:javascript
复制
GDB调试基本流程:
编译程序 → 启动GDB → 设置断点 → 运行程序 → 检查状态 → 单步执行 → 分析结果
2.2 程序执行控制命令

命令

描述

示例

continue

继续执行直到下一个断点

continue

step

单步执行,进入函数调用

step

next

单步执行,跳过函数调用

next

stepi

执行一条汇编指令(进入)

stepi

nexti

执行一条汇编指令(跳过)

nexti

finish

执行完当前函数并返回

finish

until

执行到指定行或退出循环

until 100

执行控制流程:

代码语言:javascript
复制
程序执行控制流:
start → 设置断点 → run → 断点触发 → step/next → continue → finish
2.3 查看程序信息命令

命令

描述

示例

list

显示源代码

list 1,20

info

显示各种信息

info registers

backtrace

显示函数调用栈

backtrace

frame

切换栈帧

frame 1

disassemble

反汇编函数或地址

disassemble main

print

打印变量或表达式值

print x

x

检查内存内容

x/10x $esp

第三章:断点设置与管理高级技巧

3.1 断点类型概述

GDB支持多种断点类型,适应不同的调试场景:

代码语言:javascript
复制
断点类型层次:
普通断点 → 条件断点 → 硬件断点 → 临时断点 → 观察点
3.2 设置普通断点

命令

描述

示例

break

设置断点

break mainbreak file.c:100break *0x8048450

tbreak

设置临时断点(触发一次后自动删除)

tbreak function

rbreak

设置正则表达式匹配的所有函数断点

rbreak ^foo_

3.3 设置条件断点

条件断点只在满足特定条件时才触发,大大提高调试效率:

代码语言:javascript
复制
# 在第100行设置断点,当x等于10时触发
break file.c:100 if x == 10

# 在函数foo中设置断点,当y大于100时触发
break foo if y > 100

# 基于寄存器值设置条件断点
break *0x8048450 if $eax == 0x1234

条件断点的评估机制:

代码语言:javascript
复制
条件断点评估流程:
断点命中 → 评估条件表达式 → 条件为真 → 暂停执行
                         ↓ 条件为假
                         继续执行
3.4 设置观察点

观察点用于监控内存或变量的变化:

命令

描述

示例

watch

当表达式被修改时暂停

watch x

rwatch

当表达式被读取时暂停

rwatch x

awatch

当表达式被读取或修改时暂停

awatch x

观察点使用注意事项:

  1. 观察点会增加程序运行开销
  2. 对于频繁变化的变量可能导致调试器频繁暂停
  3. 硬件观察点数量有限(通常为4-8个)
3.5 断点管理命令

命令

描述

示例

info breakpoints

显示所有断点信息

info breakpoints

enable

启用断点

enable 1

disable

禁用断点

disable 1

delete

删除断点

delete 1

clear

删除特定位置的断点

clear main

第四章:程序状态检查与内存操作

4.1 寄存器操作

查看和修改寄存器是动态分析的重要手段:

代码语言:javascript
复制
# 显示所有寄存器内容
info registers

# 显示特定寄存器
print $eax
print $pc

# 修改寄存器值
set $eax = 0x1234
set $eip = 0x8048500

x86/x86-64主要寄存器:

寄存器

用途

32位名称

64位名称

通用寄存器

数据操作

eax, ebx, ecx, edx

rax, rbx, rcx, rdx

索引寄存器

数组索引

esi, edi

rsi, rdi

栈指针

栈管理

esp

rsp

基址指针

帧管理

ebp

rbp

指令指针

执行位置

eip

rip

标志寄存器

状态标志

eflags

rflags

段寄存器

内存分段

cs, ds, ss, es

cs, ds, ss, es

4.2 内存检查命令

内存检查是逆向工程中最常用的功能之一:

代码语言:javascript
复制
# 检查内存内容,格式为:x/Nfu 地址
# N: 数量, f: 格式, u: 单位

# 以十六进制查看10个字节
x/10x 0x8048400

# 以字符形式查看20个字节
x/20c 0x8048400

# 以32位整数查看5个值
x/5dw 0x8048400

# 查看栈顶内容
x/20x $esp

# 查看当前指令位置
x/i $eip

内存格式选项:

格式

描述

x

十六进制

d

十进制

u

无符号十进制

o

八进制

t

二进制

a

地址

c

字符

f

浮点

i

反汇编

内存单位选项:

单位

大小

b

字节

h

半字(2字节)

w

字(4字节)

g

双字(8字节)

4.3 内存修改技术

在逆向工程中,修改内存值可以绕过保护、测试假设或模拟特定条件:

代码语言:javascript
复制
# 设置内存值
set {char}0x8048400 = 0x41
set {int}0x8048400 = 1234
set {char[10]}0x8048400 = "hello"

# 使用填充模式修改内存
fill 0x8048400 0x8048500 0x90

# 修改栈上的值
set {int}($esp+4) = 0x1234

# 修改堆内存
set {char*}heap_ptr = "modified"

内存修改的典型应用场景:

代码语言:javascript
复制
内存修改应用场景:
1. 绕过密码验证 - 修改比较结果
2. 解锁功能限制 - 修改标志位
3. 修复程序漏洞 - 临时修补代码
4. 模拟边界条件 - 触发特定代码路径
5. 测试输入验证 - 注入恶意数据
4.4 变量检查与操作

命令

描述

示例

print

打印变量值

print x

set

设置变量值

set x = 10

display

持续显示表达式

display x

undisplay

停止显示表达式

undisplay 1

examine

检查变量内存

x/x &x

检查复杂数据结构:

代码语言:javascript
复制
# 打印结构体
print struct_var

# 打印结构体成员
print struct_var.member

# 打印数组元素
print array[0]

# 打印指针指向的内容
print *ptr
print *(ptr+1)

# 打印字符串
print string_var
print (char*)buffer

第五章:多线程与多进程调试

5.1 多线程调试基础

现代程序常采用多线程设计,GDB提供了强大的线程调试功能:

代码语言:javascript
复制
# 显示所有线程
info threads

# 切换到指定线程
thread 2

# 在线程中设置断点
break function thread 2

# 仅在当前线程中单步执行
step thread

线程调试工作流程:

代码语言:javascript
复制
多线程调试流程:
启动程序 → 查看线程 → 切换线程 → 设置线程断点 → 检查线程状态 → 继续执行
5.2 线程同步问题分析

调试线程同步问题(如死锁、竞态条件)是逆向工程的重要技能:

代码语言:javascript
复制
# 检查线程锁信息
info threads
info thread 1

# 检查线程堆栈
thread apply all bt

# 在所有线程中设置断点
break function thread apply all

# 监控信号处理
info signals
5.3 多进程调试技术

GDB也支持调试多进程程序:

代码语言:javascript
复制
# 允许调试子进程
set follow-fork-mode child

# 同时调试父子进程
set detach-on-fork off

# 查看进程列表
info inferiors

# 切换进程
inferior 2

# 附加到子进程
attach process_id

进程调试设置选项:

设置

描述

命令

follow-fork-mode

选择调试父进程或子进程

set follow-fork-mode [parent/child]

detach-on-fork

分叉时是否分离进程

set detach-on-fork [on/off]

schedule-multiple

是否同时运行所有进程

set schedule-multiple [on/off]

第六章:逆向工程中的GDB高级应用

6.1 符号表管理

符号表对于逆向分析至关重要:

代码语言:javascript
复制
# 加载符号表
symbol-file /path/to/symbols

# 添加符号文件
add-symbol-file /path/to/library 0x8048000

# 解析内存中的符号
info symbol 0x8048450

# 查找函数地址
print &function_name

# 检查符号类型
whatis variable_name
6.2 动态库调试

调试依赖外部库的程序需要特殊处理:

代码语言:javascript
复制
# 设置LD_PRELOAD环境变量
set environment LD_PRELOAD=/path/to/library.so

# 显示加载的共享库
info shared

# 在共享库中设置断点
break library_func

# 延迟断点(等待库加载)
break -r "^library_func$"]
6.3 信号处理与调试

程序的信号处理逻辑常与安全机制相关:

代码语言:javascript
复制
# 显示所有信号处理
info signals

# 设置信号处理行为
handle SIGSEGV stop print pass

# 在信号处理函数中设置断点
break signal_handler

# 发送信号给程序
signal SIGINT
6.4 反汇编与代码分析

深入分析程序的汇编代码:

代码语言:javascript
复制
# 设置反汇编格式
set disassembly-flavor intel

# 反汇编函数
disassemble main

# 反汇编指定地址范围
disassemble 0x8048400,0x8048500

# 反汇编当前指令及其后续指令
x/10i $eip

# 显示混合源码和汇编
disassemble /m main
6.5 动态代码插桩

在运行时修改程序行为进行分析:

代码语言:javascript
复制
# 使用gdb内置函数
call printf("Value: %d\n", variable)

# 临时修改指令为nop
set {char}0x8048450 = 0x90

# 插入条件检查
break *0x8048450 commands
  if $eax == 0
    continue
  end
end

第七章:GDB脚本自动化

7.1 GDB脚本基础

创建GDB脚本可以自动化重复的调试任务:

代码语言:javascript
复制
# 创建调试脚本 debug.gdb
break main
commands
  print "Program started!"
  continue
end

break *0x8048450
commands
  print "Reached critical point!"
  print $eax
  continue
end

run

运行脚本:

代码语言:javascript
复制
gdb -x debug.gdb ./program
7.2 Python脚本集成

GDB支持Python脚本,提供更强大的自动化能力:

代码语言:javascript
复制
# gdb_script.py
import gdb

# 定义自定义命令
class FindFunction(gdb.Command):
    def __init__(self):
        super(FindFunction, self).__init__("find_func", gdb.COMMAND_USER)
    
    def invoke(self, arg, from_tty):
        try:
            # 查找包含特定字符串的函数
            functions = gdb.execute("info functions", to_string=True)
            for line in functions.split('\n'):
                if arg in line:
                    print(line)
        except Exception as e:
            print(f"Error: {e}")

# 注册命令
FindFunction()

使用Python脚本:

代码语言:javascript
复制
gdb -x gdb_script.py ./program
(gdb) find_func encryption
7.3 自动化分析脚本示例
代码语言:javascript
复制
# auto_analyze.py
import gdb

class AutoAnalyze(gdb.Command):
    def __init__(self):
        super(AutoAnalyze, self).__init__("auto_analyze", gdb.COMMAND_USER)
    
    def invoke(self, arg, from_tty):
        # 1. 显示程序信息
        print("=== Program Information ===")
        gdb.execute("info files")
        
        # 2. 查找可能的加密函数
        print("\n=== Potential Crypto Functions ===")
        crypto_funcs = ["encrypt", "decrypt", "hash", "key", "xor"]
        for func in crypto_funcs:
            try:
                output = gdb.execute(f"info functions {func}", to_string=True)
                if output.strip():
                    print(f"\nFunctions containing '{func}':")
                    print(output)
            except:
                pass
        
        # 3. 检查符号表中的可疑函数
        print("\n=== Suspicious Functions ===")
        try:
            symbols = gdb.execute("info functions", to_string=True)
            for line in symbols.split('\n'):
                if any(s in line.lower() for s in ["secret", "hidden", "check"]):
                    print(line)
        except:
            pass

# 注册命令
AutoAnalyze()
7.4 GDB插件介绍
7.4.1 GEF (GDB Enhanced Features)

GEF是一个现代化的GDB增强插件,提供了丰富的可视化和分析功能:

代码语言:javascript
复制
# 安装GEF
git clone https://github.com/hugsy/gef.git ~/.gef
echo "source ~/.gef/gef.py" >> ~/.gdbinit

主要功能:

  • 彩色界面和语法高亮
  • 内存和寄存器可视化
  • 堆和栈分析工具
  • 内置反汇编器增强
  • 实时代码分析
7.4.2 PEDA (Python Exploit Development Assistance for GDB)

PEDA专为二进制漏洞分析和利用开发设计:

代码语言:javascript
复制
# 安装PEDA
git clone https://github.com/longld/peda.git ~/.peda
echo "source ~/.peda/peda.py" >> ~/.gdbinit

主要功能:

  • 自动ROP链生成
  • 内存和寄存器格式化显示
  • 漏洞利用辅助工具
  • 快速断点和内存查看命令
7.4.3 pwndbg

pwndbg整合了GDB的强大功能与pwntools的便捷性:

代码语言:javascript
复制
# 安装pwndbg
git clone https://github.com/pwndbg/pwndbg.git ~/.pwndbg
cd ~/.pwndbg
./setup.sh

主要功能:

  • 自动解析函数调用约定
  • 智能内存布局显示
  • 与pwntools无缝集成
  • 自动化漏洞利用分析

第八章:实战案例分析

8.1 密码验证程序破解
8.1.1 程序分析

首先,让我们看一个简单的密码验证程序:

代码语言:javascript
复制
// password_check.c
#include <stdio.h>
#include <string.h>

int check_password(char *input) {
    char password[] = "secret123";  // 硬编码密码
    return strcmp(input, password) == 0;
}

int main() {
    char input[50];
    printf("Enter password: ");
    gets(input);  // 注意:存在缓冲区溢出漏洞
    
    if (check_password(input)) {
        printf("Access granted!\n");
        // 这里可能有敏感操作
    } else {
        printf("Access denied!\n");
    }
    
    return 0;
}

编译程序:

代码语言:javascript
复制
gcc -g -o password_check password_check.c
8.1.2 动态分析过程

使用GDB进行动态分析:

代码语言:javascript
复制
# 启动GDB
gdb ./password_check

# 设置断点
(gdb) break check_password
(gdb) break main

# 运行程序
(gdb) run

# 在main函数中检查输入缓冲区
(gdb) break *main+20
(gdb) run
(gdb) print &input

# 单步执行到strcmp函数调用
(gdb) break *check_password+30
(gdb) continue
(gdb) disassemble

# 查看password变量的值
(gdb) x/s password

# 动态修改password变量绕过验证
(gdb) set {char[10]}password = "anything"
(gdb) continue
8.2 混淆代码分析
8.2.1 混淆程序示例
代码语言:javascript
复制
// obfuscated.c
#include <stdio.h>

int main() {
    int x = 123;
    int y = 456;
    
    // 混淆的控制流
    if ((x ^ 0x12) + (y >> 2) == 0x13A) {
        // 执行一些操作
        printf("Success!\n");
    } else {
        printf("Failed!\n");
    }
    
    return 0;
}

编译并分析:

代码语言:javascript
复制
gcc -g -o obfuscated obfuscated.c
gdb ./obfuscated

# 设置断点并分析
(gdb) break main
(gdb) run
(gdb) print (x ^ 0x12) + (y >> 2)
(gdb) print 0x13A

# 跟踪表达式计算过程
(gdb) break *main+40
(gdb) continue
(gdb) print $eax  # 检查计算结果
8.3 网络协议逆向
8.3.1 网络程序分析
代码语言:javascript
复制
// network_app.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 模拟网络协议处理函数
void process_packet(char *data, int len) {
    // 简单的协议验证
    if (len > 4 && data[0] == 0xAA && data[1] == 0xBB) {
        // 提取命令类型
        int cmd = data[2];
        // 提取数据长度
        int data_len = data[3];
        
        printf("Valid packet received!\n");
        printf("Command: 0x%02X\n", cmd);
        printf("Data length: %d\n", data_len);
        
        // 处理不同命令
        switch (cmd) {
            case 0x01:
                printf("Executing command 0x01...\n");
                break;
            case 0x02:
                printf("Executing command 0x02...\n");
                break;
            default:
                printf("Unknown command!\n");
        }
    } else {
        printf("Invalid packet!\n");
    }
}

int main() {
    // 模拟接收到的网络数据包
    char packet[] = {0xAA, 0xBB, 0x01, 0x05, 'H', 'e', 'l', 'l', 'o'};
    process_packet(packet, sizeof(packet));
    
    return 0;
}

编译并使用GDB分析协议格式:

代码语言:javascript
复制
gcc -g -o network_app network_app.c
gdb ./network_app

# 设置断点分析协议处理
(gdb) break process_packet
(gdb) run
(gdb) print len
(gdb) x/10x data
(gdb) print data[0] == 0xAA && data[1] == 0xBB

# 动态修改数据包内容进行测试
(gdb) set data[2] = 0x02
(gdb) continue

# 构造新的数据包进行测试
(gdb) set $new_packet = malloc(10)
(gdb) set {$new_packet+0} = 0xAA
(gdb) set {$new_packet+1} = 0xBB
(gdb) set {$new_packet+2} = 0x03
(gdb) call process_packet($new_packet, 10)
8.4 恶意代码分析
8.4.1 简单恶意代码示例
代码语言:javascript
复制
// malware_sample.c (仅用于教学目的)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 模拟恶意行为的函数
void malicious_function() {
    // 模拟加密或混淆的操作
    char key[] = "XORKEY";
    char data[] = "This is a secret message";
    int i;
    
    // XOR加密
    for (i = 0; i < strlen(data); i++) {
        data[i] ^= key[i % strlen(key)];
    }
    
    // 这里可能有其他恶意行为
    printf("Malicious operation performed!\n");
}

// 伪装成正常函数
int legitimate_function(int x) {
    // 调用恶意函数但隐藏调用关系
    if (x == 42) {
        malicious_function();
    }
    return x * 2;
}

int main() {
    printf("Legitimate program starting...\n");
    
    // 调用看似正常的函数
    legitimate_function(42);
    
    printf("Program completed.\n");
    return 0;
}

使用GDB进行动态分析:

代码语言:javascript
复制
gcc -g -o malware_sample malware_sample.c
gdb ./malware_sample

# 分析调用关系
(gdb) break main
(gdb) break legitimate_function
(gdb) break malicious_function
(gdb) run
(gdb) backtrace

# 分析加密过程
(gdb) break *malicious_function+30
(gdb) continue
(gdb) print key
(gdb) print data
(gdb) continue
(gdb) print data

# 跟踪函数调用参数
(gdb) catch throw
(gdb) rwatch data[0]
(gdb) continue

结论

GDB作为逆向工程中最强大的动态分析工具之一,掌握其核心功能和高级技巧对于深入理解二进制程序的行为至关重要。本文详细介绍了GDB的基础命令、断点管理、内存操作、多线程调试、脚本自动化以及实际应用案例,为逆向工程师提供了全面的技术指导。

通过本文的学习,读者应该能够:

  1. 熟练使用GDB进行程序动态分析
  2. 设置各种类型的断点进行精确调试
  3. 检查和修改内存以绕过保护机制
  4. 使用脚本自动化重复的分析任务
  5. 应用GDB解决实际逆向工程问题

在实际的逆向工程工作中,GDB通常与静态分析工具(如IDA Pro或Ghidra)结合使用,静态分析提供程序的整体结构视图,而GDB则用于验证假设和深入理解运行时行为。掌握这两种分析方法的结合使用,将大大提高逆向工程的效率和准确性。

最后,需要强调的是,逆向工程技术应当用于合法目的,如软件安全评估、漏洞修复、兼容性研究等。在进行任何逆向工程活动前,请确保你有合法的授权。

参考资料

  1. GDB官方文档:https://sourceware.org/gdb/onlinedocs/gdb/
  2. GEF官方GitHub:https://github.com/hugsy/gef
  3. PEDA官方GitHub:https://github.com/longld/peda
  4. pwndbg官方GitHub:https://github.com/pwndbg/pwndbg
  5. 《黑客攻防技术宝典:反汇编与逆向分析实战》
  6. 《Practical Binary Analysis: Build Your Own Linux Tools for Binary Instrumentation, Analysis, and Disassembly》
  7. 《The Art of Debugging with GDB, DDD, and Eclipse》
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 目录
  • 第一章:GDB调试器基础概述
    • 1.1 GDB简介与工作原理
    • 1.2 GDB安装与配置
  • 第二章:GDB基本命令详解
    • 2.1 启动与退出命令
    • 2.2 程序执行控制命令
    • 2.3 查看程序信息命令
  • 第三章:断点设置与管理高级技巧
    • 3.1 断点类型概述
    • 3.2 设置普通断点
    • 3.3 设置条件断点
    • 3.4 设置观察点
    • 3.5 断点管理命令
  • 第四章:程序状态检查与内存操作
    • 4.1 寄存器操作
    • 4.2 内存检查命令
    • 4.3 内存修改技术
    • 4.4 变量检查与操作
  • 第五章:多线程与多进程调试
    • 5.1 多线程调试基础
    • 5.2 线程同步问题分析
    • 5.3 多进程调试技术
  • 第六章:逆向工程中的GDB高级应用
    • 6.1 符号表管理
    • 6.2 动态库调试
    • 6.3 信号处理与调试
    • 6.4 反汇编与代码分析
    • 6.5 动态代码插桩
  • 第七章:GDB脚本自动化
    • 7.1 GDB脚本基础
    • 7.2 Python脚本集成
    • 7.3 自动化分析脚本示例
    • 7.4 GDB插件介绍
      • 7.4.1 GEF (GDB Enhanced Features)
      • 7.4.2 PEDA (Python Exploit Development Assistance for GDB)
      • 7.4.3 pwndbg
  • 第八章:实战案例分析
    • 8.1 密码验证程序破解
      • 8.1.1 程序分析
      • 8.1.2 动态分析过程
    • 8.2 混淆代码分析
      • 8.2.1 混淆程序示例
    • 8.3 网络协议逆向
      • 8.3.1 网络程序分析
    • 8.4 恶意代码分析
      • 8.4.1 简单恶意代码示例
  • 结论
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档