好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 吾爱廖小雨 于 2026-7-7 20:59 编辑
D师傅大概3分钟找到了密码
然后登录成功
╔══════════════════════════════════════════════════════════════════╗
║ CheckMe.exe 逆向分析报告 ║
║ TWProtector .NET 程序破解 ║
╚══════════════════════════════════════════════════════════════════╝
┌─── 基本档案 ────────────────────────────────────────────────────┐
│ │
│ □ 文件名 CheckMe.exe │
│ □ 大小 107,520 字节 │
│ □ 平台 .NET Framework v4.0.30319 │
│ □ 保护壳 TWProtector(自定义加壳混淆器) │
│ □ 密码 TWProtector5I │
│ │
└─────────────────────────────────────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第一章 程序架构
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CheckMe.exe
│
├── EntryPointDecryptor 入口解密器 (AES-CBC)
│
├── DynamicExecutor 自定义 IL 虚拟机 ★ 核心引擎
│ ├── IlDesc 方法描述 (返回值/参数/局部变量)
│ ├── InstrDesc 指令描述 (OpCode + 操作数)
│ ├── LocalDesc 局部变量定义
│ └── EhDesc 异常处理表 (try/catch/finally)
│
├── CheckMe.Program 密码验证逻辑 ★ 分析目标
│ ├── VerifyPassword() 主校验
│ ├── CheckPrefix() 前缀校验
│ ├── CheckMiddle() 中间校验
│ ├── CheckHash() 哈希校验
│ ├── DecodePrefix() 解码函数
│ ├── DecodeMiddle() 解码函数
│ ├── ComputeHash() 哈希函数
│ └── PrintFlag() 成功输出
│
└── 混淆类型(Unicode 中文名) TWProtector 运行时辅助
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第二章 混淆机制
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
本程序采用三层混淆保护:
┌──────────────────────────────────────────────────────────┐
│ ① 方法体加密 │
│ 所有方法的 IL 代码被 AES-CBC 加密,分两块存入嵌入资源: │
│ · uwdchypjzvdi (53,071 字节) — 方法 IL 数据 │
│ · nkyplgcbjbbp (588 字节) — 字符串 / 配置数据 │
│ │
│ ② 自定义 IL 虚拟机 │
│ DynamicExecutor 解析加密 IL,使用自定义指令格式执行: │
│ [OpCode(int16)] [OperandType(byte)] [Operand(...)] │
│ 支持 15 种操作数类型,模拟完整 .NET IL 语义 │
│ │
│ ③ 符号混淆 │
│ 类型名和方法名替换为 Unicode 中文字符(??、???? 等) │
│ 反编译工具无法正常显示和解析 │
└──────────────────────────────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第三章 密码结构
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
静态数据(存储在 Program 类中):
_keyEnc = { 115, 119, 113, 148, 146, 152, 138, 137, 155, 151 }
_midEnc = { 90, 85, 89, 75, 81 }
_xorKey = 60
★ 密码 = TWProtector5I (共 13 字符)
┌──────┬───────┬───────┬───────┬───────┬──────┐
│ T │ W │ P │ r │ o │ t │ ← 位置 0~5
│ 84 │ 87 │ 80 │ 114 │ 111 │ 116 │
├──────┴───────┴───────┴───────┴───────┴──────┤
│ CheckPrefix() 验证 │
│ encoded = ascii + (31 + i) │
│ 比对 _keyEnc[0..5] = 115,119,113,148,146,152│
└─────────────────────────────────────────────┘
┌──────┬───────┬───────┬───────┬──────┐
│ e │ c │ t │ o │ r │ ← 位置 6~10
│ 101 │ 99 │ 116 │ 111 │ 114 │
├──────┴───────┴───────┴───────┴──────┤
│ CheckMiddle() 验证 │
│ Substring(6,5) == DecodeMiddle() │
│ 解码 _midEnc → "ector" │
└──────────────────────────────────────┘
┌──────┬──────┐
│ 5 │ I │ ← 位置 11~12
│ 53 │ 73 │
├──────┴──────┤
│ CheckHash() │
│ 验证哈希后缀 │
└─────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第四章 核心算法详解
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
4.1 ComputeHash — 自定义哈希函数
H("") = 7807
H(s + c) = H(s) × 31 ⊕ c (⊕ = XOR)
这是 djb2 哈希的变体,用 XOR 代替了加法。
32 位无符号算术,自然溢出。
┌──────────────────────────────────────┐
│ H("") = 0x00001E7F │
│ H("a") = 0x0003B100 │
│ H("ab") = 0x00726F62 │
│ H("abc") = 0x0DDB7CBD │
│ H("TWProtector") = 0x57DC4AD6 │
└──────────────────────────────────────┘
4.2 DecodePrefix — 递减键解码
result = (char)( data - (k + i) )
解码 _keyEnc (k=60) → "7:3URWHFWR"
(注:CheckPrefix 内部使用不同基准 31 编码,非此函数)
4.3 DecodeMiddle — 序列 XOR 解码
result = (char)( data ⊕ key_sequence )
key_sequence = { k+3, k-6, k-15, k-24, k-25 }
= { 63, 54, 45, 36, 35 } (k=60)
解码 _midEnc → "ector"
4.4 VerifyPassword — 综合验证
bool VerifyPassword(string input)
{
return CheckPrefix(input)
&& CheckMiddle(input)
&& CheckHash(input);
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第五章 还原源码
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下为 CheckMe.Program 类完整还原(C#):
───────────────────────────────────────────────────────────────
using System;
namespace CheckMe
{
class Program
{
static int[] _keyEnc = { 115, 119, 113, 148, 146,
152, 138, 137, 155, 151 };
static byte[] _midEnc = { 90, 85, 89, 75, 81 };
static int _xorKey = 60;
static void Main(string[] args)
{
Console.WriteLine(" TWProtector - 程序保护测试\n");
Console.Write("请输入密码: ");
string input = Console.ReadLine();
if (VerifyPassword(input))
{
Console.WriteLine("破解成功!");
PrintFlag();
}
else
Console.WriteLine("破解失败!");
}
static bool VerifyPassword(string s)
=> CheckPrefix(s) && CheckMiddle(s) && CheckHash(s);
static bool CheckPrefix(string s)
{
for (int i = 0; i < 6; i++)
if ((int)s + (31 + i) != _keyEnc)
return false;
return true;
}
static bool CheckMiddle(string s)
=> s.Substring(6, 5) == DecodeMiddle(_midEnc, _xorKey);
static bool CheckHash(string s)
=> ComputeHash(s) == /* expected */ 0xCA7C4C68;
static string DecodePrefix(int[] d, int k)
{
char[] r = new char[d.Length];
for (int i = 0; i < d.Length; i++)
r = (char)(d - (k + i));
return new string(r);
}
static string DecodeMiddle(byte[] d, int k)
{
int[] key = { k+3, k-6, k-15, k-24, k-25 };
char[] r = new char[d.Length];
for (int i = 0; i < d.Length; i++)
r = (char)(d ^ key);
return new string(r);
}
static int ComputeHash(string s)
{
uint h = 7807;
foreach (char c in s)
h = (h * 31) ^ (uint)c;
return (int)h;
}
static void PrintFlag()
{
Console.WriteLine(@"
+==================================+
| CONGRATULATIONS! |
| You have cracked CheckMe |
+==================================+");
}
}
}
───────────────────────────────────────────────────────────────
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第六章 破解思路
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
步骤 1: 直接调用反射拿到编码数据
_keyEnc = [115, 119, 113, 148, 146, 152, 138, 137, 155, 151]
_midEnc = [90, 85, 89, 75, 81]
_xorKey = 60
步骤 2: 调用 DecodeMiddle 解码中间部分
DecodeMiddle(_midEnc, 60) → "ector"
步骤 3: 确定密码中间位置
反复传入不同长度的字符串给 CheckMiddle,观察异常
→ Substring(6, 5) → 密码需 ≥ 11 字符
→ 位置 6~10 为 "ector"
步骤 4: 确定密码前缀
遍历所有位置测试 CheckPrefix
→ CheckPrefix 验证位置 0~5
→ 编码公式: input + (31 + i) = _keyEnc
→ 前 6 字符 = "TWProt"
步骤 5: 暴力破解哈希后缀
foreach c1, c2 in 可打印字符:
pwd = "TWProtector" + c1 + c2
if VerifyPassword(pwd) → 找到!
→ 后缀 = "5I"
最终密码: TWProtector5I ✓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
END
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|