最近学习 Markdown,从网上下载了 Windows 下的编辑器:MarkdownPad。这款软件分为免费版和专业版(收费),

对于普通用户来说免费版已经足够,专业版比免费版多了如下几个功能:

  1. 一切都是无限的

    • 无限量的打开文档
    • 无限量的自定义 CSS 样式表
    • 在专业版中,所有使用限制均被移除
  2. 新的 Markdown 处理器
    • GitHub Flavored Markdown
    • Markdown Extra
  3. 获得新的特性
    • 导出 PDF
    • 内置图片上传器
    • 自动保存
    • Session 管理
    • 可配置的自动更新
    • 提早体验新功能
    • 允许商业使用
    • 更多 ...

其实,对于专业版提供的众多功能我最看重的只有导出 PDF这一项。出于程序员的职业病,我打开了 MarkdownPad 的安装目录,

然后几乎是瞬间就看出来了这是用 C# 写的,因为我看到了 MarkdownPad2.exe.config 这个文件,这是典型的 C# 应用程序的配置文件。

于是,我又抱着试一试的心态用 Reflector 打开了 MarkdownPad2.exe 。不看不知道,一看吓一跳,居然又木有加密,又木有混淆,

这真的让生在天朝的我大开眼界。作为一款收费的商业软件(14.95 USD),居然任何防护措施都木有,这不是存心找死的节奏啊!

后面的事情就很简单了,用 Reflector + Reflexil 修改授权相关代码就可以了,在这里我就不赘述了,

直接给出我修改的地方(有很多地方都可以修改,自己看着办):

  • 命名空间:MarkdownPad2.Licensing.LicenseEngine
    public bool VerifyLicense(string licenseKey, string email)
{
if (string.IsNullOrEmpty(licenseKey) || string.IsNullOrEmpty(email))
{
return false;
}
try
{
this.License = this.Decrypt(licenseKey);
this.LicenseProcessed = true;
}
catch (FormatException exception)
{
_logger.ErrorException("Bad license format", exception);
MessageBoxHelper.ShowWarningMessageBox(LocalizationProvider.GetLocalizedString("License_BadFormat", false, "MarkdownPadStrings") + StringUtilities.GetNewLines(2) + LocalizationProvider.GetLocalizedString("License_PleaseVerify", false, "MarkdownPadStrings"), LocalizationProvider.GetLocalizedString("License_ErrorTitle", false, "MarkdownPadStrings"));
return false;
}
catch (OpenSslException exception2)
{
_logger.ErrorException("Error decrypting license", exception2);
MessageBoxHelper.ShowWarningMessageBox(LocalizationProvider.GetLocalizedString("License_ErrorMessage", false, "MarkdownPadStrings") + StringUtilities.GetNewLines(2) + LocalizationProvider.GetLocalizedString("License_PleaseVerify", false, "MarkdownPadStrings"), LocalizationProvider.GetLocalizedString("License_ErrorTitle", false, "MarkdownPadStrings"));
return false;
}
catch (Exception exception3)
{
_logger.ErrorException("Error processing license: " + licenseKey, exception3);
MessageBoxHelper.ShowErrorMessageBox(LocalizationProvider.GetLocalizedString("License_ErrorMessage", false, "MarkdownPadStrings") + StringUtilities.GetNewLines(2) + LocalizationProvider.GetLocalizedString("License_PleaseVerify", false, "MarkdownPadStrings"), LocalizationProvider.GetLocalizedString("License_ErrorTitle", false, "MarkdownPadStrings"), exception3, "");
return false;
}
if (((this.License == null) || (this.License.Email == null)) || (this.License.Product == null))
{
return false;
}
bool flag = this.License.Email == email;
bool flag2 = this.License.Product == "MarkdownPad2";
return (flag && flag2);
}

这个函数就是用来判断授权是否合法的,只需要让它永远返回 true 就可以了。用 Reflexil 插件将这个函数的 IL 代码修改如下:

ldc.i4.1 // ldc.i4.0 返回 false
ret

上面的 IL 代码就相当于如下一行代码:

return true;

然后,保存修改过的 MarkdownPad2.exe,并替换原来的文件,重启即可。

郑重提示:

以上所述,主要出于研究学习之目的,如果经济条件允许请自己购买正版软件。

