MXWXZ 发表于 2016-12-3 21:08

XXXXX v3.5.3 Enterprise 破解及注册算法分析教程

本帖最后由 姐又寡闻了 于 2019-6-6 22:37 编辑

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

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

这是点击注册按钮的响应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分析:
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 != '-')    //(数组从0编号)第5位必须要是-
                        {
                              result = false;
                        }
                        else
                        {
                              if (array != '-')//第9位必须要是-
                              {
                                        result = false;
                              }
                              else
                              {
                                        if (array != '-')//第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"))即可。

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

可以看到此软件的破解还是比较简单的,没有网络验证……
static/image/hrline/4.gif
下面是追码:
还是从ValidateRegCode函数入手,其中看到了Hash2UInt64和GetHash函数,跟进去看看
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进制,没什么东西。
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.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:
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,这样便可以通过用户名逆推得到注册机,而这个工程量是极大的……

有兴趣的可以试试暴力碰撞,代码如下:

//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.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();



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

static/image/hrline/4.gif
感谢@低调(d-iao)提供了一个可用码,这让我有了办法,用可用的注册码推出PRIVATEKEY!只需要按算法走,在string source = (num - num2).ToString();
string hash2 = Reg.GetHash(source);
if (hash2.Equals("1FEDF23C6CB786AA"))
时候输出source的值,就可以得到PRIVATEKEY了!
通过实验发现其值为9196707196805196908(真大的一个数……)
然后注册机就出来了!
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.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

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。不知道注册机作者怎么做出来的

psx1lin 发表于 2016-12-3 21:25

沒用過
在努力研究
3q

arryboom 发表于 2016-12-3 22:04

话说坛子的那个IL HELPER查询IL指令含义的你有保存吗,hamily老大给的压缩包里面少个什么db

zhshmin 发表于 2016-12-3 22:20

学习了教程很好

w2010d 发表于 2016-12-4 08:42

不知道什么原因打不开,管理员权限运行也一样。系统环境没问题,电脑配置没问题(i7,16G,256SSD+1T,GT755)。

zsl01 发表于 2016-12-4 18:18

教程很好,谢谢分享

Hmily 发表于 2016-12-7 18:07

赞一个,加精鼓励!

allenyushuo 发表于 2016-12-7 20:32

下载了打不开 没反应

allenyushuo 发表于 2016-12-7 20:32

adoraj 发表于 2016-12-3 21:20
文章是好文,但是这个软件有3.50注册机,可以注册3.53。不知道注册机作者怎么做出来的

兄弟 求注册机。。。。
页: [1] 2 3 4 5 6 7
查看完整版本: XXXXX v3.5.3 Enterprise 破解及注册算法分析教程