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
盗水者 发表于 2016-12-10 10:08
我竟然看懂了,看来编程没白学,问题是怎么会出来函数体呢,不是应该是汇编形式的吗
因为这是.net程序,编译出来是IL中间语言,可以直接用工具反编译成c#程序,C++之类其他的是直接汇编,没办法转换。 盗水者 发表于 2016-12-10 10:08
我竟然看懂了,看来编程没白学,问题是怎么会出来函数体呢,不是应该是汇编形式的吗
另外好像,这个可以跳过路由器管理员密码,直接进入路由器后台管理。 文章是好文,但是这个软件有3.50注册机,可以注册3.53。不知道注册机作者怎么做出来的 沒用過
在努力研究
3q 话说坛子的那个IL HELPER查询IL指令含义的你有保存吗,hamily老大给的压缩包里面少个什么db 学习了教程很好 不知道什么原因打不开,管理员权限运行也一样。系统环境没问题,电脑配置没问题(i7,16G,256SSD+1T,GT755)。 教程很好,谢谢分享 赞一个,加精鼓励! 下载了打不开 没反应 adoraj 发表于 2016-12-3 21:20
文章是好文,但是这个软件有3.50注册机,可以注册3.53。不知道注册机作者怎么做出来的
兄弟 求注册机。。。。