吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1043|回复: 18
上一主题 下一主题
收起左侧

[UnPackMe] .NET平台 自己写的混淆壳 使用了虚拟化

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

.NET Framework 4.8 的WinForm程序,UnpackMe。

默认用户名:挑战者
用户名可以修改,长度为 3 至 24 个字符,支持汉字、字母、数字、下划线和连字符。
序列号由四组八位十六进制数构成,组间用短横线分隔。

目标:
不修改、不爆破原程序的情况下,至少实现生成默认用户名的序列号并验证通过 并且 还原校验逻辑。



程序较大,只能上传蓝奏云~
下载地址:
https://xycs1.lanzoue.com/iTQVN4cp378f
密码:2087

本帖子中包含更多资源

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

x

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

推荐
凉游浅笔深画眉 发表于 2026-10-20 22:11
xianghongming 发表于 2026-10-20 22:08
大佬厉害,请问可以提供一下思路吗

没思路,随便丢给ai,让他脱壳还原vm就行了!


AI 拉平了逆向编程人员的平均水平——门槛被压低,后面几年全TM都等着失业吧!
推荐
494525777 发表于 2026-10-21 10:59
- 密钥获取 :`keyInput` 控件 → 在运行时用 dnSpy/ILSpy 动态调试,在`Aes.CreateDecryptor` 调用处打断点,dump`key` 和`iv`
- 资源提取 :`GetManifestResourceNames` 可以列出所有资源名;`GetManifestResourceStream` 直接读出加密 blob
- 绕过反调试 :Patch`CheckRemoteDebuggerPresent` 的返回值,或直接 patch`IsDebuggerPresent` 始终返回 0
- 解密 IL :拿到密钥/IV 后,用 C# 写一个脚本调用`Aes.CreateDecryptor().TransformFinalBlock()` 还原原始 IL 流
推荐
凉游浅笔深画眉 发表于 2026-10-20 21:59
本帖最后由 凉游浅笔深画眉 于 2026-10-20 22:03 编辑

凉游浅笔深画眉

C58282F3-83318101-F4BB67FF-F94F8537

在 AI 的强大解析能力面前,.NET 程序的各类加密防护,脆弱得如同一张薄纸。

[Asm] 纯文本查看 复制代码
用户名 ──Trim──► 逐字符哈希(种子324508639) ──► h
│
材料表(35MB资源中解析) ──► D0 D1 D2 D3 ──► C1→C2→C3→C4 ──► x1 x2 x3 x4
输入序列号 ──格式门(35字符/连字符/十六进制)──► 解析 ──► k0 k1 k2 k3
│
(k0^x1)|(k1^x2)|(k2^x3)|(k3^x4) == 0 ?
┌──否──► 失败(返回空)
│是
规范重建 X8-拼串 ──► HMAC-SHA256(材料密钥,
"用户名:序列号") 取前24位
│
通关{…} ──► 界面绿字"验证通过。"

本帖子中包含更多资源

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

x
推荐
凉游浅笔深画眉 发表于 2026-10-21 12:19
舒默哦 发表于 2026-10-21 12:17
画眉老师言重了,还原vm ,即使是当前最强的 AI 也不具备这项能力,如果能依靠 AI 本身的能力还原vm,那 ...

这个CrackMe就是我用Ai写的VM还原脱壳机,我一句代码都没参与过!未来的Ai只会更加恐怖!
4#
 楼主| xianghongming 发表于 2026-10-20 22:08 |楼主

大佬厉害,请问可以提供一下思路吗
5#
 楼主| xianghongming 发表于 2026-10-20 22:18 |楼主
凉游浅笔深画眉 发表于 2026-10-20 22:11
没思路,随便丢给ai,让他脱壳还原vm就行了!

确实,AI越来越屌,什么难题都能搞定,只是时间问题了。。。
6#
oumingxin 发表于 2026-10-21 00:48
凉游浅笔深画眉 发表于 2026-10-20 22:11
没思路,随便丢给ai,让他脱壳还原vm就行了!

你用的是哪个AI?能给个名字不?能直接提供EXE分析算法的
7#
Zhangys2026 发表于 2026-10-21 09:10
凉游浅笔深画眉 发表于 2026-10-20 22:11
没思路,随便丢给ai,让他脱壳还原vm就行了!

