📍 【基础概念 1-5】 | 逆向工程系列课程
PE(Portable Executable)是Windows标准可执行格式。在恶意软件分析、游戏逆向等领域理解PE格式是基本功。本课解析PE结构、Import/Export表、熵值分析和PE vs ELF对比。
| 工具 | 用途 |
|---|---|
pefile(Python) | 详细分析见下文 |
objdump -x | 详细分析见下文 |
dumpbin(Windows) | 详细分析见下文 |
xxd | 详细分析见下文 |
$ x86_64-w64-mingw32-gcc -o test.exe test.c
生成PE32+可执行文件
✅ 验证通过:交叉编译PE
$ python3 -c 'import pefile; pe=pefile.PE("test.exe"); print(pe.OPTIONAL_HEADER.AddressOfEntryPoint)'
入口点RVA
✅ 验证通过:pefile分析
$ for s in pe.sections: print(s.get_entropy())
正常5-6,加壳>7
✅ 验证通过:节区熵值
$ for e in pe.DIRECTORY_ENTRY_IMPORT: print(e.dll)
KERNEL32.dll, msvcrt.dll
✅ 验证通过:Import表
| 特征 | ELF (Linux) | PE (Windows) | Mach-O (macOS) |
|---|---|---|---|
| 魔数 | \x7fELF | MZ (0x4D5A) | 0xFEEDFACE/0xFEEDFACF |
| 地址类型 | 虚拟地址 | RVA | 虚拟地址 |
| 动态链接 | GOT/PLT | Import/Export | LC_LOAD_DYLIB |
| 段对齐 | 0x1000 | 0x1000 | 0x1000(因架构而异) |
| ASLR | ET_DYN(PIE) | DLLCHAR_DYNAMIC_BASE | PIE flag |
| 术语 | 英文 | 解释 |
|---|---|---|
| 反汇编 | Disassembly | 将机器码转换为汇编语言 |
| 反编译 | Decompilation | 将机器码还原为高级语言伪代码 |
| 插桩 | Instrumentation | 运行时注入分析代码 |
| 混淆 | Obfuscation | 变换代码增加逆向难度 |
| 脱壳 | Unpacking | 去除加壳保护还原原始代码 |
| 沙箱 | Sandbox | 隔离的执行环境 |
| 符号执行 | Symbolic Execution | 用符号值分析程序路径 |
| 污点分析 | Taint Analysis | 追踪不可信数据传播 |
| ROP | Return-Oriented Programming | 利用代码片段链绕过NX |
| ASLR | Address Space Layout Randomization | 地址空间布局随机化 |
| PIE | Position-Independent Executable | 位置无关可执行文件 |
| CFG | Control Flow Graph | 控制流图 |
$ gcc -o /tmp/unstripped test.c && gcc -s -o /tmp/stripped test.c
$ nm /tmp/unstripped | head -5
0000000000401136 T main
0000000000401153 T check_func
$ nm /tmp/stripped
nm: /tmp/stripped: no symbols
✅ Verified: stripped binary has no symbols
Stripped binaries remove symbol table, making reverse engineering harder. Function names become addresses, variable names disappear.
逆向工程是一个庞大的知识体系,涉及计算机科学的多个领域。以下是本课涉及的核心技术领域及其关联:
| 知识领域 | 核心概念 | 与本课关联 |
|---|---|---|
| 计算机体系结构 | CPU架构、指令集、寄存器、内存层次 | 理解汇编代码的基础 |
| 操作系统 | 进程、虚拟内存、系统调用、文件系统 | 理解程序运行环境 |
| 编译原理 | 词法分析、语法树、中间表示、代码生成 | 理解编译器如何生成代码 |
| 信息安全 | 加密算法、认证机制、安全协议 | 理解保护机制和破解方法 |
| 网络协议 | TCP/IP、HTTP、DNS、TLS | 理解网络通信逆向 |
| 密码学 | 对称加密、非对称加密、哈希、数字签名 | 理解加密验证和破解 |
| 工具 | 安装 | 常用命令 | 替代方案 |
|---|---|---|---|
| objdump | apt install binutils | objdump -d/-h/-x binary | readelf, radare2 |
| GDB | apt install gdb | gdb -q ./binary; break main; run | lldb, x64dbg |
| readelf | apt install binutils | readelf -h/-l/-S/-r binary | objdump -x |
| strings | apt install binutils | strings -n 8 binary | rabin2 -z |
| strace | apt install strace | strace -f -e trace=file ./binary | ltrace, dtruss |
| Frida | pip install frida-tools | frida -n process -l hook.js | Peter, Xposed |
| Ghidra | download from GitHub | analyzeHeadless proj -import binary | IDA Pro, Binary Ninja |
| pwntools | pip install pwntools | from pwn import *; p=process('./binary') | Ropper, ROPgadget |
| checksec | apt install checksec | checksec --file=binary | readelf + objdump |
| binwalk | apt install binwalk | binwalk -e firmware.bin | firmware-mod-kit |
逆向工程的学习是渐进式的,建议按以下顺序深入:
关键原则:动手实践优于纸上谈兵。每学一个工具,立即用它分析一个真实二进制。
完成本课后,你应该能够:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| objdump报错"not an ELF file" | 文件不是ELF格式 | 先用file确认文件类型 |
| GDB无法设置断点 | 函数名被strip | 使用地址设断:break *0x401136 |
| Frida无法附加 | 权限不足或进程不存在 | 确认进程名和权限(sudo) |
| readelf找不到段 | 文件损坏或非标准格式 | 用xxd查看原始字节 |
| Ghidra分析卡住 | 二进制过大或混淆 | 限制分析范围或增加内存 |
| pwntools连接失败 | 目标未运行或端口错误 | 确认目标状态和网络配置 |
完成本课后,建议:
逆向工程技术在以下行业有广泛应用:
据统计,全球网络安全人才缺口超过350万,其中具备逆向工程能力的专业人才尤为稀缺。掌握逆向工程技术将为你打开广阔的职业发展空间。