#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: kill_ghost_malware.sh
# 功能描述: 自动扫描关联的异常进程组,通过 SIGSTOP 信号批量冻结并清理 (需人工确认)
# 使用方式: 在宿主机以 root 权限执行: ./kill_ghost_malware.sh <恶意进程名或关键字>
# ==============================================================================
set -o pipefail
TARGET_NAME=$1
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
if [ -z "$TARGET_NAME" ]; then
echo -e "${RED}用法: $0 <恶意进程名或特征关键字>${PLAIN}"
exit 1
fi
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} 守护型恶意进程组 (Fork & Monitor) 冻结清理工具 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 提取所有关联的 PID (排除当前脚本自身与 grep 进程)
echo -e "\n${YELLOW}[1/3] 正在扫描与 '${TARGET_NAME}' 关联的进程列表...${PLAIN}"
# 修复了这里的管道符乱码
PIDS=$(ps -ef | grep "$TARGET_NAME" | grep -v "grep" | grep -v "$0" | awk '{print $2}')
if [ -z "$PIDS" ]; then
echo -e " -> ${GREEN}[OK] 未检测到包含关键字 '${TARGET_NAME}' 的运行中进程。${PLAIN}"
exit 0
fi
# 格式化输出进程树与对应的物理文件路径
echo -e " -> ${RED}[ALERT] 检测到以下关联进程:${PLAIN}"
for pid in $PIDS; do
if [ -d "/proc/$pid" ]; then
PPID_VAL=$(awk '/^PPid:/ {print $2}' "/proc/$pid/status" 2>/dev/null)
CMD_LINE=$(tr '\0' ' ' < "/proc/$pid/cmdline" 2>/dev/null)
EXE_PATH=$(readlink "/proc/$pid/exe" 2>/dev/null)
# 修复了这里的输出字符串管道符乱码
echo -e " PID: ${RED}${pid}${PLAIN} | PPID: ${YELLOW}${PPID_VAL}${PLAIN} | 命令行: ${CMD_LINE}"
echo -e " -> 映射物理路径: ${YELLOW}${EXE_PATH}${PLAIN}"
fi
done
# 2. 冻结确认阶段
echo -ne "\n -> ${YELLOW}是否立即发送 SIGSTOP 信号批量冻结上述进程?(阻断自愈逻辑) [y/N]: ${PLAIN}"
read -r CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
echo -e " -> ${YELLOW}[INFO] 已取消操作。${PLAIN}"
exit 0
fi
# 3. 执行 SIGSTOP 批量冻结
echo -e "\n${YELLOW}[2/3] 正在执行批量挂起冻结 (kill -STOP)...${PLAIN}"
# 将多行 PID 转换为单行参数一次性传入 kill,减少时间差
PID_LIST=$(echo "$PIDS" | tr '\n' ' ')
kill -STOP $PID_LIST 2>/dev/null
echo -e " -> 已发送 SIGSTOP 信号至 PID 列表: ${PID_LIST}"
echo -e " -> ${GREEN}[SUCCESS] 关联进程组已全部进入暂停状态 (T),丧失 CPU 调度与文件恢复能力。${PLAIN}"
# 4. 执行最终终止清理
echo -ne "\n -> ${YELLOW}进程已安全冻结。是否立即执行 kill -9 强制终止这些进程?[y/N]: ${PLAIN}"
read -r CONFIRM_KILL
if [[ "$CONFIRM_KILL" =~ ^[Yy]$ ]]; then
echo -e "\n${YELLOW}[3/3] 正在执行批量强制终止 (kill -9)...${PLAIN}"
kill -9 $PID_LIST 2>/dev/null
echo -e " -> 已强制终止 PID 列表: ${PID_LIST}"
echo -e " -> ${GREEN}[SUCCESS] 恶意进程组已彻底清理。请立即根据上方打印的“映射物理路径”执行 rm -f 删除磁盘源文件。${PLAIN}"
else
echo -e " -> ${YELLOW}[INFO] 未执行终止操作。目标进程当前仍保持挂起 (STOP) 状态,方便进行内存取证。${PLAIN}"
fi
echo -e "\n${BLUE}================================================================${PLAIN}"