一位安全研究人员在GitHub上开源了一个名为Lucky-Spark的stager项目,它将“滑动窗口”思路引入shellcode的即时解密(Just In Time Decryption)流程,试图在性能与隐蔽性之间找到新的平衡点。该工具主要面向红队行动与渗透测试场景,作者表示,也可以用于保护合法项目的知识产权。

作者在项目说明中开门见山:以往见过的所有即时解密实现,要么是逐条指令解密后再执行(速度极慢),要么在载荷启动时一次性全量解密(几乎失去了对抗内存扫描的意义)。这两种方式都无法同时兼顾执行效率和反取证能力。Lucky-Spark换了一种做法——它并不解密全部内存页,而是维护一个“滑动窗口”,只对窗口内的代码保持明文,其余部分始终处于加密状态。这样一来,任何时刻暴露在内存中的明文字节都只有一小段,大幅降低了被内存检测工具和逆向分析捕获的可能性,同时由于解密粒度是内存页级别而非逐条指令,性能开销得到控制。

从工作流程看,Lucky-Spark首先从指定的HTTP/HTTPS服务器或GitHub raw链接中拉取Sliver等C2框架生成的shellcode载荷。接着,它利用动态API解析来调用那些容易被EDR关注的Windows函数,而不是静态链接,以此规避导入表扫描。载荷中的敏感字符串——例如命令行地址、用户代理——全部用仿射密码加密后存储在编译生成的二进制文件中,进一步减少可读特征。在执行阶段,载荷被分配到纤程(Fiber)中运行,这是一种比线程更轻量的调度单元,分析工具通常难以追踪纤程内的执行流,从而为载荷附加一层调度层面的混淆。

更具巧思的一项是“CPU指令补丁”机制。AES解密所需的CPU指令在代码中并未直接出现,而是被替换成了看起来无害的指令,比如pmulqd。程序运行到恰当的位置时,这些指令会被动态修补为真实的AES操作码,这样静态反汇编器看到的始终是一个没有明显解密意图的函数,直到真正开始解密,内存中的代码才暴露其本来面目。项目还默认将生成的EXE伪装成FileZilla FTP客户端的图标和文件描述,用于应对粗粒度的审查或终端用户的第一印象。

作者强调,这个项目不是所谓的“vibe coding”产物,而是有明确工程意图的工具。源代码已经在GitHub上公开,感兴趣的团队可以直接取用或改写。对于红队工程师而言,Lucky-Spark的价值在于提供了一套现成的组合技:以现代混淆和规避手法,让分阶段载荷落地不再是“要么快、要么藏”的二选一,而是尝试让两者同时成立。