吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1846|回复: 9
收起左侧

[.NET逆向] 一款VS的C++代码插件-试用证书分析记录

[复制链接]
WillingIce 发表于 2023-7-29 09:55

最终效果

Pasted image 20230729200040.png

前期准备

下载安装VS2022

下载最新版本的RxShxxpxr C++插件,并安装完成

下载最新版本Dnspy(64位)

背景

  1. 该插件实在好用,但。。。
  2. 网络上找到的资源不能直接使用
    1. 该插件至少在2019.2.3版本以后新增了网络登录验证;
    2. 证书服务的算法有所改变,且证书服务器作者停止更新,或无法找到该资料
    3. 现存补丁不能适应最新版本的
  3. 近期有点时间整理下家用电脑的开发环境

过程

  1. 根据旧版本Patch信息,定位到试用证书的过期验证;System.Boolean JetBrains.Application.License2.Evaluation.EvaluationInfoEx::IsExpired(JetBrains.Application.License2.Evaluation.IEvaluationInfo,JetBrains.Application.License2.ISupportsEvaluation); 但发现存在登录验证,这块的逻辑是根本没走到。无奈用不了,所以接下来的目标是找到在哪里做的账号是否登录的判断
    Pasted image 20230729201218.png

  2. 既然这时的方法重要,说明是核心逻辑,使用“分析”看看都在什么地方使用了;其中Check字样比较突出,打上断点,果然
    Pasted image 20230729202756.png

  3. 本想直接修改这个字段,但修改不了,原因:这是个属性方法,效果同字段,但却是个方法。
    Pasted image 20230729202947.png

  4. 不能修改值,那看看来源是哪?我们打开堆栈,但委托+方法返回值的形式,一时没明白从哪调过来的。且Pair 来自this.AllModel.Value.Entities.WithEvaluationSupport()
    Pasted image 20230729203302.png

  5. 先看this.AllModel从哪来,发现其只存在get,没有set?那值怎么设置的?对了,是直接赋值,但不知为什么,dnspy没搜索到?
    Pasted image 20230729204101.png
    Pasted image 20230729204459.png

  6. 下断查看取值及来源(堆栈),但可惜,此时的Value字段为空。
    Pasted image 20230729204738.png

  7. 经过分析。。,找到添加的入口;
    Pasted image 20230729211215.png

  8. 中间是一段分析。。发现submodule来自这里:this.myLicensedEntities,而这个数据来源如下:
    Pasted image 20230729211726.png

  9. 搞错了,这个里没有重点的IsStart;重新分析!
    Pasted image 20230729212517.png

  10. 断点后,查看堆栈:
    Pasted image 20230729213054.png

  11. 发现LicenseData中的成员myData
    Pasted image 20230729214645.png
    下断后发现,里面有刚才看到的试用版证书的信息。进一步分析来源:
    Pasted image 20230729222511.png
    下图是LoadItems的实现:
    Pasted image 20230729222630.png
    断点调试并观察结果可知后续结论。

    结论

  12. 安装完成后,会生成一个试用证书,由 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) 创建;创建时有两个参数,用于控制是否自动启用,是否记录使用时长;

  13. 检查自动启用逻辑,在System.Collections.Generic.IEnumerable1<JetBrains.Application.License2.Evaluation.IEvaluationInfo> JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::LoadItems()中判断,bool flag = lastRunEvalTechnicalNames.Contains(pair.First.TechnicalName);而TechnicalName经过调试,值为ReSharperCpp,从下图 获得:
    Pasted image 20230729232937.png
    经过调试,该注册表项的值为“{ReSharperCpp}”时,会自动启用;像这样
    Pasted image 20230729233108.png

  14. 证书创建完成后,由System.Void JetBrains.Application.License2.Evaluation.EvaluationInfoPersister::SaveItems(System.Collections.Generic.IEnumerable1<JetBrains.Application.License2.Evaluation.IEvaluationInfo>)方法,保存到注册表;

    方案一

    本想写代码修改dll,但目前没有思路。此方案不用修改dll,仅修改注册表即可。

  15. 使用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}"
  16. 因存在30天限制,需要30天内清除{9656c84c-e0b4-4454-996d-977eabdf9e86}下生成的临时试用证书。如下图所示。
    Pasted image 20230730000338.png

方案二

JetBrains.Platform.Shell.dll打补丁,修改类实现

  1. 修改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;
                }
        }
  2. 修改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.用来解决安装后,默认不启用试用版证书问题

免费评分

参与人数 2威望 +1 吾爱币 +21 热心值 +2 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| WillingIce 发表于 2023-7-30 00:37
算了,补充一句,理论上适用最新版
朱朱你堕落了 发表于 2023-7-31 15:06
sdieedu 发表于 2023-7-31 15:35
有一,为啥还需要2破解?无限试用不可以吗?
ak0000321 发表于 2023-8-1 08:50
无限试用,为啥还需要破解?
 楼主| WillingIce 发表于 2023-8-1 23:06
朱朱你堕落了 发表于 2023-7-31 15:06
这个插件作用是干什么的?

写C++代码时使用的辅助插件,可以快速重构代码,很智能
 楼主| WillingIce 发表于 2023-8-1 23:07
ak0000321 发表于 2023-8-1 08:50
无限试用,为啥还需要破解?

默认情况下不支持试用的,所以需要分析
 楼主| WillingIce 发表于 2023-8-1 23:09
sdieedu 发表于 2023-7-31 15:35
有一,为啥还需要2破解?无限试用不可以吗?

方法一需要至少每30天处理一次,不觉得麻烦的话,没问题的,可以不考虑方案2;
pjy612 发表于 2023-8-2 09:57
记得 好像 还有哪个地方要改一下。。。
当然 可能是 针对 ReShaper C# 版的
试用时间  GetLeftDays 超过 14 天还是 多久 有额外的一个判断。
好像在 CheckLicenseAndFire 里面。
不过 大差不差

PS. 这是直接对VS进行调试的吗?
 楼主| WillingIce 发表于 2023-8-3 00:58
pjy612 发表于 2023-8-2 09:57
记得 好像 还有哪个地方要改一下。。。
当然 可能是 针对 ReShaper C# 版的
试用时间  GetLeftDays 超过  ...

C#版没用过。。
是直接调试VS的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 18:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表