Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
TinyLoad — 开源 Windows x64 PE 加壳器和加密器。使用自定义虚拟机将可执行文件压缩并加密为自解压存根。 | Kitploit
工具/GitHubGitHub/iamsopotatoe-coder/tinyload
加密/解密工具Payload生成漏洞利用IDS/IPS规避逆向工程Shellcode二进制分析Shellcode 生成
GitHubiamsopotatoe-coder/tinyload

TinyLoad

开源 Windows x64 PE 加壳器和加密器。使用自定义虚拟机将可执行文件压缩并加密为自解压存根。

查看仓库
18016459天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站

github-social-preview

TinyLoad v7.4 - 适用于 Windows 的 PE 加壳器与加密器

build Mentioned in Awesome

TinyLoad 是一款针对 x64 可执行文件的 PE 加密器/加壳器,它通过多层不同的保护机制对输入的 exe 进行加壳,以防止其被逆向工程。它仅由单个 .cpp 文件组成,且没有任何外部依赖。

工作原理

TinyLoad 将你的载荷(payload)附加到自身副本的末尾。当加壳后的 exe 运行时,它会提取载荷、解密,并直接在内存中执行,全程不会将原始文件写入磁盘。每次加壳时,VM 操作码都会被随机更改并放入 4 个独立密钥的子表中,因此不会有两个完全相同的构建产物。

pack() 处理流程
root@kitploit:~
flowchart TD
    start["pack(in, out, vm, comp, veh, noconsole)"] --> load["loadFile(in) → orig"]
    load --> pe{"MZ + PE00 + Machine 0x8664 + NumberOfSections in 1..96?"}
    pe -->|fail| err["printf error / return false"]
    pe -->|ok| init["pay = orig    flags = 0"]
    
    init --> cdec{"--c ?"}
    cdec -->|yes| lz["flags |= 1<br/>lzPack: WINDOW=0xFFFF  MAXCHAIN=4096<br/>MAXMATCH=258  MINMATCH=3  HSIZE=65536<br/>hash4 = FNV-ish fold * 0x1000193<br/>lazy lookahead la = 1,2<br/>out = uint32le origSz + 8-token flag bytes<br/>match → varint dist, varint len-3"]
    cdec -->|no| vmq
    lz --> vmq{"--vm ?"}

    vmq -->|yes| scatter["flags |= 2<br/>Fisher-Yates 32 slots, scatter NUM_OPS=28<br/>into subtables 4x8, unused stay 0xFF<br/>opmap_enc op = tbl shl 6 OR idx"]
    scatter --> canary["canary corridor n=8, skip first 0x400 of pay<br/>canExp c = pay at off XOR prev"]
    canary --> mkvm["makeVmProgram opmap_enc, key1, key2, canary<br/>key1,key2 ← mt19937_64 TickCount64 XOR QPC<br/>opaque predicates + stream loop + canary mask"]
    mkvm --> venc["vmEncryptPayload  192-bit state<br/>k3 = 0x9E3779B97F4A7C15<br/>ks = uint8((k1 XOR k2) + k3)<br/>b = NOT(b XOR ks)<br/>k1 = rotl64(k1,11) XOR k2<br/>k2 = rotr64(k2,19) + k1 + k3<br/>k3 = k3 * phi XOR k1"]
    vmq -->|no| vehq
    venc --> vehq{"--veh ?"}

    vehq -->|yes| vflag["flags |= FLAG_VEH 4"]
    vehq -->|no| stub
    vflag --> stub["stub = loadFile GetModuleFileNameA self<br/>saveFile out, stub as host image"]

    stub --> skey["stubKey = 0x9E3779B97F4A7C15<br/>for i in 0x1000 .. min n, 0x2000:<br/>stubKey = (stubKey XOR stub i) * phi"]
    skey --> disp["prime vmRun dispKey=0 → fill g_off<br/>dispKey ← rng<br/>encOff j = uint64(g_off j) XOR dispKey"]

    disp --> tail["Tail: sig TINYLD60, origSz, packSz, flags,<br/>dispOff x28, subtables 4x8, vmCodeSz,<br/>dispKey, canary*, chunk*,<br/>payHash = SHA-256 orig first 8B"]
    tail --> hide["sig i XOR= stubKey shr 8i<br/>xorOpmap FNV-1a 0x811C9DC5 / 0x01000193<br/>feeds origSz, packSz, vmCodeSz + first 32B<br/>of vmCode and pay, per-table<br/>flags |= FLAG_CHUNK 8"]
    hide --> tenc["XOR-encode Tail fields with stubKey slices<br/>vmCode vi XOR= stubKey shr ((vi*3) and 63)"]

    tenc --> ovl["payload = vmCode || pay<br/>interleave: insert 0x00 after every 3 bytes"]
    ovl --> chunks["split into 4 chunks, shuffle physical order<br/>Tail placeholder TAIL_SERIALIZED_SZ = 419<br/>before each chunk: 128..640 RNG junk"]
    chunks --> tea["xxteaEncrypt bytes after Tail<br/>DELTA=0x9E3779B9  rounds=6+52/n<br/>remainder XOR pxKey0 xor pxKey1 xor pxKey2 xor pxKey3<br/>patch k i XOR FEEDF00D / CAFEBABE /<br/>DEADBEEF / 8BADF00D into _pxBlock<br/>between C0DE1337 and B007DEAD"]
    tea --> ser["XOR chunkOff / chunkSz / chunkOrder / chunkCnt<br/>serializeTail: 16 TLV records id + u16le sz + bytes<br/>Fisher-Yates order, LCG 1103515245+12345<br/>seed = stubKey XOR filesize<br/>append DWORD LE: tailOff XOR stubKey low 32"]

    ser --> fin{"--noconsole ?"}
    fin -->|yes| gui["OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI"]
    fin -->|no| scr
    gui --> scr["scrambleSections: cycle names<br/>.text .data .rdata .bss .idata"]
    scr --> done["saveFile out, result"]

下载

从 releases 获取预编译的二进制文件,或者自行编译。

从源码构建

你需要 MinGW(g++)。只需运行:

root@kitploit:~
g++ -o TinyLoad.exe TinyLoad.cpp -static -O2 -s

或者使用 build.bat。

使用方法

root@kitploit:~
TinyLoad.exe --i <input> [--o <output>] [--vm] [--c] [--veh]

你至少需要使用 --vm、--c 或 --veh 中的 1 个。

示例

2026-08-1118-55-14-ezgif com-video-to-gif-converter

DIE 截图

die-gui-packed die-gui-entropy

压缩

自定义 LZ77 压缩,采用哈希链匹配和 64KB 滑动窗口。压缩首先执行,然后在其之上叠加 VM 加密,因此压缩数据中的任何模式也会被隐藏。

VM 加密

在 stub 内部运行的自定义 28 操作码虚拟机。操作码被随机分配到 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
  • 是的,杀毒软件会标记加壳器,这是意料之中的。(目前在 virustotal 上有 9 个检测,你用它加壳的任何文件都会有 9 个检测,内容无关紧要)
  • 请不要用它加壳恶意软件,它旨在用于合法用途
下载工具
参数作用
--i <file>要加壳的输入 exe
--o <file>输出路径(默认:input_packed.exe)
--vmVM 加密
--cLZ77 压缩
--vehVEH 页面错误解密
--noconsoleGUI 子系统