吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 648|回复: 19
上一主题 下一主题
收起左侧

[CrackMe] 一个.Net的Check Me!

[复制链接]
跳转到指定楼层
楼主
gsyifan 发表于 2026-7-4 17:41 回帖奖励
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 gsyifan 于 2026-7-6 14:16 编辑

欢迎来测试:
一:得到密码
二:还原源码

三:分析算法


无论是否可以破解,都欢迎讨论,如果成功破解,还有其它几种保护方式,欢迎尝试。

程序:
解压密码:52pojie


保护选项:




成功截图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
凉游浅笔深画眉 发表于 2026-7-7 14:53

丢给AI一键就分析出来了啊。




CheckMe 验证算法与破解思路

样本:CheckMe.exe(TWProtector 加壳)  


1. 程序概览

CheckMe 是一个 TWProtector 保护下的 .NET 控制台 crackme。表面入口 Program.Main 并非真实逻辑,而是:

  1. 打印 TWProtector ASCII 横幅  
  2. 调用 EntryPointDecryptor.Initialize 注入 AES 密钥/IV/密文  
  3. 调用 EntryPointDecryptor.Execute 解密并动态执行真实入口 IL  
  4. 真实逻辑再调用 VerifyPassword 校验用户输入

2. 验证算法

2.1 总入口:VerifyPassword(string input)

bool VerifyPassword(string input)
{
    if (input.Length < 10) return false;
    if (!CheckPrefix(input)) return false;
    if (!CheckMiddle(input)) return false;
    if (!CheckHash(input)) return false;
    return true;
}

校验顺序:长度 → 前缀 → 中段 → 哈希


2.2 前缀校验:CheckPrefix

静态数据:

static readonly int[] _keyEnc = { 115, 119, 113, 148, 146, 152, 138, 137, 155, 151 };
const int prefixKey = 31;  // 0x1F

解码算法:

string DecodePrefix(int[] data, int k)
{
    char[] buf = new char[data.Length];
    for (int i = 0; i < data.Length; i++)
        buf[i] = (char)((data[i] - k - i) & 0xFF);
    return new string(buf);
}

校验:

bool CheckPrefix(string input) =>
    input.StartsWith(DecodePrefix(_keyEnc, 31));

解码结果: TWProtecto(10 字符)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
vipcrack + 1 谢谢@Thanks!
gsyifan + 1 + 1 我很赞同!

查看全部评分

推荐
吾爱廖小雨 发表于 2026-7-7 20:55
本帖最后由 吾爱廖小雨 于 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  &#10003;


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                         END
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
沙发
 楼主| gsyifan 发表于 2026-7-5 06:23 |楼主
5#
tfrist 发表于 2026-7-8 07:03
你们这些人 人家楼主为了考你们 不是考AI
6#
 楼主| gsyifan 发表于 2026-7-8 09:32 |楼主
tfrist 发表于 2026-7-8 07:03
你们这些人 人家楼主为了考你们 不是考AI

没事的,AI时代,就要研究如何应对新的技术和方式,我会继续做下一个保护供大神们测试。
7#
cc329533757 发表于 2026-7-8 12:47
凉游浅笔深画眉 发表于 2026-7-7 14:53
丢给AI一键就分析出来了啊。

用的是哪个ai啊?
8#
adld 发表于 2026-7-12 13:48
以目前AI的能力来说,搞定NET程序,以当前的市面上的强壳,搞定几乎只要用时间,都是降维打击。
我的收费软件让朋友来处理,我上的VMP【VMProtect Lite 3.10.4 Build 2668】,防反射、VMP函数虚拟化、核心函数虚拟化+变异。
最后还是被AI干了,这破的是真干净,和正常有卡密一样,我都好多暗桩,还是被补了。或者被JITHOOK移除。

9#
 楼主| gsyifan 发表于 2026-7-12 22:58 |楼主
adld 发表于 2026-7-12 13:48
以目前AI的能力来说,搞定NET程序,以当前的市面上的强壳,搞定几乎只要用时间,都是降维打击。
我的收费 ...

请关注此贴,我会在随后分享一个新的Check Me!
10#
SoftCracker 发表于 2026-7-13 01:17
adld 发表于 2026-7-12 13:48
以目前AI的能力来说,搞定NET程序,以当前的市面上的强壳,搞定几乎只要用时间,都是降维打击。
我的收费 ...

不可能吧?被脱壳反虚拟化了?把你的文件上传上来(最好把你加壳的文件和AI处理后上的文件都上传上来),我看你是不是没启用虚拟化
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-15 06:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表