Python技术迷

手写一个 Python "病毒"

先说清楚,我这里讲的是“原理与防御”和“仿真”,不是实战恶意代码。想理解为什么某些程序会像病毒一样传播,或者如何通过检测和防护来阻止它们,这些知识是非常有用的 —— 对运维、蓝队、开发者都很重要。下面就从概念出发,慢慢带你看模型和一个安全的 Python 仿真。

什么是“病毒式程序”(概念) 首先别把“病毒”这个词和电影里的形象混在一起。工程上我们把能自我传播或利用平台/用户行为扩散的恶意程序统称为恶意软件(malware)。关键点在两个能力:感染(或传播)和执行某个“载荷”(payload)。理解传播逻辑比学会写代码重要得多,因为你能设计防御。

传播的常见路径(直观感受) 想像一个办公室里有很多电脑,传播路径就像人传染感冒:邮件附件、U盘、网络服务漏洞、弱密码、依赖链(第三方包被污染)等。要防住病毒,就要从这些“门”堵起。

传播模型(一个直观的数学模型) 常用的有 SIR(易感 Susceptible / 感染 Infected / 康复 Removed)模型,来源于流行病学。把节点(主机/用户)分成三类,定义传播概率、恢复概率,就能模拟“感染曲线”。学习这些能让你在设计容量、告警和缓解策略时更有底。

检测与防御(开发者/运维角度) 别只想着杀毒软件,防御是系统工程。简单实用的点有:

  • 最小权限与沙箱:尽量让服务和进程权限最小化,减少潜在破坏面;
  • 输入/输出白名单:不要随便执行外部脚本或加载不可信模块;
  • 依赖治理:对第三方包做签名校验(hash、供应链监控);
  • 日志与行为监控:异常网络连接、进程注入、可疑文件写入或大量IO都是告警信号;
  • 自动化取证:保存样本拷贝到隔离环境做静态/动态分析,而不是在生产上直接执行;
  • 周期性漏洞扫描与补丁管理;
  • 用户教育:防钓鱼、勿运行未知附件。

静态与动态分析(蓝队常用方法) 静态:计算二进制/脚本的哈希、比对已知签名、用 YARA 写模式匹配规则,查看代码中危险 API(比如调用系统命令)。 动态:在隔离沙箱(VM/容器)里运行,记录系统调用、网络、文件变化、注册表(在 Windows 环境)等。工具参考:Cuckoo Sandbox(这里不展开安装细节)。

现在,来个安全的动手实验:用 Python 模拟病毒传播(纯内存仿真)。 要点:这个示例只是模型仿真,不会写磁盘、不开端口、不发送邮件、不修改系统。它帮助我们观察不同参数(传播概率、恢复概率、节点拓扑)下的感染曲线。你可以在本机的普通 Python 环境里运行,完全安全。

# virus_simulation.py  —— 安全的传播仿真(纯内存,无危险)
# 运行: python virus_simulation.py
import random
import math
import time
from collections import deque

classNode:
def__init__(self, id):
        self.id = id
        self.state = "S"# S = susceptible, I = infected, R = removed(recovered/immune)
definfect(self):
if self.state == "S":
            self.state = "I"
defrecover(self):
if self.state == "I":
            self.state = "R"

defmake_random_graph(n, avg_degree):
# 返回邻接表形式的无向图
# 使用简单的随机连接,保持平均度数
    adj = {i: set() for i in range(n)}
    p = avg_degree / max(1, n-1)
for i in range(n):
for j in range(i+1, n):
if random.random() < p:
                adj[i].add(j)
                adj[j].add(i)
return adj

defsimulate(n_nodes=200, avg_deg=6, p_transmit=0.15, p_recover=0.04, steps=200, seed_count=3):
    random.seed(42)
    nodes = [Node(i) for i in range(n_nodes)]
    graph = make_random_graph(n_nodes, avg_deg)

# 初始感染
    initial = random.sample(range(n_nodes), seed_count)
for i in initial:
        nodes[i].infect()

    history = []
for t in range(steps):
        counts = {"S":0, "I":0, "R":0}
for node in nodes:
            counts[node.state] += 1
        history.append(counts)
# 打印一行简短信息
        print(f"t={t:03d}  S={counts['S']:3d}  I={counts['I']:3d}  R={counts['R']:3d}")
if counts["I"] == 0:
break

# 传播阶段:所有感染节点尝试感染邻居(基于快照)
        to_infect = set()
for node in nodes:
if node.state == "I":
for nb in graph[node.id]:
if nodes[nb].state == "S":
if random.random() < p_transmit:
                            to_infect.add(nb)
# 恢复阶段
        to_recover = []
for node in nodes:
if node.state == "I":
if random.random() < p_recover:
                    to_recover.append(node.id)
# 应用状态变化
for i in to_infect:
            nodes[i].infect()
for i in to_recover:
            nodes[i].recover()

return history

if __name__ == "__main__":
# 可尝试修改参数观察感染曲线变化
    hist = simulate(n_nodes=500, avg_deg=8, p_transmit=0.08, p_recover=0.03, steps=500, seed_count=5)
# 简单绘图(文本)
    print("\n最终统计(最近一步):", hist[-1])

运行说明(只读、安全)

  • 该脚本在内存里构建一个随机图并在上面做 SIR 模拟;
  • 改变 p_transmit(传播概率)或 p_recover(恢复概率)能显著改变感染峰值与持续时间;
  • 你可以把结果导出为 CSV,用 matplotlib(本地)画曲线做更直观展示;但我这里不做网络/文件写入示例以保证安全。

举个分析角度的延伸(对防护有帮助)

  • 在真实世界里,检测“群体级”异常比单机告警更有效:比如短时间内多个主机出现同一外部域名访问或同样的文件哈希上传;
  • 构建“行为基线”并检测偏离:如正常情况下,某服务每天发起外部连接的数很少,突然激增就要告警;
  • 利用沙箱做动态行为抽取(文件创建、注册表、网络),把这些特征送入 ML 模型做分类;
  • 对依赖包做哈希校验与镜像签名等供应链治理策略。

简单的 YARA 示例(用于静态匹配可疑文本特征)——示例仅演示格式,不要直接用于恶意检测策略里作为唯一依据:

rule suspicious_script_example {
    meta:
        author = "example"
        description = "示例 YARA 规则 - 匹配包含 exec 与 wget 的脚本"
    strings:
        $a = "exec(" nocase
        $b = "wget " nocase
        $c = "curl " nocase
    condition:
        ( $a and ($b or $c) )
}

如果你是安全研究人员或蓝队、要做恶意软件分析,请在隔离环境(离线 VM、快照管理、不可接入生产网络)下进行,遵守法律和公司政策;并优先把研究成果用于检测与防御——比如把可疑样本的 IOCs(IP、域名、哈希)喂入 SIEM/EDR 做拦截。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领