MarkdownPad 破解学习的更多相关文章

  1. IOS CrackMe 破解学习

    一直在看别人如何破解一个app,下面自己也尝试着学习怎么去破解一个app的密码,下面是完整的过程. 准备工作: 一台mac或者pc安装了ssh客户端 一台越狱的iphone iphone上安装了ope ...

  2. Android破解学习之路(十四)——【Unity3D】王牌大作战破解

    一.前言 今天带来的是王牌大作战的破解教程,游戏下载的话,我是直接去TapTap官网下载的 支付宝内购破解用老套了,今天学点破解的新花样吧!! 二.支付宝内购破解 支付宝的内购破解已经很熟悉了, 直接 ...

  3. Android破解学习之路(十二)—— GP录像汉化过程及添加布局

    前言 最近闲着发慌,想起了很久之前就想汉化的一款录像APP,APP大小不到1MB,但是好用,本期就给大家带来汉化的基本步骤以及如何在APP中添加我们汉化的信息 汉化思路 查找关键字 关键字挺好找的,由 ...

  4. wpa破解学习实践

    概述: 针对WEP的一些弱点,WPA(WiFi Protected Access)一一改进:

  5. Android破解学习之路(一)——简单的登录破解

    最近突然心血如潮开始学了Android破解,初入门,便是将经验记录下来. 准备工作: 1.一个登录简单APP 在我们破解之前,我们需要做一个简单的登录APP,输入相应的账号与密码便是弹出登录成功的对话 ...

  6. Android破解学习之路(二)——Android游戏 滚动的天空破解

    经过上一期的破解教程,相信大家跟我一样都是对破解是初入门,我们破解的目的是什么? 赚钱吗?百度上一大堆破解版的应用,破解的人有赚到钱吗?实实在在的说,其实也是方便自己而已. 玩个游戏,感觉过不去了,来 ...

  7. Android破解学习之路(三)——Android游戏 切水果破解

    经过前两篇破解教程,想必大家也是明白了破解的简单流程了. 先对APP进行试用,了解APP运行的大概流程,之后从APP中找出关键字(一般的关键字差不多都是支付失败),之后使用Androidkiller进 ...

  8. Android破解学习之路(四)——Android游戏 3D摩托飞车破解

    经过前面三期的破解,想必大家已经非常熟悉破解的流程,这一篇也算是练手项目,我们继续来练习吧 apk下载地址:链接: https://pan.baidu.com/s/1sl3b3R3 密码: 6666 ...

  9. Android破解学习之路(五)——Android游戏 割绳子:魔法 + 在游戏加入Toast弹窗提示

    前言:这一期的破解教程,有新的知识内容出现啦! 这一期破解的游戏是找不到之前的关键字,怎么破解呢? 破解成功之后,添加一个Toast弹窗提示由XX破解,这操作该如何实现呢?请往下看~ 链接: http ...

随机推荐

  1. Hadoop管理员的十个最佳实践

    前言 接触Hadoop有两年的时间了,期间遇到很多的问题,既有经典的NameNode和JobTracker内存溢出故障,也有HDFS存储小文件问题,既有任务调度问题,也有MapReduce性能问题.遇 ...

  2. OpenGL基础渲染

    客户端-服务器 客户端是存储在CPU存储器中的,并且在应用程序中执行(或者驱动程序),驱动程序将渲染命令和数据组合起来,发动到服务器执行.服务器和客户机在功能上是异步的,他们是各自独立的软件模块或者硬 ...

  3. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  4. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  5. SQL创建链接服务器

    二.--创建链接服务器 exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin ...

  6. AbsListView.OnScrollListener 使用注意事项

    这个类没什么特别的,但是使用的时候我确出错了 abstract void onScroll(AbsListView view, int firstVisibleItem, int visibleIte ...

  7. oracle数据导入的常用命令

    oracle 中数据库完全导入导出:cmd命令行模式 oracle数据库cmdfile数据库服务器constraints Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.ex ...

  8. Win8环境下 IIS6部署MVC网站出现的无法显示此网页错误

    在Win7环境下做好的网站,新的Win8环境发布出现如下图错误: 解决方法如下: 运行:

  9. HDU 2795 (线段树 单点更新) Billboard

    h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子. 每次找能放纸条而且是最上面的位置,询问完以后可以同时更新,所以可以把update和query写在同一个函数里. #include ...

  10. iOS NSNotificationCenter(消息机制)

    转自:http://blog.csdn.net/liliangchw/article/details/8276803 对象之间进行通信最基本的方式就是消息传递,在Cocoa中提供Notificatio ...