本帖最后由 zjh16529 于 2019-6-6 18:41 编辑
它是一款可以在后台无时无刻记录你操作电脑的动作,通过精致的视图向你展示当天使用最久的程序,投入最深的工作,找到那些浪费时间的“罪魁祸首”。通过简单的点击、添加标签等,就能很迅速地为任意时段生成时间统计表,让你更好地去分析过去的时间、规划未来的时间。
它更是一种态度,所有对低效率办公/学习的不妥协都来自于同一个问题“今天,我真的在想投入的事情上投入足够多的时间了吗?”官网下载地址为:http://www.manictime.com/Download/
今天是2019年的4月9日,刚好抽空更新下,看着自己当时 2017 年发的帖子感触良多。
这几年成长了很多,从一个通信专业的实习生边工作边学习,花了大约一年转行成为程序员,工资也翻了几倍。
只要你努力了就会有收获!
4.7最新版本安装包与补丁
安装软件后把破解补丁覆盖到安装路径即可
链接: https://pan.baidu.com/s/1vN5jvrte-PJkWT5kyqsuUQ 提取码: d7h4
---------------------------------------以下内容为当时破解的思路,新版本有些变动但总的步骤还是差不多的---------------------------------------------
破解补丁放在帖子最下面,你的评分就是我更新的动力哦!
自学C#第三个月了,收获很多,本教程也是我花了一天的时间破解总结出来的,希望大牛带带我。
---------------------------------------我是分割线---------------------------------------------
该软件在官网售价为67刀,可以试用专业版15天,免费版本与专业版的区别如下:
首先查壳,为.net程序:
尝试用De4dot去混淆报错,由于软件为WPF程序所以不支持。
运行一下软件看看:提示选择许可类型
随意输入假码提示:无效的用户名或许可证
我们把程序使用NET Reflector9.0+Reflexil2.1(搜索字符串) :无效的用户名或许可证
什么都没有找到
猜测由于该软件是多语言版本所以默认输出的应该是英文,果然,在程序的Translations目录中找到了zh-chs.txt 翻译文件,打开它
InvalidLicenseDescription = 无效的用户名或许可证
InvalidLicenseDescription
搜索什么都没找到
换一个
[C#] 纯文本查看 复制代码 Finkit.ManicTime.Client.Main.Views.LicenseViewModel.OnOkCommand() : Void
private void OnOkCommand()
{
try
{
Finkit.ManicTime.Common.Licensing.License license = Finkit.ManicTime.Common.Licensing.License.Current;[color=#008000]//取得当前License,这个Current属性很重要,后面会讲到[/color]
if (license != null && license.LicenseType == this.LicenseType && this._licenseService.IsLicenseValidForThisVersion(license) && (this.LicenseType != LicenseType.Professional || !this.IsLicenseEditable))
{
this.CloseWindow(true);
}
else if (license == null || license.LicenseType != LicenseType.Professional || ViewHelper.ShowMessage(base.WindowHost, Translation.Current["RemoveLicense"], Translation.Current["RemoveLicenseConfirmation"], new MessageButton[]
{
MessageButtons.Yes,
MessageButtons.No
}, MessageButtons.Yes, MessageButtons.No) != MessageButtons.No)
{
if (this.LicenseType == LicenseType.Standard)
{
using (FreeLicenseWarningViewModel freeLicenseWarningViewModel = this._freeLicenseWarningViewModelFunc())
{
ViewHelper.ShowViewModelWindow(base.WindowHost, freeLicenseWarningViewModel);
LicenseType? selectedLicenseType = freeLicenseWarningViewModel.SelectedLicenseType;
if (selectedLicenseType != LicenseType.Standard)
{
if (selectedLicenseType == LicenseType.Trial)
{
this.CloseWindow(true);
}
else if (selectedLicenseType == LicenseType.Professional)
{
this.LicenseType = LicenseType.Professional;
}
return;
}
}
}
if (license != null && license.LicenseType == LicenseType.Professional && this.LicenseType == LicenseType.Trial && this._trialProvider.TrialDaysLeft <= 0 && this._trialProvider.CanActivateLicenseExtendedTrial(license))[color=#008000]//如果选择的是专业版,或者说专业版试用期到了,就需要验证许可证[/color]
{
this._trialProvider.ActivateLicenseExtendedTrial(license);
}
string licenseName = (this.LicenseType == LicenseType.Professional) ? this.LicenseName : null;[color=#008000]//取输入的用户名 [/color]
string licenseKey = (this.LicenseType == LicenseType.Professional) ? this.LicenseKey : null;[color=#008000]//取输入的注册码[/color]
string text = this._licenseService.SaveLicense(this.LicenseType, licenseName, licenseKey);[color=#008000]//检测用户名或者密码是否正确,如果返回的字符串就是错误提示,要想办法让它返回空[/color]
if (text == null)
{
if (this.LicenseType == LicenseType.Professional)[color=#008000]//如果说当前许可证类型是专业版[/color]
{
ViewHelper.ShowMessage(base.WindowHost, Translation.Current["ThankYou"], Translation.Current["ThankYouLicense"], MessageButtons.Ok);[color=#008000]//提示注册成功[/color]
}
this.CloseWindow(true);
}
else
{
ViewHelper.ShowMessage(base.WindowHost, Translation.Current["InvalidLicenseTitle"], text, MessageButtons.Ok);[color=#008000]//提示无效的用户名或许可证[/color]
}
}
}
catch (Exception ex)
{
ApplicationLog.WriteError(ex);
ViewHelper.ShowMessage(base.WindowHost, Translation.Current["Error"], Translation.Current["ErrorCheckingLicense"], MessageButtons.Ok);
}
}
用Dnspy搜索方法
断点
运行
输入完用户名和注册码后果然断下来了
单步走到这里出来了
我们输入的假码和返回值text,返回值text如果不为空的话就会提示你无效的用户名或者许可证
下面有个判断当前LicenseType 的值为LicenseType.Professional
看看LicenseType的枚举类型
到这里有的人说了,直接赋值
text=null;this.LicenseType =LicenseType.Professional
不就行了
虽然提示成功,但还是试用版
玄机还是在这个SaveLicense接口里面 string text = this._licenseService.SaveLicense(this.LicenseType, licenseName, licenseKey);
我们看看它是怎么实现的
代码里面的字符串被混淆了
[C#] 纯文本查看 复制代码 public string SaveLicense(LicenseType licenseType, string licenseName, string licenseKey)
{
License license = this.cec92291b0d9687dc39ce93b6c4fc9a37();
if (license != null)
{
for (;;)
{
switch (5)
{
case 0:
continue;
}
break;
}
if (!true)
{
RuntimeMethodHandle runtimeMethodHandle = methodof(c1c06b40f74d7694966226811239bfe37.SaveLicense(LicenseType, string, string)).MethodHandle;
}
if (cc173ca2a048daef9f136c7c3391c2222.c69ea47c25a948bdd1a6911915f05575f(license) == licenseType)
{
goto IL_39;
}
}
License license2 = cf7ecf53e6173a32e48f004d05dd4bb56.c6d1a0d71d406ed233f6d25fd92102834();
c9cd6da64f4de7a63a0ef4d675a1cd88b.c69ea47c25a948bdd1a6911915f05575f(license2, licenseType);
license = license2;
IL_39:
this.cf31aef1033f161ad1fc6bd81e5146647(license, licenseName, licenseKey);
if (!this.c89b1a2b2921143955eac602c4cdaeae5(license))[color=#008000]//这里要返回true,否则就会返回无效的用户名或许可证[/color]
{
for (;;)
{
switch (4)
{
case 0:
continue;
}
break;
}
return ccee3ade34a388c6e057acdf5e30f38b3.c69ea47c25a948bdd1a6911915f05575f(c7d41954fdbe4dbe919b2c7bb2cea7918.c6d1a0d71d406ed233f6d25fd92102834(), c2f8b0d4a4c998183db5285d993e37005.c204b18601a940f2d76b296da36b1f13e(1088));
}
if (!this.IsLicenseValidForThisVersion(license))
{
return c3b4c218e43c3aff4cbe905ce7947cb06.c6d1a0d71d406ed233f6d25fd92102834(ccee3ade34a388c6e057acdf5e30f38b3.c69ea47c25a948bdd1a6911915f05575f(c7d41954fdbe4dbe919b2c7bb2cea7918.c6d1a0d71d406ed233f6d25fd92102834(), c2f8b0d4a4c998183db5285d993e37005.c204b18601a940f2d76b296da36b1f13e(1139)), c9d61c762f2cb53548173b8d9e1cb2377.c69ea47c25a948bdd1a6911915f05575f(cbd292b01d9b89963779986f391071136.c69ea47c25a948bdd1a6911915f05575f(c79cbdec55b5580946d6a47844cd6c485.c6d1a0d71d406ed233f6d25fd92102834())));
}
this.c00187ae94158f0dcac47136ed0bb7b75(license);
this.c1a74dc295b750bbd3a3e195e7e005091();
return null;
}
那我们再看看c89b1a2b2921143955eac602c4cdaeae5
这个方法里面有什么
[C#] 纯文本查看 复制代码 private bool c89b1a2b2921143955eac602c4cdaeae5(License cfde8f00814a77b54fe5305fb3beb0533)
{
if (cfde8f00814a77b54fe5305fb3beb0533 != null)[color=#008000]//如果许可证为空就直接返回false,我们要的是true[/color]
{
for (;;)
{
switch (4)
{
case 0:
continue;
}
break;
}
if (!true)
{
RuntimeMethodHandle runtimeMethodHandle = methodof(c1c06b40f74d7694966226811239bfe37.c89b1a2b2921143955eac602c4cdaeae5(License)).MethodHandle;
}
return this.cc701712da48e6562ea357dea587edf85(cc173ca2a048daef9f136c7c3391c2222.c69ea47c25a948bdd1a6911915f05575f(cfde8f00814a77b54fe5305fb3beb0533)).IsLicenseValid(c4bfe7f62c1778d89acdea70ef09d2cc1.c69ea47c25a948bdd1a6911915f05575f(cfde8f00814a77b54fe5305fb3beb0533), ca48594fcb3c741f82781c845fc293709.c69ea47c25a948bdd1a6911915f05575f(cfde8f00814a77b54fe5305fb3beb0533));[color=#008000]//这里一大串看的头晕,一眼就发现IsLicenseValid这个方法就是验证许可证有效性[/color]
}
return false;
分析一下IsLicenseValid 字面意思就是有效的许可证,明显就是它了
[C#] 纯文本查看 复制代码 public bool IsLicenseValid(string licenseName, string licenseKey)
{
cb8c3325457a40f3a37933e5339217acd cb8c3325457a40f3a37933e5339217acd = this.cd60e3cd81ece5d42cccaea06ed308929(licenseKey);
if (cb8c3325457a40f3a37933e5339217acd == null)
{
for (;;)
{
switch (6)
{
case 0:
continue;
}
break;
}
if (!true)
{
RuntimeMethodHandle runtimeMethodHandle = methodof(c700f5930483739796d52463cf2cd5102.IsLicenseValid(string, string)).MethodHandle;
}
return false;
}
return new c700f5930483739796d52463cf2cd5102.ca407f038f4aa19c2c44d6b1b464d4505(cb8c3325457a40f3a37933e5339217acd.c8e627622045dc7d5fb1cdc8f0db36786).LicenseNameCheckSum == c8d429a059260d58dd4a1aaf2bf2945f0.cda89ef5850cb9f985a9cc2983867bd4c(licenseName).PadLeft(3, '0');
只要让
这个方法返回真就可以了
貌似成功了但是重启软件还是试用版,怀疑有重启验证。Finkit.ManicTime.Common.Licensing.License
我们简单的分析一下这个类
折腾找了一会儿分析了一下Finkit.ManicTime.Common.Licensing
发现里面有一个可疑的静态属性:
[C#] 纯文本查看 复制代码 public static License Current
{
get
{
return License._current;
}
set
{
if (object.Equals(License._current, value))
{
return;
}
License._current = value;
License.CurrentChanged(null, EventArgs.Empty);
}
把它改成
[Asm] 纯文本查看 复制代码 public static License Current
{
get
{
return default(License);
}
set
{
if (object.Equals(License._current, value))
{
return;
}
License._current = value;
License.CurrentChanged(null, EventArgs.Empty);
License._current.Name = "52pojie.cn";
License._current.LicenseType = LicenseType.Professional;
License._current.Activated = true;
License._current.TrialDaysLeft = 999;
License._current.FreeUpgradeExpirationDate = new DateTime?(new DateTime(2099, 9, 25, 14, 23, 6));
}
大功告成!
困死我了,终于可以睡觉去了!!
破解补丁的免CB地址:链接:http://pan.baidu.com/s/1slUAyQx 密码:057r
提示:
软件安装完毕先不要运行,打开文件目录覆盖补丁,之后打开软件选择专业版,输入用户名和许可证(不含引号)
用户名:52pojie.cn
许可证:www.52pojie.cn
Crack By tchivs
觉得教程对你有帮助的话多多评分哟! |