加密算法识别
SkillCommerce & finance加密算法识别:常量表指纹、自定义加密模式。 触发词:加密识别、AES、XOR、算法指纹、custom encryption
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the 加密算法识别 skill
What this skill tells your AI
The instructions your AI receives, as published by dslsdzc/rev-skills in .claude/skills/re-crypto-id/SKILL.md and read by ahel’s review.
何时使用 / 何时不用
- 用:拿到密文(流量或数据 blob)不确定是什么算法时
- 用:样本里有加密实现,需要在反编译前先锁定算法范围
- 用:怀疑自定义加密(XOR/ROL/ROR 变换)而非标准算法
- 不用:算法已知(直接用 [[re-crypto-keys]] 找密钥、[[re-crypto-decrypt]] 解密)
- 不用:标准库 API 调用清晰可见(
CryptEncrypt/OpenSSL 符号可直接查——见 [[re-crypto-keys]] 导入表线索) - 不用:纯静态就能判定是明文([[re-triage]] 熵低/可读字符串多)
工具准备
所有工具先验证再使用。本技能以静态/离线分析为主,可免沙箱;动态确认环节(Frida)只针对已运行样本(默认沙箱,[[re-analyze/platform-tips]] 最高原则)。
python3 —— 指纹与熵分析脚本
- 安装与验证见 [[re-proto-rev]] 工具准备(python3)
binutils —— strings/objdump 取常量与反汇编线索
- Linux:
apt install binutils/dnf install binutils/pacman -S binutils(多数自带) - macOS:
brew install binutils(或系统自带 otool 替代) - Windows/WSL: WSL 内 Linux 版;Windows 本机用 Ghidra 自带工具
- 验证:
strings --version;objdump --version
hexdump —— 十六进制查看密文/常量
- 安装与验证见 [[re-fw-extract]] 工具准备(hexdump)
Detect It Easy(DIE)—— 可选,快速签名识别(Windows 常用)
- Windows: GitHub releases 下载便携版 https://github.com/horsicq/Detect-It-Easy(`diec.exe` CLI /
die.exeGUI);choco install die(部分镜像有) - Linux: AUR
yay -S detect-it-easy或 releases 的 Linux 版 - macOS: 源码构建(Qt 依赖)或 Wine 跑 Windows 版
- 验证:
diec --help输出用法;diec sample.bin能输出签名
操作步骤
按顺序执行,每步记下结果。判定产物(算法假设 + 证据)传给 [[re-crypto-keys]] / [[re-crypto-decrypt]]。
-
常量表指纹(AES S-box / CRC 表 / MD5 IV):
# 静态数据段找常量表候选:连续 256 字节、熵低、无 ASCII strings -n 8 sample.bin | head -50 objdump -s -j .data sample.bin | head -60 # 搜索 AES S-box 开头(前 16 字节特征) python3 - <<'EOF' data = open('sample.bin','rb').read() aes_sbox = bytes.fromhex('637c777bf26b6fc53001672bfed7ab76') crc32_tab_be = bytes.fromhex('0000000077073096ee0e612c990951ba') # 标准 CRC32 表前 16 字节(poly 0xEDB88320,显示序/BE) crc32_tab_le = bytes.fromhex('00000000963007772c610eeeba510999') # 同一表在 x86/ARM 小端二进制内存中的字节序 for name, sig in [('AES_SBOX', aes_sbox), ('CRC32_TAB(BE)', crc32_tab_be), ('CRC32_TAB(LE)', crc32_tab_le)]: i = data.find(sig) while i != -1: print(f"{name} @ 0x{i:x}"); i = data.find(sig, i+1) EOF- 命中 AES S-box(256 字节表)→ AES 候选;命中 CRC 表 → 有 CRC/校验(可能配合 [[re-proto-rev]] 步骤 3);命中 MD5 IV → MD5 候选
- 字节序:上面列出的 hex 均为显示序(BE 阅读序)。小端二进制(x86/ARM)里常量表在内存中的实际字节为 LE 序——CRC 表同时搜
00000000963007772c610eeeba510999(脚本已含),MD5 IV 显示序为67452301efcdab89...,LE 序列化为0123456789abcdeffedcba9876543210(两种模式都搜) - 没命中 → 不排除动态生成表(见坑 2),继续下一步
-
熵分析定位密文(区分密文与明文区域):
data = open('sample.bin','rb').read() import math, collections for base in range(0, len(data), 4096): blk = data[base:base+4096] if not blk: break c = collections.Counter(blk); n = len(blk) h = -sum((v/n)*math.log2(v/n) for v in c.values()) if h > 7.0: print(f"0x{base:x}: entropy={h:.2f} <- 高熵区(密文/压缩候选)")- 高熵区(>7.0)→ 密文或压缩数据候选,记偏移供 [[re-crypto-decrypt]] 定位输入点
- 低熵区但看起来"乱"(无 ASCII、无结构)→ 可能自定义加密或简单变换(下一步)
-
XOR / ROL / ROR 单字节模式检测:
data = open('sample.bin','rb').read() for key in range(256): dec = bytes(b ^ key for b in data) score = sum(1 for b in dec if 32 <= b < 127) if score > len(data) * 0.6: print(f"XOR key=0x{key:02x}, printable={score/len(data):.0%}")- 检测结果"可打印率 >60%" → 单字节 XOR;解密交给 [[re-crypto-decrypt]]
- ROL/ROR:观察密文相邻字节关系(
x ^ rol(x)对同一 key 重复出现);或找 256 轮换表(与 S-box 类似但值呈循环移位特征) - 有密码学直觉也行:单字节变换的结果通常保留原分布特征,先试最简单的再升级(见坑 1)
-
常见算法流程特征(轮数 / 分组):
- 反汇编/反编译里找特征函数形态:AES 有 10/12/14 轮(128/192/256 位)循环结构 + 常数表引用(配合步骤 1);DES 有 16 轮 + 置换表(64 位分组);RC4 有 256 字节 KSA/PRGA 循环
- 数据侧:分组加密 → 密文长度是块大小整数倍(16 字节对齐的常见);流密码 → 长度与明文一致
- 长度规律(16/32 字节对齐)+ 常量表指纹 → 分组加密(AES 最可能,先按 AES 试);长度任意 → 流密码(RC4/XOR/ChaCha)
- 反编译工具有 auto-detection 时先用它(Ghidra 的 FindCrypt 脚本 / IDA 的 FindCrypt2)交叉确认
-
动态侧确认(Frida 断在加密函数):
- 静态结论有歧义(多个候选)时,沙箱内([[re-sandbox]])运行样本,Frida hook 可疑调用:
pip install frida-tools frida -p <pid> -l hook.js// hook.js: 断在疑似加密函数,打印入参(密文/明文)与返回 Interceptor.attach(Module.findGlobalExportByName("crypt_fn"), { // Frida 17+:旧写法 Module.findExportByName(null, ...) 已移除 onEnter(args) { console.log("arg0:", hexdump(args[0])); }, onLeave(ret) { console.log("ret:", hexdump(ret)); } }); - 观察入参是否为高熵密文(对应步骤 2 的偏移)、返回是否变可读 → 确认该函数就是加密/解密点
- hook 目标名不确定时先
frida -p <pid> -l /dev/stdin里用Process.enumerateModules()找动态加载的加密库 - 动态确认结果反哺静态假设:哪个候选函数真的吃到密文,就用哪个(见坑 4 的算法组合:最内层先确认)
- 静态结论有歧义(多个候选)时,沙箱内([[re-sandbox]])运行样本,Frida hook 可疑调用:
跨域联合
- [[re-protocol]]:本网关工作流第 2 步(加密识别)——流量是密文时的必经环节
- [[re-malware]]:C2 通信加密识别(re-malware 第 4 步:netcap → crypto-id → crypto-keys → crypto-decrypt)
- [[re-firmware]]:固件内加密通信/加密固件层的算法识别(配合 [[re-fw-extract]] 解包失败时的加密层判断)
- [[re-crypto-keys]] / [[re-crypto-decrypt]]:下游——识别出算法后找密钥、写解密
- [[re-binary-core]]:反编译佐证([[re-ghidra]] / [[re-ida]] / [[re-radare2]] 的 FindCrypt 类脚本);动态确认在 [[re-sandbox]] 内
- [[re-anti-analysis]]:加壳样本先脱壳再做常量表指纹(壳层常量会污染指纹)
常见坑与陷阱
- 自定义加密先试简单模式(XOR)再升级:现象——花半天做 AES 指纹,最后发现是单字节 XOR;原因——先入为主假设标准算法,没先做廉价检查;对策——步骤 3 的单字节 XOR/ROL/ROR 检测 30 秒内做完,再上常量表指纹与轮数分析(便宜假设先行)
- 表隐藏(动态生成)→ 指纹失效:现象——静态数据段找不到 AES S-box/CRC 表,误判"非标准算法";原因——算法运行时动态生成常量表(常见反分析手法,见 [[re-anti-analysis]] 域);对策——步骤 5 动态确认:运行后内存([[re-memdump]])里搜表特征,或 Frida 断在轮函数看引用
- 算法组合(先 XOR 再 AES)需分层识别:现象——按 AES 解出"明文"仍是乱码,或 XOR 检测可打印率不足;原因——多层加密叠加,单层假设不全;对策——先剥最内/最外层(观察哪个层次剥掉后熵下降、可读性上升),一层层确认,每层识别结果独立记录再组合(见步骤 5 的最内层优先原则)
- 把压缩当加密:现象——熵 >7.0 高熵区按加密处理,解密脚本对不上;原因——zlib/LZMA 压缩同样高熵;对策——先看高熵区前 2-4 字节是否有压缩格式标识(gzip 头
1F 8B;78 9C是常见 zlib CMF/FLG 组合而非 gzip,两字节不足以作唯一判据),有则先用zlib.decompress/binwalk(见 [[re-fw-extract]])试解压再谈加密 - 只搜 S-box 会漏掉变体实现:现象——搜 256 字节 S-box 表没命中,误判"非 AES",实际是 AES;原因——实现用位切片/即时计算 S-box(不存表),但密钥调度仍常保留 16 字节 Rcon 表,或改用 MixColumns 乘法表(GF(2^8) 乘 2/3/9/11/13/14);对策——补充搜 Rcon 序列(
01 02 04 08 10 20 40 80 1B 36 ...,0x1B 是特征值)与乘法表布局,多表交叉确认再定性 - 指纹命中 ≠ 加密函数在用:现象——搜到 AES S-box/CRC 表就按该算法分析半天,实际业务是别的加密;原因——常量表可能来自未调用的静态库代码或壳层常量(先脱壳再指纹,见 [[re-anti-analysis]]);对策——指纹命中后必须 xref 确认表被引用(谁引用、是否在加密路径上),与轮数/分组长度(16/24/32 对齐)交叉,动态侧(步骤 5)最终确认
- 常见签名模式速查:现象——签名算法识别慢;原因——签名算法有固定模式族;对策——按模式快速对照:HmacSHA256(sorted_params, key) 最常见;MD5(params + salt + timestamp) 较老系统;AES(JSON.stringify(params), key) 是加密而非签名;RSA sign 少见(多为金融类) (来源:reverse-skill field-journal,MIT)
Signals
- GitHub stars
- 57
- Forks
- 8
- Last commit
- Sep 2026
ahel review
K1binfo
installs-packages
Automated review, not a security audit. Ruleset v1+k2.
Advanced
- Catalog kind
- skill
- Gateway key
re-crypto-id- Source
- github.com/dslsdzc/rev-skills