executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-crypto-id加密算法识别:常量表指纹、自定义加密模式。 触发词:加密识别、AES、XOR、算法指纹、custom encryption
Independent GitHub snapshot · Automated classification · Original documentation governs
CryptEncrypt/OpenSSL 符号可直接查——见 [[re-crypto-keys]] 导入表线索)所有工具先验证再使用。本技能以静态/离线分析为主,可免沙箱;动态确认环节(Frida)只针对已运行样本(默认沙箱,[[re-analyze/platform-tips]] 最高原则)。
apt install binutils / dnf install binutils / pacman -S binutils(多数自带)brew install binutils(或系统自带 otool 替代)strings --version;objdump --versiondie.exe GUI);choco install die(部分镜像有)yay -S detect-it-easy 或 releases 的 Linux 版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
00000000963007772c610eeeba510999(脚本已含),MD5 IV 显示序为 67452301efcdab89...,LE 序列化为 0123456789abcdeffedcba9876543210(两种模式都搜)熵分析定位密文(区分密文与明文区域):
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} <- 高熵区(密文/压缩候选)")
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%}")
x ^ rol(x) 对同一 key 重复出现);或找 256 轮换表(与 S-box 类似但值呈循环移位特征)常见算法流程特征(轮数 / 分组):
aes-128-ctr/ofb/cfb 密文都是 37 字节,aes-128-cbc/ecb 才是 48 字节动态侧确认(Frida 断在加密函数):
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)); }
});
frida -p <pid> -l /dev/stdin 里用 Process.enumerateModules() 找动态加载的加密库1F 8B;78 9C 是常见 zlib CMF/FLG 组合而非 gzip,两字节不足以作唯一判据),有则先用 zlib.decompress/binwalk(见 [[re-fw-extract]])试解压再谈加密01 02 04 08 10 20 40 80 1B 36 ...,0x1B 是特征值)与乘法表布局,多表交叉确认再定性