
TinyLoad v7.3
开源 Windows x64 PE 加壳器和加密器。使用自定义虚拟机将可执行文件压缩并加密为自解压存根。
TinyLoad v7.3 - Windows PE 加壳器
TinyLoad 是一个用于 x64 可执行文件的 PE 加密器/加壳器,它通过不同的保护层打包输入的可执行文件,以防止其被逆向工程。它只是一个单独的 .cpp 文件,没有任何外部依赖。
工作原理
TinyLoad 将你的负载附加到它自身的一个副本上。当加壳后的可执行文件运行时,它会提取负载、解密,并直接在内存中执行,而不会将原始文件写入磁盘。每次你打包东西时,VM 操作码都会被随机更改,并放入 4 个独立密钥的子表中,因此没有两个构建是相同的。
下载
从 releases 获取预编译的二进制文件,或者自行构建。
从源码构建
你需要 MinGW (g++)。只需运行:
g++ -o TinyLoad.exe TinyLoad.cpp -static -O2 -s
或者使用 build.bat。
使用方法
TinyLoad.exe --i <input> [--o <output>] [--vm] [--c] [--veh]
| 标志 | 作用 |
|---|---|
--i <file> | 要打包的输入 exe |
--o <file> | 输出路径(默认:input_packed.exe) |
--vm | VM 加密 |
--c | LZ77 压缩 |
--veh | VEH 页面错误解密 |
--noconsole | GUI 子系统 |
你至少需要 --vm、--c 或 --veh 中的一个。
示例
DIE 截图
压缩
自定义 LZ77 压缩,使用哈希链匹配和 64KB 滑动窗口。压缩首先进行,然后 VM 加密叠加在其上,因此压缩数据中的任何模式也会被隐藏。
VM 加密
一个自定义的 28 操作码虚拟机,运行在 stub 内部。操作码被随机放入 4 个各含 8 个的子表中,每个子表都用从负载数据派生的不同密钥进行 XOR 加密。破解 1 个子表最多只能揭示 28 个操作码中的 8 个。密码本身是一个 128 位流密码,使用 rotl 和 rotr 密钥混合,完全在 VM 解释器内运行。负载使用 XXTEA 加密。
VEH 页面错误解密
启用 --veh 后,所有 PE 节页面都被映射为 PAGE_NOACCESS。当程序尝试访问某个页面时,会触发异常,向量化异常处理程序仅解密该 1 个页面并设置正确的保护。一个看门狗线程在后台运行,并重新加密任何在 200ms 内未被触及的页面。在任何给定时刻,你程序的大部分内容在内存中仍然是加密的,因此内存转储只能捕获最近访问过的内容。
反转储
4 个最关键的 API(GetModuleHandleA、GetProcAddress、ExitProcess、VirtualAlloc)会被重定向,通过 stub 内的包装函数。负载加载完成后,整个导入目录被清零,因此内存转储无法重建导入表。
图表:
许可证
MIT
附注
- 还有很多功能我没有写进 readme,你可以自己阅读代码或查看 changelog.md
- 这在我测试过的大多数文件上都有效,如果在你的文件上出错,请开一个 issue,我会查看
- 建议和功能想法也可以发到 issues 里
- 如果你使用它,一个 star 会很有帮助 <3
- 查看博客 https://iamsopotatoe-coder.github.io/TinyLoad/#blog 获取未来更新
- 是的,杀软会标记加壳器,这是意料之中的。(目前在 virustotal 上有 9 个检测,你用加壳器打包的任何文件都会获得 9 个检测,内容无关紧要)
- 请不要用这个打包恶意软件,它的用途是合法目的