为了现在这个破博客,找了一天的win下可视化MD编辑器,终于在知乎提示下找到一个看起来不错的,也就是MarkdownPad。
去官网看了一下,有两个版本。
免费版和收费版相比,没有自动保存,最多只能打开4个文档,而且限制了视图方式等等。
那就开动一下,搞掉他。
0x1 基础分析首先到软件目录
明显的C#程序
那接下来就容易了,
Reflector打开分析一下把
无壳无混淆。
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 进行分析发现
也就是说,程序有两套解密方案
分析定位到 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