Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

MarkdownPad 2 Pro 破解记录

$
0
0

为了现在这个破博客,找了一天的win下可视化MD编辑器,终于在知乎提示下找到一个看起来不错的,也就是MarkdownPad。

去官网看了一下,有两个版本。

免费版和收费版相比,没有自动保存,最多只能打开4个文档,而且限制了视图方式等等。

那就开动一下,搞掉他。

0x1 基础分析

首先到软件目录

明显的C#程序


MarkdownPad 2 Pro 破解记录

那接下来就容易了,

Reflector打开分析一下把


MarkdownPad 2 Pro 破解记录

无壳无混淆。

0x2 定位注册算法

定位 MarkdownPad2.Licensing

定位 LicenseEngine.VerifyLicense

publicboolVerifyLicense(stringlicenseKey,stringemail) { if(string.IsNullOrEmpty(licenseKey) ||string.IsNullOrEmpty(email)) { returnfalse; } try { this.License =this.Decrypt(licenseKey); this.LicenseProcessed =true; } catch(FormatException exception) { //...忽略掉 } boolflag =this.License.Email.Equals(email, StringComparison.OrdinalIgnoreCase); boolflag2 =this.License.Product =="MarkdownPad2"; return(flag && flag2); }

解密licenseKey到一个结构体 License

然后比较 License.Product 是否为 “MarkdownPad2”

以及比较 License.Email 是否等于 输入的邮箱地址

细节在 this.Decrypt 里

privateLicenseDecrypt(stringpayload) { RSA rSA = CryptoKey.FromPublicKey("-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqYO2D1DzVA3Q4JXtt0GK\r\nPKzrA1uu8LKU48f/IRI2vH+I81IwIPGQErDT4SNTjSyLIzYAcJnSUpLbUxj2OhFc\r\nrSRK/9e7PffJtus9h/ph8Tma5G4e2f7prNxSBTRqiUghB4ZCPJs2NzTA9Q4Rqqe+\r\n38/2ESGU1G/vOHW71XXKoQkLK8PbU8eRWlCybn5ZElsrCJOlZRdvcmoc/n7IyeBc\r\n2KJyl3BWhkRLcBDV2YAM1VtU0+jw1aCXltTOoVKFamIqcblYt1a9oJbv4+mPcBnJ\r\ny4XwuWSTgdfcLu3e1hLPFpBh9aQsxmqPn2OuxQqfggvLeStwazwNCiXJbSgE6XEr\r\npQIDAQAB\r\n-----END PUBLIC KEY-----","2QJmLPD5ktxIrFkr").GetRSA(); byte[] msg = Convert.FromBase64String(payload); byte[] bytes = rSA.PublicDecrypt(msg, RSA.Padding.PKCS1); stringstr = Encoding.Default.GetString(bytes); IRestResponse response = newRestResponse(); response.Content = str; License license = newJsonDeserializer().Deserialize<License>(response); rSA.Dispose(); returnlicense; }

简单的RSA,

利用的是Openssl.Net的库

对 CryptoKey.FromPublicKey 进行分析发现


MarkdownPad 2 Pro 破解记录

也就是说,程序有两套解密方案

分析定位到 StartupHelper.Check 时确认了这一想法

publicStartupResultCheck(stringkey,stringemail) { Mod mod = newMod(); boolflag =false; try { flag = mod.Verify(key, email); } catch(Exception) { } if(flag) { this._name = mod.Args.Name; this.IsProcessed =true; returnStartupResult.Mod; } LicenseEngine engine = newLicenseEngine(); if(engine.VerifyLicense(key, email)) { this._name = engine.License.Name; this.IsProcessed =true; returnStartupResult.Oem; } returnStartupResult.None; }

利用 mod.Verify 进行第一次认证,如果成功,就成功了

如果不成功就用 LicenseEngine 进行第二次认证

因为 LicenseEngine 是主程序里的模块

而 mod 是 Markdown.Async 中的模块

考虑了一下就去patch Markdown.Async

0x3 替换原程序公钥并写注册机

替换了一原本的公钥字符串到我自己用openssl工具生成的公钥

接下来写Keygen

关键代码:

publicclassLicense { privatestring_Product; privatestring_Name; privateint_LicenseTypeId; privatestring_Email; privateDateTime _CreationDate; publicDateTime CreationDate { get{return_CreationDate; } set{ _CreationDate =value; } } publicstringEmail { get{return_Email; } set{ _Email =value; } } publicintLicenseTypeId { get{return_LicenseTypeId; } set{ _LicenseTypeId =value; } } publicstringName { get{return_Name; } set{ _Name =value; } } publicstringProduct { get{return_Product; } set{ _Product =value; } } } RSA rSA = CryptoKey.FromPrivateKey(newprikey, passcode).GetRSA(); License newLicense = newLicense(); newLicense.Product = "MarkdownPad2"; newLicense.Name = username.Text; newLicense.Email = email.Text; newLicense.CreationDate = DateTime.Now; newLicense.LicenseTypeId = 1; stringencoded =newJsonSerializer().Serialize(newLicense); byte[] encoded_bytes = Encoding.Default.GetBytes(encoded); byte[] encrypted_bytes = rSA.PrivateEncrypt(encoded_bytes, RSA.Padding.PKCS1); stringencrypted = Convert.ToBase64String(encrypted_bytes); regkey.Text = encrypted; 0x4 后记

当然,我现在就是在很愉快的用 MarkdownPad2 Pro 版本在写这篇博客, LOL。

值得一提的是,这款软件对win10的兼容不大好,如果要在win10下使用, 需要自己去更新一下支持库

链接: http://markdownpad.com/download/awesomium_v1.6.6_sdk_win.exe


Viewing all articles
Browse latest Browse all 12749

Trending Articles