Rain 是一个基于 Nim 语言编写的高性能、隐蔽的内存加载器。它能够将预先加密的 PE 文件(如 fscan)直接在内存中解密并加载运行,而无需将明文程序写入磁盘。
- 全内存运行:被加载的 Payload 全程不落地,通过
Reflective Loader技术在内存中模拟 Windows 加载逻辑。 - 静态免杀:Payload 以 XOR 加密形式静态存储在 Loader 数据段中,有效避开静态特征扫描。
- PEB 参数劫持:通过底层汇编直接修改进程环境块(PEB),支持动态传递命令行参数给内存中的 PE。
- 极致轻量:使用 GCC 兼容的内联汇编和
winim/lean库,最小化二进制文件体积。 - 高兼容性:支持修复导入表(IAT)和重定位表(Relocation),确保复杂的 PE 文件能正常运行。
- 解密阶段:从数据段读取
staticRead导入的加密数据,通过 XOR 密钥进行内存解密。 - 映射阶段:调用
VirtualAlloc分配内存,并根据 PE 头部的Section Headers将各个节(.text, .data, .rdata 等)映射到对应位置。 - 修复阶段:
- IAT 修复:遍历导入表,使用
LoadLibrary和GetProcAddress填充真实的函数地址。 - 重定位修复:计算内存地址增量(Delta),根据重定位表修正绝对地址引用。
- 环境模拟:通过
gs:[0x60]偏移获取 PEB,直接劫持ProcessParameters中的命令行字符串。 - 交付执行:计算
EntryPoint地址并跳转执行。
首先,你需要一个经过 XOR 加密的 fscan.exe。你可以使用以下 Python 脚本生成:
# encrypt.py
key = 0x42
with open("fscan.exe", "rb") as f:
data = f.read()
enc_data = bytes([b ^ key for b in data])
with open("fscan.enc", "wb") as f:
f.write(enc_data)- Nim 编译器 (建议 2.0+)
- MinGW-w64 (GCC 编译器)
winim库:nimble install winim
使用以下命令进行极致瘦身编译:
nim c -d:danger -d:strip --opt:size --threads:on --cpu:amd64 rain.nim
参数说明:
-d:danger: 移除所有运行时检查,提高速度并减小体积。-d:strip: 剥离符号表和调试信息。--opt:size: 针对文件大小进行优化。
编译完成后,你可以像使用原程序一样直接传递参数:
.\rain.exe -h 192.168.1.1 -o result.txt
本工具仅限于授权的安全审计和技术研究使用。用户需遵守当地相关法律法规。由于非法使用本工具而导致的任何后果,由使用者自行承担,开发者不承担任何法律责任。