能恢复,但仅限木马进程仍在运行且未被重写或退出时;一旦进程终止,/proc/PID/fd下deleted句柄立即失效,数据块可能迅速被覆盖,须立即用cp原子拷贝保留完整二进制结构。

能恢复,但仅限该木马进程仍在运行、且未被重写或退出时。一旦进程终止,/proc/PID/fd 下的 deleted 句柄立即失效,数据块可能很快被覆盖——这不是“找回来”,而是“抢在它消失前拷出来”。
确认木马进程是否还在运行并持有已删文件句柄
黑客常会 rm 掉落地的二进制(比如 /tmp/.a3x8k),再通过 chmod +x && ./ 启动后立刻 rm 自身,制造“无痕”假象。但只要进程没退出,它的 /proc/PID/fd/ 里仍映射着原始文件内容。
执行以下命令(需 root):
lsof | grep '(deleted)'
重点关注输出中的 NAME 列是否含可疑路径(如 /tmp/、/dev/shm/、/var/tmp/),同时看 COMMAND 是否异常(如 sh、bash、python 启动的无名进程)。若看到类似:
bash 12345 attacker 255r REG 8,1 1234567 987654 /tmp/.a3x8k (deleted)
说明 PID 12345 的进程仍在读取已 unlink 的木马文件,FD 是 255r。
从/proc/PID/fd/中直接拷出原始二进制内容
不要用 cat 或 strings 管道重定向——这会丢失 ELF 头、段对齐、权限位等关键结构,导致恢复出的文件无法执行或分析失败。
- 进入对应进程的 fd 目录:
cd /proc/12345/fd/ - 确认 fd 编号存在且是 regular file:
ls -la 255(应显示-> /tmp/.a3x8k (deleted)) - 用
cp原子拷贝(保留全部字节):cp 255 /malware_backup/.a3x8k.recovered - 验证文件头:
file /malware_backup/.a3x8k.recovered应返回ELF 64-bit LSB pie executable类似结果
注意:目标路径 /malware_backup/ 必须在独立分区或只读挂载点上,避免写入行为干扰原始内存状态。
为什么不能等进程退出后再恢复?
进程退出那一刻,内核会真正释放其所有文件描述符,并标记对应 inode 的 data block 为“可复用”。如果此时磁盘有写入(日志轮转、监控采集、定时任务),那些 block 很可能被新数据覆盖——extundelete 或 photorec 都救不回来。
更危险的是:某些高级木马会主动调用 unlinkat(AT_REMOVEDIR) + memfd_create(),把自身载入内存匿名文件,完全脱离磁盘路径。这种情况下,/proc/PID/fd/ 里看到的可能是 memfd:xxx (deleted),此时必须用 gcore 抓内存镜像,而不是依赖 fd 拷贝。
所以,发现可疑 (deleted) 条目后,第一反应不是分析,而是立刻 cp ——顺序错了,就真的没了。


















