当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/581136.html

相关文章:

  • 用 Vue + DeepSeek 打造一个智能聊天网站(完整前后端项目开源)
  • 昌吉市建设局网站游戏工作室招聘信息
  • 基于MATLAB/Simulink的500kW三相光伏逆变器仿真
  • 大数据python招聘数据分析预测系统 招聘数据平台 +爬虫+可视化 +django框架+vue框架 大数据技术✅
  • 教育培训机构如何搭建自己的在线教育小程序?
  • Vue3+vant4+Webpack+yarn项目创建+vant4使用注意明细
  • 中山网站建设网站网站开发结构图
  • NumPy 简介与安装
  • AWS CloudFront 可观测最佳实践
  • 化学结构式乱码?InDraw与ChemDraw/Word/WPS兼容性完整指南
  • npm run 的工作原理和工作流程
  • 本地搭建Flinkcdc-mysql-kafka-flink-Doris实时数据集成
  • 极简风网站网站制作周期
  • 【Hadoop】hadoop3.3.1完全分布式配置
  • 如何安装 PDF Reader Pro for Mac v3.2.1.0?超简单DMG安装步骤(附安装包)
  • XML与CSS:构建现代网页的关键技术
  • 无锡品牌学会网站建设wordpress账号注册页面
  • 一次由 PageHelper 分页污染引发的 Bug 排查实录
  • 记录一个IDEA的神奇bug
  • Spark-3.5.7文档3 - Spark SQL、DataFrame 和 Dataset 指南
  • 无需 iTunes,将 iPhone 语音备忘录传输到电脑
  • 三个好思路:SQL并行化处理、混淆矩阵和特征交叉
  • 5 种无需 iTunes 将 iPad 照片传输到电脑的方法
  • 网站制作网站设计自助建站网站程序源码
  • Jenkins 定时触发(cron)使用说明
  • Kubernetes 架构
  • 自己做有趣的网站娱乐网站名字
  • 黑马JAVAWeb-09 文件上传-文件存储到服务器本地磁盘-文件存储在阿里云
  • 医疗小程序04添加就诊人
  • uboot下查看分区