关于 deobf-string
deobf-string 是用于从代码或二进制文件中还原加密字符串的逆向分析技能。它通过 IDA Pro MCP 检查解密例程,再引导选择 Python 实现或 Unicorn 仿真。
主要功能
- 01识别加密字符串模式
- 02通过 IDA Pro MCP 检查解密例程
- 03推断算法与参数
- 04用 Python 解密简单算法
- 05用 Unicorn 仿真复杂例程
- 06按地址展示解密字符串
适用场景
- 01还原混淆二进制文件中的字符串
- 02分析 XOR 或替换式字符串加密
- 03仿真依赖运行时状态的解密过程
- 04在修补前检查解密结果
MCP 相关
该技能需要连接 IDA Pro MCP 来检查并反编译解密函数,并在分析开始前确认连接状态。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ p4nda0s/ bin-deobf-skills --skill deobf-string安装后在 Claude Code 中输入/deobf-string确认已加载。
详细介绍
解密字符串
前提条件
开始分析前,请检查 IDA Pro MCP 是否已连接。使用 MCP 工具验证连接。如果 IDA Pro MCP 不可用,请告知用户:
IDA Pro MCP 未连接。请打开已加载 MCP 插件的 IDA Pro,并确保 MCP 服务正在运行,然后重试。
工作流
第 1 步:识别加密字符串
分析用户提供的代码片段或函数,识别字符串加密模式:
- 查找看起来像加密字符串的字节数组或数据引用
- 识别解密例程(通常在字符串使用处调用)
- 通过逆向分析解密函数,确定加密算法
常见模式:
- 使用单字节或密钥数组进行异或
- 自定义替换密码
- RC4 或其他流密码
- Base64 + 异或组合
- 通过算术变换在栈上构造字符串
第 2 步:分析解密例程
使用 IDA Pro MCP 来:
- 反编译解密函数
- 识别参数:加密数据指针、长度、密钥
- 确定算法类型和复杂度
第 3 步:选择解密策略
简单算法(纯计算,无外部依赖):
- 单字节或多字节异或
- ADD/SUB/ROT 变换
- 简单查找表
→ 编写独立的 Python 脚本进行解密。
复杂算法(依赖状态、使用库函数或难以重新实现):
- 多轮自定义加密
- 解密依赖运行时状态或全局变量
- 算法本身经过高度混淆
→ 使用 Unicorn Engine 直接从二进制文件中模拟解密函数。
第 4 步:实现解密
简单解密(Python 脚本):
def decrypt_string(enc_bytes, key):
# Example: XOR decryption
return bytes([b ^ key[i % len(key)] for i, b in enumerate(enc_bytes)])
复杂解密(Unicorn 模拟):
from unicorn import *
from unicorn.arm64_const import *
def emulate_decrypt(binary_path, func_addr, enc_data, enc_len, key_ptr):
with open(binary_path, 'rb') as f:
code = f.read()
mu = Uc(UC_ARCH_ARM64, UC_MODE_LITTLE_ENDIAN)
# Map code segment
mu.mem_map(base_addr, align(len(code)))
mu.mem_write(base_addr, code)
# Map stack
mu.mem_map(stack_base, stack_size)
mu.reg_write(UC_ARM64_REG_SP, stack_top)
# Set up arguments (AArch64 calling convention)
mu.reg_write(UC_ARM64_REG_X0, enc_data_addr)
mu.reg_write(UC_ARM64_REG_X1, enc_len)
mu.reg_write(UC_ARM64_REG_X2, key_addr)
# Emulate
mu.emu_start(func_addr, func_end)
# Read decrypted result
result = mu.mem_read(output_addr, enc_len)
return bytes(result)
第 5 步:输出结果
解密后,向用户展示结果:
- 以表格形式显示解密后的字符串及其地址:
Address | Decrypted String
-------------|------------------
0x00412000 | "Hello, World!"
0x00412020 | "/dev/null"
- 询问用户是否要生成补丁文件:
解密完成。是否要将结果写入 .patched 文件,以替换二进制文件中的加密字符串?
如果用户同意,请生成一个已打补丁的二进制文件,将加密字节替换为明文(以空字符结尾),并保存为 <original_name>.patched。
评论
支持 Markdown