ReSharper 以前网上还很容易找到破解补丁,针对新版的补丁已经找不到了,只能自己动手了,其实并不难,和其他用 Java 开发的软件是同一套流程,激活码也是一样的。
离线安装包下载地址:https://www.jetbrains.com/resharper/download/other.html
本次破解的是最新版本 2025.2.2.1:https://download.jetbrains.com/resharper/dotUltimate.2025.2.2.1/JetBrains.dotUltimate.2025.2.2.1.exe
破解证书验证
根据破解 Java 软件的经验,可以大胆推测这个用 C# 开发的插件也是用一样的思路去破解,先解决证书验证问题,可以用 dnSpy 调试JetBrains.Platform.Shell.dll
文件,搜索X509Certificate2
关键字查找软件验证的地方。
根据一顿调试后发现关键的UserLicenseService.DecodeLicense
方法:
1 | public INewLicenseData DecodeLicense(string base64) |
UserLicenseService.VerifyCertificate
是个静态方法,用于验证证书。
1 | public static UserLicenseService.CertificateValidationResult VerifyCertificate(CertificateRevocationList crl, X509Certificate2 primaryCert, bool checkCertificateTimeValidity, params X509Certificate2[] additionalCertificates) |
破解之法就是要让这个方法返回UserLicenseService.CertificateValidationResult.OK
。
一开始我用 dnSpy 直接编辑这个方法,但是修改之后 VS 就无法加载插件了,可能是 .NET 程序集强签名的关键,于是我搜索到了这篇文章:ReSharper破解过程。
这篇文章已经很老了,也能看出来这么些年验证过程基本是没变化的。不过这作者解决强签名问题的办法实在太不优雅了。
制作补丁
以前在某论坛中下载过一个用 VS 插件的破解方式挺开脑洞的,于是我也尝试了下,依然是可行的,思路就是自己开发一个 VS 扩展,用第三方库 hook 去 patch 对应的代码,这样可以做到不修改JetBrains.Platform.Shell.dll
文件,比较优雅。
如何制作 VS 扩展就不展开说了,网上有教程,问问 AI 十分钟就搞定了,在项目中引入Lib.Harmony
库,它是用来 hook 的。
核心代码如下:
1 | using HarmonyLib; |
这个补丁会在VerifyCertificate
返回后执行,如果返回值不是 0(UserLicenseService.CertificateValidationResult.OK)就将返回值改为UserLicenseService.CertificateValidationResult.OK
。
证书验证这一关过了,但是它还会向服务器验证一次
禁止联网验证
搜索字符串License server response
定位到ClientUtil.ExecuteRequest
中
1 | public static TResponse ExecuteRequest<TResponse>(string baseUrl, AbstractRequest<TResponse> request, IWebProxy proxy, [CanBeNull] BlackList blackList, int timeoutInMilliseconds = 0) where TResponse : AbstractResponse |
分析调用栈,发现在UserLicenseViewSubmodel.AddLicense
方法中存在调用UserLicenseViewSubmodel.ValidateLicenseKey
的行为:
1 | public bool AddLicense(UserLicense userLicense, bool doCheckSynchronousely, bool validateLicenseKey = false) |
而AddLicense
的第3个参数正是控制是否联网验证的关键!
继续打补丁:
1 | using HarmonyLib; |
接着只要输入一个合法的激活码就行了(参考之前文章中的 KeyGen)
授权信息:
1 | { |
对应的激活码:
1 | ZCB571FZHV-eyJsaWNlbnNlSWQiOiAiWkNCNTcxRlpIViIsICJsaWNlbnNlZU5hbWUiOiAiamFjayIsICJhc3NpZ25lZU5hbWUiOiAiIiwgImFzc2lnbmVlRW1haWwiOiAiIiwgImxpY2Vuc2VSZXN0cmljdGlvbiI6ICIiLCAiY2hlY2tDb25jdXJyZW50VXNlIjogZmFsc2UsICJwcm9kdWN0cyI6IFt7ImNvZGUiOiAiUlMwIiwgImZhbGxiYWNrRGF0ZSI6ICIyMDk5LTEyLTMxIiwgInBhaWRVcFRvIjogIjIwOTktMTItMzEiLCAiZXh0ZW5kZWQiOiB0cnVlfSwgeyJjb2RlIjogIlJDIiwgImZhbGxiYWNrRGF0ZSI6ICIyMDk5LTEyLTMxIiwgInBhaWRVcFRvIjogIjIwOTktMTItMzEiLCAiZXh0ZW5kZWQiOiB0cnVlfSwgeyJjb2RlIjogIkRDIiwgImZhbGxiYWNrRGF0ZSI6ICIyMDk5LTEyLTMxIiwgInBhaWRVcFRvIjogIjIwOTktMTItMzEiLCAiZXh0ZW5kZWQiOiB0cnVlfSwgeyJjb2RlIjogIkRNIiwgImZhbGxiYWNrRGF0ZSI6ICIyMDk5LTEyLTMxIiwgInBhaWRVcFRvIjogIjIwOTktMTItMzEiLCAiZXh0ZW5kZWQiOiB0cnVlfSwgeyJjb2RlIjogIkRQTiIsICJmYWxsYmFja0RhdGUiOiAiMjA5OS0xMi0zMSIsICJwYWlkVXBUbyI6ICIyMDk5LTEyLTMxIiwgImV4dGVuZGVkIjogdHJ1ZX1dLCAibWV0YWRhdGEiOiAiMDEyMDIyMDcwMVBTQU4wMDAwMDUiLCAiaGFzaCI6ICJUUklBTDotNTk0OTg4MTIyIiwgImdyYWNlUGVyaW9kRGF5cyI6IDcsICJhdXRvUHJvbG9uZ2F0ZWQiOiBmYWxzZSwgImlzQXV0b1Byb2xvbmdhdGVkIjogZmFsc2V9-KI/za46T08By0xh6MGaX5L56KPRS9vs8Qe2Pevsb+KdC143fR1m1RvmYjZzoybCC/7DLcMtm3oaC7H5J3q2YyZq7ew4rq+kxQ9atd3LCoJV7SoTWO28y8WPOFdTImno6LVZ4GhDQuKLkpNSKgLEsvCZq38hw26BKF2Chb4NxJWU/zTv4GZ/FYOrMJGCoSepn7hUZSPSzp/zwseHJoV7PXgpZHVfU5fD2n9r5hPJK7VvI2GDhBtyd/xOKz0b8UPFfKfZP+SFNjeK0yrTseY7Z2BQUsjAg42vsIalCv/1NzxnpYQ4pWq311g7Ys6Azg7Prib+vMUVn7hjGGjhVrCfz2WLl5XEa/4WHdSNoXubWUk6ojv7lCVYNAQaCVMfqxuBhm3l5xWL7UcCn8p7U03ASW7ZqzHisg8wuwNs6kbxZrkUPC3Pf4nFIrs3CqpJ/uHG1DzvsYzx1ja6bIMXJIg4W7SfoeeGWYBrlJyprEaRffWHug9+LA5SV5NitX17pQMvEuSZxPPMjtomEhLrQoy3zmHSyC1edxPKXKISsaSIT0ztoYFF0eAOVHyho/UUDVyDmvh7pmns7yvjZmvWTvMCyuGphDxhJlDUeDKyBOi8R+GH2eSKMuP/uMIwH4bSZoZBpQwl1+sI9cujBm8yXiLuogZUZs3BhO+uibQzf7xNPbRk=-MIIEtTCCAp2gAwIBAgIUG0GuXpVc8FGKPuiRv++SnXTSgkgwDQYJKoZIhvcNAQELBQAwGDEWMBQGA1UEAwwNSmV0UHJvZmlsZSBDQTAeFw0yNTEwMDIyMzQzMzZaFw0zNTEwMDEyMzQzMzZaMBExDzANBgNVBAMMBmFxdGF0YTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJKwfFtvcgxQpGC2fyLObBpPY/mz203moojM/qPlU7GhcdP+sUB/hRnoJ5JYgiUh8JH2OCRvu1ITlek0pGsAhhcppefFxTSZAXrjAD9AArlQI45jLiJE6FzzarVCxLURXbveCLFt2xH4as4xj/dtIIQypzOFj6J4S11giEu3P4UZ7428eLX7junbO9QpAZbSWK6Uws2GrA6AKZsegRPqUE2rCQ8AtMan1IHUpGyxvquTVqwMSUSvEaKbfdAF/qVQ8NQ7oWVj6D8mcnPpZvH+ckyCd3n8020yQU2Xa4ikG3C19leC0UbbaUg+WEIVoTx+fwbr6IdC3NTmZQr9qBthJHuYZ80PNLQT0SCwj4v/IQdpfGhxhVf1FeCvD1trISVZyo1aazuz5zJQUFhw7aOAyiKVTvRDwRb1FJqxuSSZ4+VpOyIF1J2zT5HEu7seHM+a6thGAbb5T3AlgprwX3fHN86IRajsJsobAWsu/1IkvuXc+hSmwAdhvw781bKxTBEHN2k1ScDV5kw/on0YRfbBEaz4262h3IQCnOJZsgUUCNkgB0vUKL54epdLo5i5rHJXO+Q4t/5UZ4/yFMinpI8x95Iv1jIsajq4stbRZzJ1bkVyCYVaamRqQmY9nYow76XiRb4dvwOmgbeEBcppMHCb3z/cWv6MjduuLBwuMcDI5Qu9AgMBAAEwDQYJKoZIhvcNAQELBQADggIBAEdbzeOyZSuaigPxBHWsFGx8WkrqUzqg7FIiHqtC8WZiZJZZmTJ9WUk+ey10YkEfUa/hO3qEKQeEYeW5BVaygtqNQjVjq0++wTCOeyNnmSG6ITxx5VnHqDfMyYRBSSmAlEWWQdDC4cjQuWHCe2pvdzIEZJtvSob7BRTTkDbY7tNNUD8/IsXsEFrmXMNvIOMWKx800rFy1gpJJsTFL+iQDGuWaL94jiFp5ei8+If7sqPditQl6sds7Xm3ksgm2Qs/xJhzJgzwjzkbTNmCszfJHaSjEe31hjfz5lOb7XzUFx8YsSLkRwXesS5o1a3fHqSHszYldAie4lIILm/fZQ3p1yoDIFQgWa12/SLNxE8tCj/hx8N+gJzpEPaQMT89bFuAILf1Py2GC9w92ZTLXnymOKHBZCQkMFzUm2CIhcx/+RlK5Up8EdFvfWBGfDtJr1UjWiF/MDJibZJ/BO1rVdO352p3gcJVgzSwQI6cPWJUxwikYhLNAsVac4bmE9Hm5qR8YWoEHmt0jHIIZjoFiTRaB6XLko53FLV+Ns4EogRXvPk7D0ZLfcDPaXULc0MnGAQS46gvWi176dIs00Lbg1TJIEVtwAERS5r3FyZeDq3xEau8ZebL7xdTWaVfyT6DtaWAMIC3OSXJaSVaQWuDkQ98XsqESvR02+9N98vghpSVVEnR |
其他几个 .NET 软件
上面只是将 VS 插件解决掉了,独立的dotCover
、dotTrace
、dotMemory
软件依然是未授权的,另外一个dotPeek
因为官方将其免费了所以不需要授权。
因为这几款软件不是 VS 插件,且又是 .NET 开发的,所以不能用ja-netfilter
那套去破解。
全盘搜索JetBrains.Platform.Shell.dll
文件,发现其实每个软件下都有一份JetBrains.Platform.Shell.dll
,所以我们需要想办法在软件启动时加载我们的补丁。
查看所有JetBrains.Platform.Shell.dll
文件,都是同样的版本,所以就确定了破解方法和前面的插件一样,不同的是这几个软件是独立运行的,所以要么修改JetBrains.Platform.Shell.dll
,要么通过某种方法劫持打补丁。
第一反应当然是直接用 dnSpy 编辑,但是这样会破坏 DLL 的签名,导致 CLR 拒绝加载,于是我找到了这篇文章《ReSharper破解过程》。
文章中的解决方法是编辑 StrongNameSignatureVerification 的返回值,测试发现行不通了。
这篇文章发布于 2016 年,.NET 也更新了 N 个版本了,至少确定在新的 .NET 中已经不用 StrongNameSignatureVerification
来验证了。
最后在签名这个事情上折腾了很久,最终还是放弃了,编辑文件弊端就是要修改很多文件,兼容性不好不说,升级软件后又要重新编辑一次。
于是我决定从主程序下手,也就是启动的那个 exe 文件,尝试用version.dll
、winmm.dll
、uxtheme.dll
劫持,它都不加载。
最终不得不修改 exe,实行 IAT 劫持:在导入表中增加对自己的 dll 文件的依赖,再通过这个原生 dll 加载自己的 .NET 程序集,再在 .NET 中对JetBrains.Platform.Shell.dll
进行 hook。
具体代码可以参考《ring3注入学习(1)导入表注入》,代码有点小问题,不过能用。
如果连 exe 都不想动,那么可以试试运行时 Patch,这里有几篇文章可以参考:
原理就是写一个启动器,当作是调试器去启动程序。