Ext.NET 4.1 最新版本破解
Ext.NET 4.1 最新版本破解
今天在将Ext.NET 4.1版本的程序发布到公网时居然要license(localhost和127.0.0.1不收费),而且一年$4999,突然间觉得这是什么鬼,居然还收费!如图:

大大的一个UNLICENSED!
网上搜索破解方法,好像都没什么用,唯一有启发的是这篇文章(虽然不能解决我的问题):
http://blog.csdn.net/xyun52/article/details/24011507
下面就具体说下我是如何破解该问题的:
右键查看了一下源码,license多了以下两个:
<link type="text/css" rel="stylesheet" href="/ExtTest/extnet/unlicensed/css/un-embedded-css/ext.axd?v=4.1.0" />
<script type="text/javascript" src="/ExtTest/extnet/unlicensed/un-js/ext.axd?v=4.1.0"></script>
一个样式文件,一个js文件。
为了一探究竟我打算用Reflector反编译看看究竟Ext.Net.dll里对License封装了什么,
由于内容较多,我直接搜索”License”,结果还是挺满意的:

看Resouces,正好一个样式文件,一个js文件。
先看看Resources部分:
1.先看中间图片:Ext.Net.Build.Ext.Net.extnet.unlicensed.images.attention.png

这就是图1里显示警告的图。
2.再来看js方法:Ext.Net.Build.Ext.Net.extnet.unlicensed.un.js
Ext.onReady(function () {
Ext.Function.defer(function () {
var el = Ext.DomHelper.append(document.body, {
tag: "div",
id: "unlicensed",
children: [{
tag: "div",
class: "ul-title-icon",
children: [{
tag: "img",
width: 48,
height: 48,
src: Ext.net.ResourceMgr.resolveUrl("~/extnet/unlicensed/images/attention-png/ext.axd")
}]
}, {
tag: "div",
class: "ul-title",
html: "UNLICENSED!"
}, {
tag: "hr",
class: "ul-hr"
}, {
tag: "div",
class: "ul-body",
html: "Your copy of Ext.NET is unlicensed!<br />Ext.NET can be used without a license only on a local development environment."
}, {
tag: "a",
class: "ul-btn",
href: "http://ext.net/store/",
target: "_blank",
html: "PURCHASE LICENSE"
}, {
tag: "div",
class: "ul-footer",
html: "Free Minor Version Upgrades Included!"
}]
}, true);
el.alignTo(document, "br-br", [-20, -20]);
el.slideIn("b", {
listeners: {
afteranimate: function () {
Ext.Function.defer(function () {
el.slideOut("b", {
listeners: {
afteranimate: function () {
Ext.Function.defer(el.destroy, 100, el);
}
}
});
}, 20000);
}
}
});
}, 500, window);
});
图1里的警告信息就是来自于这里。
再来看看ResourceManager部分:
下面来分析LicenseKey和IsValidLicenseKey:
LicenseKey反编译代码:
[DefaultValue(""), Description("")]
public virtual string LicenseKey
{
get
{
if (this.licenseKey != null)
{
return this.licenseKey;
}
if (base.DesignMode)
{
return "";
}
if (Globals.Context != null)
{
string name = "Ext.Net.LicenseKey";
object obj2 = Globals.Application[name];
if (obj2 == null)
{
obj2 = Session(name);
}
if ((obj2 != null) && (obj2 is string))
{
return (string) obj2;
}
}
return GlobalConfig.Settings.LicenseKey;
}
set
{
this.licenseKey = value;
}
}
这段代码的功能就是获取LicenseKey的值:从某个地方读取(比如session)名称为” Ext.Net.LicenseKey”的值。
IsValidLicenseKey反编译代码:
public bool IsValidLicenseKey
{
get
{
if (!this.isValidLicenseKey.HasValue)
{
this.isValidLicenseKey = false;
string licenseKey = this.LicenseKey;
if (licenseKey.IsNotEmpty())
{
try
{
licenseKey = licenseKey.Base64Decode();
}
catch (FormatException)
{
}
if (licenseKey.IsNotEmpty())
{
int num;
DateTime time;
string[] strArray = licenseKey.Split(new char[] { ',' });
if ((((strArray.Length == ) && int.TryParse(strArray[], out num)) && ((num >= ) && DateTime.TryParseExact(strArray[], "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out time))) && (time >= DateTime.Now))
{
this.isValidLicenseKey = true;
}
}
}
}
return this.isValidLicenseKey.Value;
}
}
这段代码的作用就是对LicenseKey的值进行校验,可以获取到LicenseKey值的信息为:
1. LicenseKey值是以逗号分隔的;
2.逗号分隔后,长度为3;
3.逗号分隔后,第2个值为数字,且大于等于4;
4. 逗号分隔后,第3个值为日期,且要大于当前时间,格式为"yyyy-MM-dd",可以猜测为这个值为有效期。
根据这些信息,LicenseKey的值很快可以构建出来,比如:“net,5,2018-11-11”
再注意到这行代码:
licenseKey = licenseKey.Base64Decode();
这就是LicenseKey的编码格式,也就是说传入的LicenseKey不能直接是“net,5,2018-11-11”这样的值,必须是经过转换后的,
跟进去看一下代码:
public static string Base64Decode(this string text)
{
Decoder decoder = new UTF8Encoding().GetDecoder();
byte[] bytes = Convert.FromBase64String(text);
char[] chars = new char[decoder.GetCharCount(bytes, , bytes.Length)];
decoder.GetChars(bytes, , bytes.Length, chars, );
return new string(chars);
}
使用的方法是:Convert.FromBase64String(text),很显然,编码方式给的很彻底,这里直接给出转换代码:
string LicenseKey = "net,5,2018-11-11";
byte[] b = Encoding.Default.GetBytes(LicenseKey);
LicenseKey = Convert.ToBase64String(b);
Session["Ext.Net.LicenseKey"] = LicenseKey;
最后以Session传值(只需要上面4行代码即可),搞定。

看,没有警告了,而且是真正通过验证了。
好了,破解就研究到这里吧。
大家可以将LicenseKey放到ResourceManager中,这样就可以通用了。
Ext.NET 4.1 最新版本破解的更多相关文章
- 最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装
最近做了一个通达OA的大料:20170905最新版本破解可改单位名称,无限制安装 用户约七十家,总体不错,修改了两次注册授权文件,完美使用中 可联系麦枫http://www.mfsun.com管理员Q ...
- Avada v5.0.6 最新版本破解教程如下:
Avada v5.0.6 最新版本破解教程如下: .找到\themes\Avada\includes\avada-envato-api.php文件,注释掉如下两行代码 $response_code = ...
- 2018-3 WebStorm最新版本破解方法
今天重新打开WebStorm发现之前输入的License Server没法用了,不能通过WebStorm的检测,搜索良久,终于找到了最新版本WebStorm的破解方法. 在激活页面选择License ...
- Navicat15最新版本破解 亲测可用!!!
1.下载Navicat Premium官网https://www.navicat.com.cn/下载最新版本下载安装 2.本人网盘链接:https://pan.baidu.com/s/1ncSaxId ...
- 资源:Navicat15最新版本破解 亲测可用(2020-11-14)
1.下载Navicat Premium 官网https://www.navicat.com.cn/下载最新版本下载安装 2.网盘下载破解 本人网盘链接:https://pan.baidu.com/s/ ...
- Navicat15最新版本破解 亲测可用!!!(Navicat Premium 注册出现 No All Pattern Found! File Already Patched)
1.下载Navicat Premium官网https://www.navicat.com.cn/下载最新版本下载安装 2.本人网盘链接:https://pan.baidu.com/s/1ncSaxId ...
- Navicat15 最新版本破解版操作步骤
1.关于Navicat 15的安装版本以及破解机下载 分享的网盘连接:https://pan.baidu.com/s/12DaG0TmS9hXlYmJ_T5ytz2rA 提取码:7cg6 2.安装Na ...
- Reveal1.5破解,iOS_UI调试利器Reveal最新版本破解方法
Reveal1.0.7破解 1.官网下载最新版Reveal,拖动应用程序中,运行一次2.下载16进制编辑器"0xED" for mac(http://dl.vmall.com/c0 ...
- idea2019 3.3最新版本破解安装教程
直接给上神秘地址得了:(应该都可以破解) https://www.jianshu.com/p/c7bdc5819d31
随机推荐
- Ques前端组件化体系
Ques是一套组件化系统,解决如何定义.嵌套.扩展.使用组件. 传统开发模式的痛点 无法方便的引用一个组件,需要分别引用其Javascript.Template.CSS文件 我们期望能以MV*的方式去 ...
- Android开发:第四日番外——Assets文件夹和RAW文件夹区别
话说上回说到SQLite数据库,其中涉及到把已经设计好的数据库打包到APK中,提到可以放置在Assert文件夹或者RAW文件夹中,那么两者到底有什么区别呢?让我们来探究一下. 一.res/raw和as ...
- 【转】Objective-C Class Dump
(转自:http://blog.sina.com.cn/s/blog_4431c7610100x15t.html) class dump是一个命令行工具,用来监测存储在Mach-O二进制文件理的Obj ...
- 高效开发Android App的10个建议
假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比.耗电.耗内存.接下来就会得到用户的消极评论,最后名声也就臭了.即使你的应用设计精良.创意无限也没用. 耗电或者内存占用等 ...
- Xcode 文档注释方法
摘自:http://www.cnblogs.com/bomo/p/4815963.html 文档注释,可以在调用时显示注释信息,让调用者更好的理解方法的用途. 注释方法: /// 注释 和 /** 注 ...
- Oracle导入dmp备份文件到不同的表空间中
原文链接:http://www.2cto.com/database/201211/171081.html 将DMP导入到不同的表空间中 1,用imp导出数据 cmd进入orcle安装目录bin下 ...
- Ajax实现提交表单时验证码自动验证(原创自Zjmainstay)
本文通过源码展示如何实现表单提交前,验证码先检测正确性,不正确则不提交表单,更新验证码. 1.前端代码 index.html <!DOCTYPE html> <html> &l ...
- jQuery - jQuery的$.extend和$.fn.extend作用及区别
jQuery为开发插件提拱了两个方法,分别是: 1. jQuery.fn.extend(); 2. jQuery.extend(); 虽然 javascript没有明确的类的概念,但是可以构建类似类的 ...
- Devexpress treelist 树形控件 实现带三种状态的CheckBox
树形控件是使用频率很高的一种控件.对于属性控件往往需要下面两个功能 1.TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中).使用 ...
- java中静态代码块的用法 static用法详解(转)
(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...