加密解密算法与编码–逆向工程基础知识
字数 3632 2025-09-01 11:25:53
逆向工程基础知识:加密解密算法与编码
密码破解基础
简单密码破解流程
- 调试工具使用:使用x64dbg加载程序,观察关键函数调用
- 关键点定位:
- 在断点上方寻找jmp和call语句
- 最后一个被调用的函数通常是check_pass()函数
- 寄存器分析:
- 输入密码和正确密码通常被加载到RCX和RAX寄存器进行比较
- 修改返回值:
- 找到check_pass()函数的返回值位置(通常通过EAX/RAX寄存器)
- 将返回值从1(错误)修改为0(正确)来绕过验证
XOR加密破解
- 特征识别:
- 程序中存在"mov al, byte ptr [argv] + xor al, byte ptr [key]"的连续指令
- 破解原理:
- 如果 X xor Y = Z,则 Y xor Z = X
- 通过已知密钥和加密结果可以还原原始数据
- 实际案例:
- 密钥集:[U、V、W、X、Y、Z、Q、R、S、T]
- 加密结果:&"7=! (空格)'
- 通过逐字符异或可以还原原始密码
网络验证破解
网络通信流程分析
-
关键函数:
- WSAStartup:初始化winsock DLL
- Socket:创建套接字
- Inet_addr:指定IP版本
- Htons:端口转换(如8080端口)
- Connect:连接服务器
- Send:发送数据
- Recv:接收验证结果
-
破解方法:
- 方法一:修改零标志位为1,使比较结果恒为相等
- 方法二:在strcmp比较前修改寄存器值,使比较双方相同
哈希算法识别
MD5特征
- 模数特征:四组模数ab和cd,是1-F的组合
- 算法特征:
- 压缩函数执行64轮迭代(4组×16轮)
- 输出128位哈希值(4个32位寄存器拼接)
SHA-1特征
- 算法特征:
- 压缩函数共80轮迭代(4组×20轮)
- 输出160位哈希值(5个32位寄存器拼接)
编码算法
Base系列编码
-
共同特点:
- 将二进制数据转化为可打印字符
- 是编码算法而非加密算法
- 本质上是进制转换算法
-
Base58:
- 码表:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
- 特点:去除易混淆字符(0,O,I,l等)
- 应用:Bitcoin钱包地址
- Base58Check:增加4字节校验码(SHA256前4字节)
-
Base64:
- 码表:A-Za-z0-9+/
- 编码方法:每3字节→4字节(3×8=24,24/6=4)
- 填充规则:原始数据长度模3余1补2=,余2补1=
- URL安全版本:将+/替换为-_
-
Base32:
- 码表:A-Z和2-7
- 编码方法:每5字节→8字节(5×8=40,40/5=8)
- 特点:不区分大小写,无易混淆字符
-
Base16:
- 码表:0-9A-F
- 编码方法:每1字节→2字节(1×8=8,8/4=2)
- 特点:无填充,数据量扩大一倍
对称加密算法
AES(高级加密标准)
-
基本参数:
版本 密钥长度 分组长度 加密轮数 实际密钥长度 AES-128 4字(32位) 4字 10 128位 AES-192 6字 4字 12 192位 AES-256 8字 4字 14 256位 -
加密流程:
- 密钥扩展:从初始密钥派生多个轮密钥(44个32位字)
- 初始轮:AddRoundKey(明文与第一轮密钥异或)
- 主轮(9轮):
- SubBytes:S盒字节替换
- ShiftRows:行循环左移
- MixColumns:列混合(矩阵乘法)
- AddRoundKey:与轮密钥异或
- 最终轮(第10轮):省略MixColumns
-
识别特征:
- S盒查表操作(mov al, byte ptr [sbox+eax])
- 4×4状态矩阵操作
- 10/12/14轮加密循环
- 行移位和列混合操作
DES
-
基本参数:
- 分组长度:64位
- 密钥长度:56位(实际64位,8位校验)
- 加密轮数:16轮
-
加密流程:
- 初始置换(IP)
- 16轮Feistel网络:
- 右半部分扩展(E盒):32位→48位
- 与子密钥异或
- S盒替换(8组6位→4位,共32位)
- P盒置换
- 最终置换(IP⁻¹)
-
子密钥生成:
- PC-1置换(64位→56位)
- 循环左移(每轮1或2位)
- PC-2置换(56位→48位)
-
识别特征:
- 初始/最终置换
- 16轮Feistel结构
- 8个S盒查表
- PC-1/PC-2置换操作
RC4
-
特点:
- 流密码(序列密码)
- 密钥长度可变(1-256字节)
- 算法简单,速度快
-
加密流程:
- 初始化S盒(256字节):S[i] = i
- 使用密钥打乱S盒:j = (j + S[i] + key[i % keylen]) % 256
- 生成密钥流:
- i = (i + 1) % 256
- j = (j + S[i]) % 256
- 交换S[i]和S[j]
- t = (S[i] + S[j]) % 256
- 密钥字节k = S[t]
- 加密:明文与密钥流异或
-
识别特征:
- 256字节S盒初始化
- S盒打乱操作
- 密钥流生成循环
- 异或加密操作
国密算法
SM4
-
基本参数:
- 分组长度:128位
- 密钥长度:128位
- 加密轮数:32轮
-
特征识别:
- 固定S盒:0xd6,0x90,0xe9...
- 固定参数FK:0xa3b1bac6,0x56aa3350...
- 轮常量CK:0x00070e15,0x1c232a31...
-
加密流程:
- 轮函数包含:
- 非线性τ变换(S盒)
- 线性变换L(移位和异或)
- 32轮迭代
- 解密:轮密钥逆序使用
- 轮函数包含:
非对称加密算法
RSA
-
密钥生成:
- 选择大质数p和q
- 计算n = p×q
- 计算φ(n) = (p-1)(q-1)
- 选择e(与φ(n)互质)
- 计算d ≡ e⁻¹ mod φ(n)
- 公钥:(n,e),私钥:(n,d)
-
加密/解密:
- 加密:c ≡ mᵉ mod n
- 解密:m ≡ cᵈ mod n
-
识别特征:
- 大整数运算(数百位)
- 模幂运算(快速幂算法)
- 模运算(div指令)
- 常见密钥长度:1024/2048/4096位
TEA系列加密算法
TEA/XTEA/XXTEA共同特征
- delta常量:0x9e3779b9
- 基本操作:移位、异或、加法混合运算
TEA
- 特征:
- 固定32轮加密
- 密钥固定索引(key[0]-key[3])
- 加密公式:y += ((z<<4)+key[0]) ^ (z+sum) ^ ((z>>5)+key[1])
XTEA
- 特征:
- 轮数可自定义
- 密钥动态索引(key[sum&3]或key[(sum>>11)&3])
XXTEA
- 特征:
- 支持多数据块加密
- 复杂MX宏运算:((z>>5^y<<2)+(y>>3^z<<4)) ^ ((sum^y)+(key[(p&3)^e]^z))
- 轮数公式:6 + 52/n(n为数据块数)
加密算法识别速查表
| 算法 | 关键特征 | 验证方法 |
|---|---|---|
| XOR | 循环中高频xor指令,无复杂运算 | 取密文与密钥异或验证结果 |
| TEA | delta常量0x9e3779b9,固定密钥索引 | 查找delta常量,验证密钥 |
| XTEA | delta常量,密钥依赖sum计算 | 检查密钥索引是否与sum相关 |
| XXTEA | delta常量,多数据块循环 | 查找多块循环和MX宏运算 |
| AES | S盒查表,行移位,列混合 | 检查S盒和10/12/14轮结构 |
| DES | 初始置换,16轮Feistel,8个S盒 | 查找置换和S盒操作 |
| RC4 | 256字节S盒初始化与打乱 | 跟踪S盒初始化和密钥流生成 |
| RSA | 大整数模幂运算 | 查找大整数存储和模运算 |
| SM4 | 固定FK/CK参数,特定S盒 | 比对FK/CK和S盒数值 |
| Base64 | 码表A-Za-z0-9+/,3→4字节 | 检查填充规则和码表 |
逆向工程实用技巧
-
调试技巧:
- 在关键比较指令前设置断点
- 修改标志寄存器或关键寄存器值
- 跟踪函数返回值(通常通过EAX/RAX)
-
算法识别:
- 查找特征常量(如TEA的delta)
- 分析加密循环结构
- 识别S盒或置换表
-
密码破解:
- 对于对称加密,尝试提取密钥
- 对于非对称加密,分析密钥生成过程
- 对于编码算法,识别码表和编码规则
-
工具使用:
- IDA插件:FindCrypt识别加密算法
- x64dbg:动态分析程序行为
- Python脚本:快速验证加密算法