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); do
    sudo 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.sh

set -e

DUMP_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 "."); do
    mkdir -p "process_$pid"
    cat /proc/$pid/maps > "process_$pid/memory_maps.txt" 2>/dev/null || true
    cat /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[@]}"; do
    for pid in $(pgrep "$proc" 2>/dev/null); do
        echo "抓取进程 $proc (PID: $pid)"
        sudo gcore -o "process_${pid}_${proc}" $pid 2>/dev/null || true
    done
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.sh

echo "🚨 应急响应 - 内存证据保全"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
EVIDENCE_DIR="/evidence/memory_$TIMESTAMP"
mkdir -p "$EVIDENCE_DIR"

# 快速系统状态
echo "📸 快速系统快照..."
{
    date
    uname -a
    who
    last
    netstat -tulpn
    ps aux
} > "$EVIDENCE_DIR/quick_snapshot.txt"

# 关键进程内存
echo "💾 抓取关键进程..."
CRITICAL_PIDS=$(pgrep -f "(sshd|bash|sudo|su|passwd)")
for pid in $CRITICAL_PIDS; do
    sudo 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.sh

THRESHOLD=90  # 内存使用率阈值%
CHECK_INTERVAL=60  # 检查间隔(秒)

while true; do
    MEM_USAGE=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
    
    if [ "$MEM_USAGE" -gt "$THRESHOLD" ]; then
        echo "⚠️ 内存使用率 ${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; do
            sudo gcore -o "/tmp/pid_${pid}_high_mem" $pid 2>/dev/null || true
        done
    fi
    
    sleep $CHECK_INTERVAL
done

🔍 调试专用转储

内核调试内存转储

复制代码
#!/bin/bash
# kernel_debug_dump.sh

echo "🐛 内核调试内存转储..."

# 启用调试选项
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_PID

echo "✅ 内核调试转储完成"

📋 转储验证和分析准备

验证转储文件完整性

复制代码
#!/bin/bash
# verify_dump.sh

DUMP_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"; then
    echo "✅ 文件格式基本正常"
else
    echo "❌ 文件格式可能有问题"
fi

# 字符串提取测试
strings "$DUMP_FILE" | head -20 > /tmp/dump_strings_sample.txt
echo "示例字符串提取完成"

# 准备分析环境
echo "准备分析工具..."
sudo apt-get install -y file strings binutils

总结:根据需求选择合适的方法:

  • 快速调试 :使用 gcore 抓取特定进程
  • 系统崩溃分析 :配置和使用 kdump
  • 安全取证 :使用 LiME 或专业工具
  • 应急响应:使用综合脚本快速保全证据

记得在生产环境中谨慎操作,内存转储可能影响系统性能!

相关推荐
YJlio2 小时前
PsSuspend(7.23):无损挂起与恢复指定进程——精准“冻住”故障现场
笔记·学习·安全
会飞的小蛮猪2 小时前
SkyWalking运维之路(Java探针接入)
java·运维·经验分享·容器·skywalking
不懂音乐的欣赏者2 小时前
Windows 下 ROS/ROS2 开发环境最优解:WSL 比直接安装、虚拟机、双系统更优雅!
linux·windows·ubuntu·ros·wsl·ros2·双系统
一袋米扛几楼983 小时前
【软件安全】C语言特性 (C Language Characteristics)
java·c语言·安全
天一生水water3 小时前
docker-compose安装
运维·docker·容器
Archy_Wang_13 小时前
基于BaGet 构建NuGet私有库并实现类库打包到NuGet私有库
运维·jenkins
小狗爱吃黄桃罐头4 小时前
正点原子【第四期】Linux之驱动开发学习笔记-10.1 Linux 内核定时器实验
linux·驱动开发·学习
初听于你4 小时前
运维高级故障排除与恢复-SysRq
运维·服务器·安全
RPA机器人就用八爪鱼4 小时前
RPA自动化程序:企业数字化转型的智能引擎
运维·自动化·rpa