Linux 抓取 RAM Dump 完整指南
🔍 RAM Dump 基础概念
什么是 RAM Dump
- 内存转储:将系统内存内容保存到文件
- 用于:系统崩溃分析、内存泄漏调试、安全取证
- 类型:完整内存转储、内核内存转储、小内存转储
🚀 立即抓取方法
1. 使用 sysrq 触发崩溃转储
# 立即触发内核崩溃转储
echo c > /proc/sysrq-trigger# 或者使用快捷键
Alt + SysRq + C # 大部分Linux系统
2. 使用 gcore 抓取进程内存
# 安装 gcore
sudo apt-get install gdb # Debian/Ubuntu
sudo yum install gdb # CentOS/RHEL# 抓取特定进程的内存转储
pgrep firefox # 获取进程PID
sudo gcore -o /tmp/firefox_dump PID# 抓取多个进程
for pid in $(pgrep chrome); dosudo gcore -o /tmp/chrome_${pid} $pid
done
📊 系统级内存转储配置
配置 kdump 服务
# 1. 安装 kdump 工具
sudo apt-get install kdump-tools # Ubuntu/Debian
sudo yum install kexec-tools # CentOS/RHEL# 2. 检查当前配置
cat /proc/cmdline | grep crashkernel# 3. 配置崩溃内核内存大小
# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=256M"# 4. 更新 grub 并重启
sudo update-grub
sudo reboot# 5. 启用 kdump 服务
sudo systemctl enable kdump
sudo systemctl start kdump
手动触发 kdump 测试
# 测试 kdump 配置
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger# 检查转储文件
ls -la /var/crash/ # 默认转储目录
🔧 高级内存抓取技术
使用 dd 抓取物理内存
#!/bin/bash
# ram_dump_dd.sh# 检查内存设备
sudo fdisk -l | grep -i "memory"# 直接读取 /dev/mem (需要内核支持)
sudo dd if=/dev/mem of=/tmp/ram_dump.bin bs=1M count=1024# 更安全的方式 - 通过 /proc/kcore
sudo gdb -q --batch -ex 'dump memory /tmp/ram_dump.bin 0x0 0x10000000' /proc/kcore
使用 LiME 内核模块
# LiME (Linux Memory Extractor) - 最专业的工具
git clone https://github.com/504ensicsLabs/LiME.git
cd LiMe/src# 编译内核模块
make
sudo insmod lime.ko "path=/tmp/memory_dump.lime format=lime"# 卸载模块后转储完成
sudo rmmod lime
📋 完整内存取证脚本
综合内存抓取脚本
#!/bin/bash
# comprehensive_ram_dump.shset -eDUMP_DIR="/tmp/ram_dump_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$DUMP_DIR"
cd "$DUMP_DIR"echo "🧠 开始综合内存取证..."
echo "转储目录: $DUMP_DIR"# 1. 系统信息
echo "📊 收集系统信息..."
uname -a > system_info.txt
cat /proc/version >> system_info.txt
cat /proc/cmdline >> system_info.txt
free -h > memory_info.txt# 2. 进程信息
echo "📋 收集进程信息..."
ps aux > processes.txt
lsof > open_files.txt# 3. 网络连接
echo "🌐 收集网络信息..."
netstat -tulpn > network_connections.txt
ss -tulpn >> network_connections.txt# 4. 内核信息
echo "⚙️ 收集内核信息..."
dmesg > dmesg.log
cat /proc/modules > loaded_modules.txt# 5. 内存映射
echo "🗺️ 收集内存映射..."
for pid in $(pgrep -f "."); domkdir -p "process_$pid"cat /proc/$pid/maps > "process_$pid/memory_maps.txt" 2>/dev/null || truecat /proc/$pid/smaps > "process_$pid/detailed_maps.txt" 2>/dev/null || true
done# 6. 使用 gcore 抓取关键进程
echo "💾 抓取进程内存..."
important_processes=("sshd" "bash" "nginx" "apache" "mysql")
for proc in "${important_processes[@]}"; dofor pid in $(pgrep "$proc" 2>/dev/null); doecho "抓取进程 $proc (PID: $pid)"sudo gcore -o "process_${pid}_${proc}" $pid 2>/dev/null || truedone
done# 7. 创建归档
echo "📦 打包转储文件..."
tar -czf "../ram_dump_$(date +%Y%m%d_%H%M%S).tar.gz" .echo "✅ 内存转储完成: $DUMP_DIR"
ls -la "$DUMP_DIR"
🔬 专业级内存分析准备
使用 Volatility 框架准备
#!/bin/bash
# volatility_prep.sh# 安装 Volatility
sudo apt-get install -y python3-pip
pip3 install volatility3# 或者使用系统包
sudo apt-get install -y volatility # 可能版本较旧# 准备分析环境
echo "准备 Volatility 配置文件..."
cat > volatilityrc << EOF
[PLUGINS]
LOCATION=/usr/lib/python3/dist-packages/volatility/plugins[OUTPUT]
DIR=/tmp/volatility_output
EOF
创建可分析的内存转储
#!/bin/bash
# create_analyzeable_dump.sh# 方法1: 使用 LiME 创建标准格式
sudo insmod lime.ko "path=/tmp/memory.lime format=lime"# 方法2: 使用 rekall 获取器
git clone https://github.com/google/rekall.git
cd rekall/rekall/tools/linux
sudo ./get_physical_memory.sh# 方法3: 使用 AVML (Azure VM 内存获取器)
wget https://github.com/microsoft/avml/releases/latest/download/avml
chmod +x avml
sudo ./avml /tmp/memory.dmp
⚡ 快速响应脚本
应急响应内存抓取
#!/bin/bash
# emergency_ram_capture.shecho "🚨 应急响应 - 内存证据保全"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
EVIDENCE_DIR="/evidence/memory_$TIMESTAMP"
mkdir -p "$EVIDENCE_DIR"# 快速系统状态
echo "📸 快速系统快照..."
{dateuname -awholastnetstat -tulpnps aux
} > "$EVIDENCE_DIR/quick_snapshot.txt"# 关键进程内存
echo "💾 抓取关键进程..."
CRITICAL_PIDS=$(pgrep -f "(sshd|bash|sudo|su|passwd)")
for pid in $CRITICAL_PIDS; dosudo gcore -o "$EVIDENCE_DIR/pid_${pid}" $pid 2>/dev/null && \echo "已抓取 PID $pid" || echo "抓取 PID $pid 失败"
done# 网络连接内存
echo "🌐 网络连接取证..."
sudo cat /proc/net/tcp > "$EVIDENCE_DIR/tcp_connections.txt"
sudo cat /proc/net/udp > "$EVIDENCE_DIR/udp_connections.txt"# 创建哈希校验
echo "🔒 创建证据完整性校验..."
find "$EVIDENCE_DIR" -type f -exec sha256sum {} \; > "$EVIDENCE_DIR/checksums.sha256"echo "✅ 应急响应完成: $EVIDENCE_DIR"
🛡️ 安全注意事项
内存转储的安全处理
#!/bin/bash
# secure_ram_dump.sh# 加密存储
echo "🔐 安全内存转储流程..."# 创建加密容器
sudo apt-get install cryptsetup
sudo cryptsetup luksFormat /tmp/ram_dump_container
sudo cryptsetup open /tmp/ram_dump_container ram_dump_crypt# 在加密容器中操作
sudo mkfs.ext4 /dev/mapper/ram_dump_crypt
sudo mount /dev/mapper/ram_dump_crypt /mnt/secure# 执行内存转储
cd /mnt/secure
# ... 转储操作 ...# 完成后卸载和关闭
sudo umount /mnt/secure
sudo cryptsetup close ram_dump_crypt# 安全删除原文件
sudo shred -u /tmp/ram_dump_container
📊 自动监控和触发
内存监控自动转储
#!/bin/bash
# memory_monitor_dump.shTHRESHOLD=90 # 内存使用率阈值%
CHECK_INTERVAL=60 # 检查间隔(秒)while true; doMEM_USAGE=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; thenecho "⚠️ 内存使用率 ${MEM_USAGE}% 超过阈值,触发转储..."TIMESTAMP=$(date +%Y%m%d_%H%M%S)# 触发转储{echo "高内存使用率转储: $TIMESTAMP"echo "当前使用率: $MEM_USAGE%"ps aux --sort=-%mem | head -20} > /tmp/high_memory_$TIMESTAMP.log# 抓取内存占用前10的进程ps aux --sort=-%mem | head -11 | awk 'NR>1{print $2}' | while read pid; dosudo gcore -o "/tmp/pid_${pid}_high_mem" $pid 2>/dev/null || truedonefisleep $CHECK_INTERVAL
done
🔍 调试专用转储
内核调试内存转储
#!/bin/bash
# kernel_debug_dump.shecho "🐛 内核调试内存转储..."# 启用调试选项
echo 8 > /proc/sys/kernel/printk
echo 1 > /proc/sys/kernel/sysrq# 收集调试信息
dmesg -w > /tmp/dmesg_stream.log &
DMESG_PID=$!# 触发转储
echo "触发内核转储..."
echo c > /proc/sysrq-trigger# 等待并清理
sleep 5
kill $DMESG_PIDecho "✅ 内核调试转储完成"
📋 转储验证和分析准备
验证转储文件完整性
#!/bin/bash
# verify_dump.shDUMP_FILE="$1"echo "🔍 验证内存转储文件: $DUMP_FILE"# 检查文件大小
FILE_SIZE=$(stat -c%s "$DUMP_FILE")
echo "文件大小: $FILE_SIZE 字节"# 检查系统内存大小
MEM_SIZE=$(grep MemTotal /proc/meminfo | awk '{print $2 * 1024}')
echo "系统内存: $MEM_SIZE 字节"# 基本验证
if file "$DUMP_FILE" | grep -q "data"; thenecho "✅ 文件格式基本正常"
elseecho "❌ 文件格式可能有问题"
fi# 字符串提取测试
strings "$DUMP_FILE" | head -20 > /tmp/dump_strings_sample.txt
echo "示例字符串提取完成"# 准备分析环境
echo "准备分析工具..."
sudo apt-get install -y file strings binutils
总结:根据需求选择合适的方法:
- 快速调试:使用
gcore抓取特定进程 - 系统崩溃分析:配置和使用
kdump - 安全取证:使用
LiME或专业工具 - 应急响应:使用综合脚本快速保全证据
记得在生产环境中谨慎操作,内存转储可能影响系统性能!
