当前位置:首页 > 综合

怎么编写木马程序

木马程序的编写核心从来不是“写出来”,而是木马“送进去”。你写一个能跑的程序东西不难,难的编写是让它跑在别人机器上还不被察觉。我见过太多人把精力花在功能上,木马结果连最基本的程序免杀都过不了,代码写得再漂亮也是编写废铁。

先说清楚,木马这篇文章只讲原理,程序不提供可直接使用的编写恶意代码。任何未经授权对他人系统植入程序的木马行为,在《刑法》第二百八十五条里写得明明白白,程序三年起步。编写我讲这些,木马是程序为了让你知道防御方在盯什么。

一个木马的最小骨架

拿Windows平台举例。最简陋的远程控制木马,核心就三件事:连回来、收指令、执行。

连回来这一步,用Winsock写个TCP客户端,目标地址写死你的IP,端口选个不常见的,比如49321。代码大概二十行。收指令就是recv阻塞等待,执行用WinExec或者CreateProcess。整套东西编译出来不到50KB。

问题在于,这个exe一旦落地,Windows Defender在2024年的版本里,静态扫描就能秒杀。特征太明显了——一个没有数字签名、没有版本信息、还带网络连接行为的小体积PE文件,启发式引擎闭着眼都能标红。

免杀才是真正的门槛

我拆过一些野外样本,发现一个规律:活得久的木马,代码都写得很“脏”。

有人把shellcode加密后塞进图片像素里,运行时解密到内存执行,磁盘上不落PE文件。这招叫隐写加载,2019年之前很管用,现在EDR会监控VirtualAlloc加EXECUTE_READWRITE的组合调用,照样触发告警。

还有人用Living-off-the-Land思路,不写自己的网络模块,直接调PowerShell的Invoke-WebRequest。好处是流量混在正常管理行为里,坏处是命令行参数会被AMSI记录。绕过AMSI的方法论坛上一搜一大把,但微软每个补丁都在堵。

我个人的观察是,免杀本质上是和时间赛跑。你今天免杀率100%的样本,下个月可能就只剩30%。所以职业选手都是模块化开发,加载器、通信、功能分离,哪部分被杀了换哪部分。

通信协议的伪装

早期木马喜欢用IRC,后来是HTTP,现在流行HTTPS和WebSocket。原因很简单——流量加密后,IDS很难从内容上判断善恶。

但加密也有代价。你自签证书,JA3指纹就对不上正常浏览器。Cobalt Strike的默认证书被标记了不知道多少年,现在还在用默认配置的,基本等于裸奔。

高级点的做法是域前置或者CDN隐匿。流量看起来是去往某个合法云服务商的IP,SNI写的是大厂域名,实际后端通过Host头路由到你的C2。云服务商不配合的话,追踪链条就断在这里。

持久化与反取证

重启就丢的木马没有意义。注册表Run键、计划任务、服务,这三样是Windows上最经典的持久化位置,也是安全软件盯得最紧的地方。

我见过一个有意思的案例:样本把自己注册成WMI事件订阅,触发条件是系统启动后45秒。这种持久化方式在Autoruns里默认不显示,需要手动勾选才能看到。隐蔽性确实好,但WMI活动会被Sysmon Event ID 19/20/21记录,企业环境里一抓一个准。

反取证方面,删日志是最蠢的做法。Windows事件日志有文件句柄保护,你删的时候系统会记一笔。聪明点的做法是控制日志产生量,或者用合法工具的行为掩盖自己的痕迹。

写给自己看的总结

木马开发是攻防对抗最激烈的领域之一。你写的每一行代码,对面都有人在研究怎么检测。纯粹为了炫技去写这东西,性价比极低——有这时间,不如去挖两个0day,或者老老实实做渗透测试。

真要学,建议在隔离环境里用Metasploit生成个payload,然后自己写检测规则把它抓出来。这个过程比写木马本身有价值得多。

分享到: