对照URTrackerLicense的构造函数,我们就明白各字段的含义了。也可以构造出一个伪license。我随便构造一个,
string data = "URTracker1Licensed:632598806976562500:735608407859509835:CaoxiCao:0:1000:0:AB9E6TAB9E6T";
注意一下那两个ticks字段,需要把当前的ticks时间包含起来才行,否则IsExpired会判断为true的
回到刚才的思路 分析完 CreateLicense,GetLicense,ValidateLicense ,ValidateLicenseData。现在开始分析GetLicenseDataStream
protected virtual Stream GetLicenseDataStream(Type type)
{
string text3 = type.Assembly.GetName().Name;
type.Assembly.GetName().Version.ToString();
string text1 = "~/licenses/URTRACKER.aspx";
string text2 = null;
try
{
text2 = HttpContext.Current.Server.MapPath(text1);
if (!File.Exists(text2))
{
text2 = null;
}
}
catch
{
}
if (text2 != null)
{
return new FileStream(text2, FileMode.Open, FileAccess.Read, FileShare.Read);
}
return null;
}
知道了,这次知道了licenses生成的地方以及名称就是URTRACKER.aspx!!!
现在只是找到了licese格式,名称和位置,但是具体算法还是没有找到。继续在Lealsoft.URTracker.BLL命名空间找。呵呵!发现个叫EncryptedLicenseProvider的类,看看
居然有个东东!眼睛一亮!
protected override Stream GetLicenseDataStream(Type type)
{
Stream stream1 = base.GetLicenseDataStream(type);
if (stream1 == null)
{
return null;
}
DESCryptoServiceProvider provider1 = new DESCryptoServiceProvider();
provider1.Key = EncryptedLicenseProvider.encryptionKeyBytes;
provider1.IV = EncryptedLicenseProvider.encryptionKeyBytes;
ICryptoTransform transform1 = provider1.CreateDecryptor();
return new CryptoStream(stream1, transform1, CryptoStreamMode.Read);
}
因为我们看到了DES!哈哈,知道了,是DES加密!
看到调用base.GetLicenseDataStream了吗?就是取得license的内容!!
而它的基类就是我们刚刚分析过的ServerLicenseProvider。
好,我们下一步搞清楚Key和IV的值。当找到这个静态构造函数时,心一下子揪了起来,成功了吗?快了!
static EncryptedLicenseProvider()
{
EncryptedLicenseProvider.encryptionKeyBytes = new byte[8] { 0x35, 0x37, 0x42, 50, 0x42, 0x31, 70, 0x36 } ;
}
^_^,终于哭了,搞清楚了DES加密啊!
可以写代码生成伪licese文家了!本来俺做了个 注册机出来的,怕太对不起作者了,暂不公布了!
把源代码公布吧!
---------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
byte[] encryptionBytes = new byte[8] { 0x35, 0x37, 0x42, 50, 0x42, 0x31, 70, 0x36 };
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Key = encryptionBytes;
provider.IV = encryptionBytes;
ICryptoTransform transform1 = provider.CreateEncryptor();
string data = "URTracker1Licensed:632572024003281250:735608407859509835:CaoxiCao:0:10000:0111A7C7D865";
Console.WriteLine(System.DateTime.Now.Ticks); //当前的ticks
byte[] message = Encoding.UTF8.GetBytes(data);
FileStream fs = new FileStream("c:\\URTRACKER.aspx", FileMode.Create,
FileAccess.Write, FileShare.Write);
CryptoStream cs = new CryptoStream(fs, transform1, CryptoStreamMode.Write);
cs.Write(message, 0, message.Length);
cs.Flush();
cs.Close();
fs.Close();