最终效果
前期准备
下载安装VS2022
下载最新版本的RxShxxpxr C++插件,并安装完成
下载最新版本Dnspy(64位)
背景
- 该插件实在好用,但。。。
- 网络上找到的资源不能直接使用
- 该插件至少在2019.2.3版本以后新增了网络登录验证;
- 证书服务的算法有所改变,且证书服务器作者停止更新,或无法找到该资料
- 现存补丁不能适应最新版本的
- 近期有点时间整理下家用电脑的开发环境
过程
-
根据旧版本Patch信息,定位到试用证书的过期验证;System.Boolean JetBrains.Application.License2.Evaluation.EvaluationInfoEx::IsExpired(JetBrains.Application.License2.Evaluation.IEvaluationInfo,JetBrains.Application.License2.ISupportsEvaluation) ; 但发现存在登录验证,这块的逻辑是根本没走到。无奈用不了,所以接下来的目标是找到在哪里做的账号是否登录的判断
-
既然这时的方法重要,说明是核心逻辑,使用“分析”看看都在什么地方使用了;其中Check字样比较突出,打上断点,果然
-
本想直接修改这个字段,但修改不了,原因:这是个属性方法,效果同字段,但却是个方法。
-
不能修改值,那看看来源是哪?我们打开堆栈,但委托+方法返回值的形式,一时没明白从哪调过来的。且Pair 来自this.AllModel.Value.Entities.WithEvaluationSupport()
-
先看this.AllModel 从哪来,发现其只存在get,没有set?那值怎么设置的?对了,是直接赋值,但不知为什么,dnspy没搜索到?
-
下断查看取值及来源(堆栈),但可惜,此时的Value字段为空。
-
经过分析。。,找到添加的入口;
-
中间是一段分析。。发现submodule来自这里:this.myLicensedEntities,而这个数据来源如下:
-
搞错了,这个里没有重点的IsStart;重新分析!
-
断点后,查看堆栈:
-
发现LicenseData中的成员myData
下断后发现,里面有刚才看到的试用版证书的信息。进一步分析来源:
下图是LoadItems的实现:
断点调试并观察结果可知后续结论。
结论
-
安装完成后,会生成一个试用证书,由 JetBrains.Application.License2.Persistence.RegistryPersister1<JetBrains.Application.License2.Evaluation.EvaluationInfo> JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::CreateSerializer(JetBrains.Util.ILogger,System.String,System.Boolean,System.Boolean) 创建;创建时有两个参数,用于控制是否自动启用,是否记录使用时长;
-
检查自动启用逻辑,在System.Collections.Generic.IEnumerable1<JetBrains.Application.License2.Evaluation.IEvaluationInfo> JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::LoadItems()中判断,bool flag = lastRunEvalTechnicalNames.Contains(pair.First.TechnicalName); 而TechnicalName经过调试,值为ReSharperCpp,从下图 获得:
经过调试,该注册表项的值为“{ReSharperCpp}”时,会自动启用;像这样
-
证书创建完成后,由System.Void JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::SaveItems(System.Collections.Generic.IEnumerable1<JetBrains.Application.License2.Evaluation.IEvaluationInfo>) 方法,保存到注册表;
方案一
本想写代码修改dll,但目前没有思路。此方案不用修改dll,仅修改注册表即可。
-
使用dnspy打开Shell.dll后,打开System.Void JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::.ctor ,找到注册表地址,在表中添加字符串ReSharperCpp ; 如果版本能对上,则
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\Settings\{9656c84c-e0b4-4454-996d-977eabdf9e86}]
"{294AEEB3-D72E-426D-8AF8-2BBA18633156}"="{ReSharperCpp}"
-
因存在30天限制,需要30天内清除{9656c84c-e0b4-4454-996d-977eabdf9e86} 下生成的临时试用证书。如下图所示。
方案二
对JetBrains.Platform.Shell.dll 打补丁,修改类实现
-
修改EvaluationInfoEx类的实现为下文所示:
public static class EvaluationInfoEx
{
// Token: 0x06002F85 RID: 12165 RVA: 0x0001E013 File Offset: 0x0001C213
public static bool IsRunning([NotNull] this IEvaluationInfo info, [NotNull] ISupportsEvaluation supportsEvaluation)
{
return info.IsStarted && !info.IsPaused && !info.IsExpired(supportsEvaluation);
}
// Token: 0x06002F86 RID: 12166 RVA: 0x0001E035 File Offset: 0x0001C235
public static int GetLeftDays([NotNull] this IEvaluationInfo info, [NotNull] ISupportsEvaluation supportsEvaluation)
{
return int.MaxValue;
}
// Token: 0x06002F87 RID: 12167 RVA: 0x00003F12 File Offset: 0x00002112
public static bool IsExpired([NotNull] this IEvaluationInfo info, [NotNull] ISupportsEvaluation supportsEvaluation)
{
return false;
}
// Token: 0x06002F88 RID: 12168 RVA: 0x00005315 File Offset: 0x00003515
public static bool IsValid([NotNull] this IEvaluationInfo info, [NotNull] ISupportsEvaluation supportsEvaluation)
{
return true;
}
}
-
修改JetBrains.Application.License2.Persistence.RegistryPersister<JetBrains.Application.License2.Evaluation.EvaluationInfo> JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::CreateSerializer() 方法的实现为下文所示:
private static RegistryPersister<EvaluationInfo> CreateSerializer(ILogger logger, string guid, bool autoStart, bool trackUsageOnStart)
{
EvaluationInfo evaluationInfo = EvaluationInfo.CreateInstallerValue(guid);
evaluationInfo.StartEvaluation();
evaluationInfo.SetUsed(true);
JsonLikeSerializer jsonLikeSerializer = new JsonLikeSerializer('[', ']', ',', '=', true);
return new SafeRegistryPersister<EvaluationInfo>(logger, "Software\\Microsoft\\Windows\\CurrentVersion\\Ext\\Settings\\{9656c84c-e0b4-4454-996d-977eabdf9e86}", guid, jsonLikeSerializer, evaluationInfo);
}
说明:1.用于解决30天限制问题;2.用来解决安装后,默认不启用试用版证书问题
|