吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 29294|回复: 71
上一主题 下一主题
收起左侧

[.NET逆向] XXXXX v3.5.3 Enterprise 破解及注册算法分析教程

  [复制链接]
跳转到指定楼层
楼主
MXWXZ 发表于 2016-12-3 21:08 回帖奖励
本帖最后由 姐又寡闻了 于 2019-6-6 22:37 编辑

【2017年1月21日00:26:52更新】
之前说的好像不清楚,给的文件是主程序破解文件,要用的话需要去官网下载安装好后覆盖才行!
顺便把注册机也写了~
-------------------------------------------------------------------------WebCruiserWVS是一个不错的漏洞检测工具,然而,它却需要注册才能正常使用= =


下面开始爆破:
首先从官网下载enterprise程序 http://www.janusec.com/
C#程序,无壳,拖入graywolf,搜索regist

这是点击注册按钮的响应C#代码
[C#] 纯文本查看 复制代码
private void btnReg_Click(object sender, EventArgs e)
{
        string text = this.txtRegUsername.Text.Trim();
        if (string.IsNullOrEmpty(text) || text.Length < 2)
        {
                MessageBox.Show("Username should has at least 2 letters!");
                return;
        }
        string text2 = this.txtRegCode.Text;
        if (string.IsNullOrEmpty(text2))
        {
                MessageBox.Show("RegCode can not be null!");
                return;
        }
        if (Reg.ValidateRegCode(text, text2) || Reg.ValidateRegCode2(text, text2))  //校验KEY
        {
                RegistryKey registryKey = Registry.CurrentUser.CreateSubKey("Software\\Sec4App\\WebCruiser");
                registryKey.SetValue("Username", text);
                registryKey.SetValue("RegCode", text2);
                string text3 = DateTime.Now.ToString("yyyy-MM-dd");
                text3 = Reg.Encrypt(text3);
                registryKey.SetValue("InitDate", text3);
                this.lblRegInfo.Text = "This copy of WebCruiser is licensed to: " + text;
                MessageBox.Show("Thank You For Registration!", "Registration OK!");
                this.lblRegUsername.Visible = false;
                this.lblRegCode.Visible = false;
                this.txtRegUsername.Visible = false;
                this.txtRegCode.Visible = false;
                this.btnReg.Visible = false;
                this.linkLblBuy.Visible = false;
                this.linkAvangate.Visible = false;
                Reg.A1K3 = true;
                Reg.RegUser = text;
                return;
        }
        MessageBox.Show("Invalid RegCode !");
}

可以看到程序调用了ValidateRegCode和ValidateRegCode2(正确一个即可)来计算KEY是否正确,为了省事,懒得再改启动时的KEY校验了,直接对Reg.ValidateRegCode分析:
[C#] 纯文本查看 复制代码
public static bool ValidateRegCode(string Username, string RegCode)
{
        bool result;
        try
        {
                if (RegCode.Length != 19)  //KEY必须是19位
                {
                        result = false;
                }
                else
                {
                        char[] array = RegCode.ToCharArray();
                        if (array[4] != '-')    //(数组从0编号)第5位必须要是-
                        {
                                result = false;
                        }
                        else
                        {
                                if (array[9] != '-')  //第9位必须要是-
                                {
                                        result = false;
                                }
                                else
                                {
                                        if (array[14] != '-')  //第14位必须要是-
                                        {
                                                result = false;
                                        }
                                        else
                                        {
                                                RegCode = RegCode.Replace("-", "");   //去掉KEY字符串中的-
                                                ulong num = Reg.Hash2UInt64(RegCode);   
                                                string hash = Reg.GetHash(Username);
                                                ulong num2 = Reg.Hash2UInt64(hash);
                                                string source = (num - num2).ToString();
                                                string hash2 = Reg.GetHash(source);
                                                if (hash2.Equals("1FEDF23C6CB786AA"))   //关键判断
                                                {
                                                        Reg._RegOK = true;
                                                        Reg.RegUser = Username;
                                                        result = true;
                                                }
                                                else
                                                {
                                                        result = false;
                                                }
                                        }
                                }
                        }
                }
        }
        catch (Exception ex)
        {
                MessageBox.Show(ex.Message);
                result = false;
        }
        return result;
}

可以看到在【关键判断】处就是看是否正确了,破解很简单,if (hash2.Equals("1FEDF23C6CB786AA"))  改成if (!hash2.Equals("1FEDF23C6CB786AA"))即可。

保存运行,可以看到随便输入就注册成功了哦~

可以看到此软件的破解还是比较简单的,没有网络验证……

下面是追码:
还是从ValidateRegCode函数入手,其中看到了Hash2UInt64和GetHash函数,跟进去看看
[C#] 纯文本查看 复制代码
private static ulong Hash2UInt64(string Str)
{
        ulong result;
        try
        {
                ulong num = ulong.Parse(Str, NumberStyles.HexNumber);
                result = num;
        }
        catch
        {
                result = 0uL;
        }
        return result;
}

这个函数就是把16进制字符串转成10进制,没什么东西。
[C#] 纯文本查看 复制代码
private static string GetHash(string Source)
{
        byte[] bytes = Encoding.UTF8.GetBytes(Source);
        SHA512 sHA = new SHA512Managed();
        byte[] value = sHA.ComputeHash(bytes);
        string text = BitConverter.ToString(value).Replace("-", "");
        char[] array = text.ToCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 128; i++)
        {
                if (i % 8 == 0)
                {
                        stringBuilder.Append(array[i].ToString());
                }
        }
        return stringBuilder.ToString();
}

这个函数看到了SHA512,结合下面的for循环看出是一个128位字符串,估计就是标准的SHA512哈希,然后if (i % 8 == 0)stringBuilder.Append(array.ToString());一句看出是从第一位开始,每8位取一位,总共16位作为返回值。

现在我们发现了:
Hash2UInt64就是将数字字符串变为16进制
GetHash就是返回字符串的SHA512每8位取一位的值(共16位)
然后再看ValidateRegCode:
[C#] 纯文本查看 复制代码
RegCode = RegCode.Replace("-", "");  //去掉KEY中的-
ulong num = Reg.Hash2UInt64(RegCode);    //将KEY转成16进制
string hash = Reg.GetHash(Username);          //将用户名哈希运算
ulong num2 = Reg.Hash2UInt64(hash);         //将用户名哈希运算的值转成16进制
string source = (num - num2).ToString();      //将16进制的KEY减去16进制的用户名哈希
string hash2 = Reg.GetHash(source);             //将上面的结果哈希
if (hash2.Equals("1FEDF23C6CB786AA"))       //哈希值为1FEDF23C6CB786AA则正确。

这就是它的KEY算法了……如果我们要弄出注册机,由于哈希函数不可逆,我们必须碰撞出哈希值为1FEDF23C6CB786AA的一个密钥,而这个密钥作者似乎并没有放到程序里面……由于GETHASH参数要是数字字符串,必须要碰撞出一个数字组成的PRIVATEKEY(长度未知),使其哈希函数值为1FEDF23C6CB786AA,这样便可以通过用户名逆推得到注册机,而这个工程量是极大的……

有兴趣的可以试试暴力碰撞,代码如下:
[C#] 纯文本查看 复制代码
 //HASH算法
private static string GetHash(string Source)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(Source);
SHA512 sHA = new SHA512Managed();
byte[] value = sHA.ComputeHash(bytes);
string text = BitConverter.ToString(value).Replace("-", "");
char[] array = text.ToCharArray();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 128; i++)
if (i % 8 == 0)
stringBuilder.Append(array[i].ToString());
return stringBuilder.ToString();
}

//碰撞sha512 从start开始到end
        private static ulong Crack(ulong start,ulong end)
        {
            for (ulong result = start; result <= end; ++result)
            {
                string source = result.ToString();
                string hash2 = GetHash(source);
                if (hash2.Equals("1FEDF23C6CB786AA"))
                    return result;
                if (result % 100000 == 0)  //查看进度
                    Console.WriteLine(result);
            }
            return 0uL;
        }

/*
调用
碰撞SHA512部分,输入数字从开始和结束
输出0则不存在将碰撞的值
*/
ulong start = ulong.Parse(Console.ReadLine());
ulong end = ulong.Parse(Console.ReadLine());
Console.WriteLine(Crack(start, end));
Console.ReadKey();




总体而言,作者的KEY算法还是不错的,从数学原理方面增大注册机的难度(比如PRIVATEKEY可以设的很大),然而我们可以从判断上下手,分分钟搞定……


感谢@低调(d-iao)  提供了一个可用码,这让我有了办法,用可用的注册码推出PRIVATEKEY!只需要按算法走,在string source = (num - num2).ToString();
string hash2 = Reg.GetHash(source);
if (hash2.Equals("1FEDF23C6CB786AA"))
时候输出source的值,就可以得到PRIVATEKEY了!
通过实验发现其值为9196707196805196908(真大的一个数……)
然后注册机就出来了!
[C#] 纯文本查看 复制代码
using System;
using System.Globalization;
using System.Security.Cryptography;
using System.Text;

namespace crack
{
    class Program
    {
        //HASH算法
        private static string GetHash(string Source)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(Source);
            SHA512 sHA = new SHA512Managed();
            byte[] value = sHA.ComputeHash(bytes);
            string text = BitConverter.ToString(value).Replace("-", "");
            char[] array = text.ToCharArray();
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < 128; i++)
                if (i % 8 == 0)
                    stringBuilder.Append(array[i].ToString());
            return stringBuilder.ToString();
        }
        //16位转换
        private static ulong Hash2UInt64(string Str)
        {
            ulong result;
            try
            {
                ulong num = ulong.Parse(Str, NumberStyles.HexNumber);
                result = num;
            }
            catch
            {
                result = 0uL;
            }
            return result;
        }
        //注册码生成
        private static string Generate(ulong num2)
        {
            ulong key = 9196707196805196908;  //privatekey
            key += num2;
            string res = key.ToString("x");
            res = res.ToUpper();
            res = res.Insert(4, "-");
            res = res.Insert(9, "-");
            res = res.Insert(14, "-");
            return res;
        }
        static void Main(string[] args)
        {
            string a = Console.ReadLine();
            ulong num = Hash2UInt64(GetHash(a));
            Console.WriteLine(Generate(num));
            Console.ReadKey();
        }
    }
}


我真是傻了竟然忘了可以这样……

破解后的文件(官网下载后覆盖主程序!):http://pan.baidu.com/s/1slkzhWL 密码:rt2w
注册机:http://pan.baidu.com/s/1i4Y7cOX   密码:m4tw

点评

直接反编译,痛快  发表于 2016-12-7 19:36
刚好前jit几天在玩 一组可用key: dayeve C467-1E8B-B74F-7808  发表于 2016-12-3 22:06

免费评分

参与人数 20吾爱币 +5 热心值 +19 收起 理由
40huo + 1 谢谢@Thanks!
海底总动员 + 1 + 1 我很赞同!
静and默 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
by晴天 + 1 + 1 用心讨论,共获提升!
dragontiger + 1 + 1 谢谢@Thanks!
2974476591 + 1 谢谢@Thanks!
zamliage + 1 大牛之作品!
南华八怪 + 1 谢谢@Thanks!
ydydq + 1 为毛我没成功呢
独行风云 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
2864095098 + 1 热心回复!
wcj1997 + 1 已答复!
Osimple + 1 我很赞同!
jacky520510 + 1 我很赞同!
王成飞123 + 1 谢谢@Thanks!
uatlaosiji + 1 谢谢@Thanks!
jinxiaoyun + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
blueshark + 1 谢谢@Thanks!
低调(d-iao) + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
arryboom + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

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

推荐
 楼主| MXWXZ 发表于 2016-12-10 17:54 |楼主
盗水者 发表于 2016-12-10 10:08
我竟然看懂了,看来编程没白学,问题是怎么会出来函数体呢,不是应该是汇编形式的吗

因为这是.net程序,编译出来是IL中间语言,可以直接用工具反编译成c#程序,C++之类其他的是直接汇编,没办法转换。
推荐
盗水者 发表于 2016-12-10 10:10
盗水者 发表于 2016-12-10 10:08
我竟然看懂了,看来编程没白学,问题是怎么会出来函数体呢,不是应该是汇编形式的吗

另外好像,这个可以跳过路由器管理员密码,直接进入路由器后台管理。
沙发
adoraj 发表于 2016-12-3 21:20
文章是好文,但是这个软件有3.50注册机,可以注册3.53。不知道注册机作者怎么做出来的
3#
psx1lin 发表于 2016-12-3 21:25
沒用過
在努力研究
3q
4#
arryboom 发表于 2016-12-3 22:04
话说坛子的那个IL HELPER查询IL指令含义的你有保存吗,hamily老大给的压缩包里面少个什么db
5#
zhshmin 发表于 2016-12-3 22:20
学习了  教程很好
6#
w2010d 发表于 2016-12-4 08:42
不知道什么原因打不开,管理员权限运行也一样。系统环境没问题,电脑配置没问题(i7,16G,256SSD+1T,GT755)。
7#
zsl01 发表于 2016-12-4 18:18
教程很好,谢谢分享
8#
Hmily 发表于 2016-12-7 18:07
赞一个,加精鼓励!
9#
allenyushuo 发表于 2016-12-7 20:32
下载了打不开 没反应
10#
allenyushuo 发表于 2016-12-7 20:32
adoraj 发表于 2016-12-3 21:20
文章是好文,但是这个软件有3.50注册机,可以注册3.53。不知道注册机作者怎么做出来的

兄弟 求注册机。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-18 18:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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