已经失业了  兄弟
8#
EnterpriseSolu 发表于 2026-10-21 09:22
凉游浅笔深画眉 发表于 2026-10-20 22:11
没思路,随便丢给ai,让他脱壳还原vm就行了!

这是死的技术,活的是各种行业的业务逻辑,这是人家偷不走的,AI更偷不走,你能用AI做一个AutoCAD不,能做一个Photoshop不,做不了吧,这是人家几十年的工业积累出来的算法,行业实践
9#
diamondboy 发表于 2026-10-21 09:51
EnterpriseSolu 发表于 2026-10-21 09:22
这是死的技术,活的是各种行业的业务逻辑,这是人家偷不走的,AI更偷不走,你能用AI做一个AutoCAD不,能 ...

这个还真能,AI复刻了Photoshop。。。
【官方双语】专业用户试用AI克隆版的Photoshop - Photon Studio#linus谈科技
https://www.bilibili.com/video/BV1QXJi63EH1/?vd_source=0224b9447cc7fa792c856f082b9dbfcb
10#
ps122 发表于 2026-10-21 10:05
注册机来了,来自AI。


[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using HarmonyLib;

// UnpackMe (VeilIL) 序列号计算器 —— .NET Framework 4.0 交互版
// 动态追踪 VM 的逐组比对,提取用户名派生的期望值 x1..x4,拼出合法序列号。
internal static class KeygenNet40
{
    const string ExePath = @"UnpackMe.exe";
    const string LYKK = "λυκκβχπζγλαχηξζεοκοα";   // VM: 逐组处理 k_i
    const string HASH = "ηντυχψχπβγμμξιπψωθσι";   // VM: 变换/哈希
    static readonly uint[] DUMMY = new uint[] { 0x11111111u, 0x22222222u, 0x33333333u, 0x44444444u };
    static readonly string DummySerial = string.Join("-", Array.ConvertAll(DUMMY, d => d.ToString("X8")));

    static readonly Dictionary<uint, int> Xmap = new Dictionary<uint, int>();
    [ThreadStatic] static uint _pending;
    [ThreadStatic] static int _hv;
    [ThreadStatic] static bool _inHook;

    static int ToInt(object o)
    {
        if (o is int) return (int)o;
        if (o is uint) return unchecked((int)(uint)o);
        if (o is short) return (short)o;
        if (o is ushort) return unchecked((short)(ushort)o);
        if (o is byte) return (byte)o;
        return int.MinValue;
    }

    // 统一前缀:按方法名分别处理 λυκκ(k_i) 与 ηνυχ(值)
    static void Pre(object[] __args, MethodBase __originalMethod)
    {
        if (_inHook || __args == null || __args.Length == 0) return;
        _inHook = true;
        try
        {
            string mn = __originalMethod.Name;
            if (mn == LYKK)
            {
                uint ku = unchecked((uint)ToInt(__args[0]));
                for (int i = 0; i < DUMMY.Length; i++) if (DUMMY[i] == ku) { _pending = ku; _hv = 0; break; }
            }
            else if (mn == HASH)
            {
                if (_pending != 0)
                {
                    _hv++;
                    if (_hv == 2) { Xmap[_pending] = ToInt(__args[0]); _pending = 0; }
                }
            }
        }
        finally { _inHook = false; }
    }

    static void Main()
    {
        Console.ResetColor();
        PrintHeader();

        // 载入程序集 + 安装钩子(只做一次)
        Assembly asm;
        Type[] types;
        try
        {
            asm = Assembly.LoadFrom(ExePath);
            types = asm.GetTypes();
        }
        catch (ReflectionTypeLoadException ex) { types = ex.Types.Where(t => t != null).ToArray(); }
        catch (Exception e) { Console.WriteLine("[!] 载入 UnpackMe.exe 失败: " + e.Message); Pause(); return; }

        var pre = typeof(KeygenNet40).GetMethod("Pre", BindingFlags.NonPublic | BindingFlags.Static);
        int patched = 0;
        try
        {
            var harmony = new Harmony("unpackme.keygen.net40");
            foreach (var tn in new string[] { "ξωμξβδομδψηζ&#962;πλνητβψ", "οιιψκφυεζκξφνενγυυθχ" })
            {
                var tp = types.FirstOrDefault(t => t.Name == tn);
                if (tp == null) continue;
                MethodInfo[] ms;
                try { ms = tp.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly); }
                catch { continue; }
                foreach (var m in ms)
                {
                    if (m.IsAbstract || m.IsGenericMethod) continue;
                    try { harmony.Patch(m, prefix: new HarmonyMethod(pre)); patched++; } catch { }
                }
            }
        }
        catch (Exception e) { Console.WriteLine("[!] 安装钩子失败: " + e.Message); Pause(); return; }
        Console.WriteLine("[*] 已就绪(钩子 " + patched + " 个)。输入用户名计算序列号,留空用默认「挑战者」。");

        Type formType = types.FirstOrDefault(t => typeof(Form).IsAssignableFrom(t) && !t.IsAbstract);
        if (formType == null) { Console.WriteLine("[!] 未找到 ChallengeForm"); Pause(); return; }

        // 连续输入循环(不自动退出)
        while (true)
        {
            Console.WriteLine();
            Console.Write("用户名 [挑战者]: ");
            string name = Console.ReadLine();
            if (name == null) break;                 // 输入流结束(重定向)才退出
            name = name.Trim();
            if (name.Length == 0) name = "挑战者";
            if (name.Equals("exit", StringComparison.OrdinalIgnoreCase) || name.Equals("quit", StringComparison.OrdinalIgnoreCase))
            { Console.WriteLine("再见。"); break; }

            //Console.WriteLine("计算中(用户名: " + name + ")...");
            string serial = Compute(formType, name);
            if (serial != null)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                //Console.WriteLine("  用户名: " + name);
                Console.WriteLine("  序列号: " + serial);
                Console.ResetColor();
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("  [!] 提取失败,请重试。");
                Console.ResetColor();
            }
        }
        Pause();
    }

    static string Compute(Type formType, string name)
    {
        Xmap.Clear();
        Exception err = null;
        var t = new Thread(delegate()
        {
            try
            {
                var ctor = formType.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                                   .OrderBy(c => c.GetParameters().Length).First();
                object form = ctor.Invoke(ctor.GetParameters()
                    .Select(p => p.ParameterType.IsValueType ? Activator.CreateInstance(p.ParameterType) : (object)null).ToArray());
                FieldInfo F(string n) { return formType.GetField(n, BindingFlags.NonPublic | BindingFlags.Instance); }
                ((TextBox)F("nameInput").GetValue(form)).Text = name;
                ((TextBox)F("keyInput").GetValue(form)).Text = DummySerial;
                var worker = (BackgroundWorker)F("worker").GetValue(form);
                bool done = false;
                RunWorkerCompletedEventHandler h = delegate { done = true; };
                worker.RunWorkerCompleted += h;
                formType.GetMethod("ζχξλαηβυ&#962;δχιβκξωξβγκ", BindingFlags.NonPublic | BindingFlags.Instance)
                        .Invoke(form, new object[] { form, EventArgs.Empty });
                for (int i = 0; i < 200 && !done; i++) { Application.DoEvents(); Thread.Sleep(100); }
                worker.RunWorkerCompleted -= h;
            }
            catch (Exception e) { err = e; }
        });
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();

        if (err != null) { string em = err.InnerException != null ? err.InnerException.Message : err.Message; Console.WriteLine("  [!] " + em); return null; }
        if (Xmap.Count == 4 && DUMMY.All(d => Xmap.ContainsKey(d)))
            return string.Join("-", Array.ConvertAll(DUMMY, d => unchecked((uint)Xmap[d]).ToString("X8")));
        return null;
    }

    static void PrintHeader()
    {
        Console.WriteLine("=====================================================");
        Console.WriteLine("  UnpackMe 序列号计算器   (.NET Framework 4.0)");
        Console.WriteLine("  目标: " + ExePath);
        Console.WriteLine("  默认用户名: 挑战者    退出: 输入 exit");
        Console.WriteLine("=====================================================");
    }

    static void Pause()
    {
        Console.WriteLine();
        Console.WriteLine("按回车键退出...");
        try { Console.ReadLine(); } catch { }
    }
}

本帖子中包含更多资源

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

x

免费评分

参与人数 1吾爱币 +1 收起 理由
xianghongming + 1 我很赞同!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-10-22 10:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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