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 或专业工具
  • 应急响应:使用综合脚本快速保全证据

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

相关推荐
Yana.nice17 分钟前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月22 分钟前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
小白跃升坊1 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey1 小时前
【Linux】线程同步与互斥
linux·笔记
杨江1 小时前
seafile docker安装说明
运维
舰长1151 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀1 小时前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng1 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.1 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
树℡独1 小时前
ns-3仿真之应用层(三)
运维·服务器·ns3