当前位置:首页 > 宅科技 > 正文

.Net逆向实战 —— MarkdownPad2 的爆破与注册机制作(一)

这个软件是在吾爱论坛看到的,楼主直接给了注册机,但过程怎么分析的,写的并不是很详细,所以我分两节课来说明一下具体操作。

第一节课是直接爆破,第二节课是写注册机。

第一步:查壳

MarkdownPad2 ,百度能搜到安装包,下载后安装软件,然后用 DIE 进行查壳,就是我下图这个软件,搜下名字自己下载。这是做逆向的第一步,管他三七二十一,上手先查一下什么壳,关于一些壳的处理方法,用 de4dot 啊啥的,我会在以后遇到较好的案例的时候再写文章。因为我自己也是初学,所以我倒觉得我的思路比较适合作为新手入门的学习。

如图,Library 那一行(hang),可以看到是用 .Net 所开发的程序,没有壳。那么新手咋知道这玩意儿没壳呢,又没见过这么多的玩意儿?你去把检测到的这个列表的第一行,比如此行(hang)为 .Net (不算后面括号的内容),百度一下,如下:

是吧,啥都一清二楚了……

第二步:反编译

新手其实对这个概念是比较模糊的,什么是反编译?像这些问题,我希望你去百度,这样更能强化你的映象,加强你的理解。举个例子:

你问我什么是反编译?我会回答你,把exe还原成代码就是在反编译。

可如果你百度的话——

你一看就懂了,哦,我们开发软件的时候,源码经过编译这种方式变成可执行文件(exe),反编译就是逆过程,将exe还原到源码了~

当你看的多了你就发现,不是每一种语言都像 .Net 这样,可以直接Get到源码便于理解的,此事暂且不提。

那我们对 .Net 所采用的反编译软件,通常有 .Net Reflector 和 dnSpy 两种,我建议你两种都去了解下对比下,看看你更适合哪个软件。不过现在大多数朋友都用的是 dnSpy ,所以本案例中我使用dnSpy 进行演示。

dnSpy 可以在https://github.com/0xd4d/dnSpy/releases/ 进行下载,写此文的时候版本为6.0.3,需要注意的是这个版本早已经不支持 xp 了,你可以网上去搜最后一版支持 xp 的 dnSpy ,我这里只是提醒一下。

解压你下载的 dnSpy ,你可以在目录里看到我标出来的这两个文件:

第一个是用来加载64位程序的,第二个则是用来加载32位程序的,那你要问我怎么去判断这个程序是多少位?你先别急,请继续往下看。

在反编译前,我们需要保存一个备份,以防止我们修改错误导致软件无法正常工作等意外情况时可以自救。

嗯,简单的复制一个即可。

接着让我们打开 dnSpy-x86.exe ,将 MarkdownPad2.exe 拖拽进去。你会得到这样一个界面:

看到菜单上那个绿色的启动图标了么,点一下他会弹出来:

中断于,选择不中断。至于不中断是什么意思,先不要管。以后就懂了。

那么这里的话,加入你是用 dnSpy.exe 去运行,则它会抛出这个提示。同理,一个64位的程序你用32位的 dnSpy 去调试,他也会给你这个提示。

好,继续,点击OK,让他不中断的运行。就可以看到他启动并且到了软件主界面。

假如你的 MarkdownPad2 软件界面不是中文,你可以点击Tools->Options->Editor->Languages->Application Language,点击下拉菜单,选择中文(中国)

点击  帮助->升级到 MarkdownPad 专业版->输入密钥,它会弹出注册窗口

输入授权信息?随便输入,以便让他的确定按钮亮起来。

点击确定,我们发现他有一个弹窗出现,这时候我们不用点确定,直接在 dnSpy 里点击蓝色的全部中断按钮

点击调用堆栈选项卡,接下来我们看看下图中我圈起来三处位置。

    1. 第一处表明我们的程序,执行到了代码的这一行;
    2. 第二处是调用堆栈选项卡的界面,其表明程序是调用了哪些函数才到达了圈起来的第一处,而我圈起来的部分需要注意一下,这些是系统的dll,一般来说名称里都有写Windows、System等字样,以及其路径在系统盘等一些特征可以供我们判断。假如我们爆破的时候修改了系统dll的逻辑,你离重装系统的日子或许就不远了;
    3. 第三处是指明调用堆栈选项卡的位置的,假如你没有这个选项卡,你可以在 dnSpy 的调试->窗口->调用堆栈(快捷键Ctrl+Alt+C)中打开。

我们这样想,为什么会有这个弹窗呢?我们做了什么让他有这个弹窗了?

答案:我们点击了一个按钮,软件判断了下我们输入的信息不正确,所以弹窗了。

那我们就应该在调用堆栈里去找,是在哪里进行的判断,才让我们的“激活码”不能正常使用。

在调用堆栈中,我们找到了这么一行,在这一行的上面,可以看到是 ShowWarningMessageBox ,翻译成汉语就是显示警告信息框???在这一行下面,是 Check ,翻译成汉语是检查???

那么这一行是啥呢?我们起了疑心,点击蓝框部分跟进看一下。

我们一起看一下这个函数的判断逻辑,从42行起。

  1. 首先他接收两个字符串参数,licenseKey 和 email ;
  2. 在44行它判断了下这两个参数是不是空的;
  3. 在48行它尝试去解密 licenseKey 参数,假如解密失败了,会抛出错误到53-70行,如果解密成功,它会将 LicenseProcessed 设置为ture
  4. 然后他会执行71行的判断,看解密出来的 License 、 License.email 、 License.Product 是不是为空
  5. 如果不是空的,他还会判断一次看 Email 的格式和Product是不是为 MarkdownPad2

因为本课讲的是爆破,所以我就不跟入50行的解密去分析授权密钥算法了,直接演示爆破。

第三步:修改&爆破

我刚说了,它会尝试解密 licenseKey 参数,解密失败会抛出错误。那么为了让他不抛出错误,我们直接将50行送去喂狗,不让他进行解密。

在第50行右键,选择编辑方法,将50行注释,.Net 的单行注释方法为要注释的部分前面加 // 如下图

点击编译,原本的第50行不见了。

为了验证我们的这个修改是不是有效果,我们需要点击 dnSpy 菜单上的红色停止按钮,然后选择文件->全部保存,这里注意,如果在文件名这个编辑框里出现的内容是系统文件夹,那你可能就修改了系统文件,千万不要保存……否则你电脑上很多软件可能要罢工了。

点击确定,让我们修改的文件保存到本地。

接着我们不需要去安装路径找你保存的文件,直接在 dnSpy 的菜单栏上点绿色的运行图标,让我们修改后的程序运行起来。

我再一次输入了一组注册信息,发现还是有问题:

???是我们修改的有问题吗?

我们保持这个弹窗不要关闭,点击全部中断,在调用堆栈里找到这个报错的来源:

初一看是一样的,但跟进去发现并不是同一个函数。

这个报错是由于86行产生的,我们看下这个函数的判断。

84行,检查了 xxxx 是不是为 StartupResult.None ???

StartupResult.None 是个什么鬼???

点击 StartupResult ,跟进去看一下

我们发现他有三个值,None,Mod,Oem???这是干啥的QAQ

既然我们不知道他是干啥的,不妨改一下84行的判断,右键编辑方法。

我选择了将29行-33行的判断直接注释,.Net 中注释多行的方法为 /*  要注释的部分 */

编译一下,为了验证我们的修改是不是有效,我们点击红色的停止,然后保存一下。

然后老规矩,启动,去注册一下看看:

嗯,恭喜你搞定~

个鬼!!!

你会发现功能其实并没有解锁。

点击文件->导出->导出为PDF,弹出如上提示。

老规矩,点击全部中断。调用堆栈去找他。

跟进去看看

报错来源于第25行,我们发现这货又在判断StartupResult.None

这就说明我们刚才那个注释了一大堆的做法是比较愚蠢的,因为这导致我们可能要修改多个判断 StartupResult.None 的地方。

点击编辑->撤销,这个操作会还原我们上一次做的修改,如果你现在保存文件的话,你的版本将会还原到我们第一次修改后的状态。

我们再来研究下我们第二次修改的时候计划注释的这段代码,

84行, Check 了 LicenseKey 和 LicenseEmail ,那跟进Check去看看

两个 string 参数,然后做了什么乱七八糟的判断,最后有三种返回结果。那我们直接在61行右键,编辑方法,将其改成:

return StartupResult.Oem; 或者 return StartupResult.Mod;

保存结果,重新注册看看。

功能看起来是全部解锁了。

关于我是用了注释而不是直接删除相关代码:

被注释的部分不会在代码中起功能作用。我认为注释是一个很好的习惯,我在写代码的时候通常将我的变动进行注释,以便我知道我在什么时候将什么功能更改为什么。并且适当的注释会让我的代码思路变得清晰,让人一目了然。那么在 dnSpy 中的注释, dnSpy 会直接删除,我为什么要用注释呢?

  1. 为了更清晰的看到括号的闭合
  2. 为了防止误删变量的调用

当然每个人有不同的习惯,但新手我劝你善良,省得代码改的不知道哪里出的问题。


 

软件无法下载/安装/其它电脑问题,加免费QQ群(500人):949039296

文章标题:.Net逆向实战 —— MarkdownPad2 的爆破与注册机制作(一)
本文作者:慕若曦
发表日期:2019-02-2 10:46 星期六    首发于    暮若夕
本文固定链接: https://www.muruoxi.com/3682.html
 
文章标签:
上一篇: 下一篇:

3 条评论

评论加载中...
  1. 板凳
    小飞雪   

    其实在第一处理时,你就说了75和76行的判断了email和product,这个判断必然是验证激活码的,所以一定要处理,再看flag和flag2都是Boolean值,所以直接把两个赋值为true,这样应该不会出现你后面的问题。(根据你后面截图,其实flag和flag2应该只要一个为true就行,但是一开始改两个应该也没问题。)这些都没验证,博主看看是不是这么回事?感谢博主分享分析方法

    2019年2月4日 下午7:27 评论
    • 慕若曦   

      嗯,第一处可以这样,但第三处提到的地方还需要再处理,属于二次检验机制。

      2019年2月4日 下午11:11 评论
  2. 沙发
    姜辰   

    邮箱:Soar360@live.com

    密钥:GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6bnxn2kSE8qHqNY5QaaRxmO3YSMHxlv2EYpjdwLcPwfeTG7kUdnhKE0vVy4RidP6Y2wZ0q74f47fzsZo45JE2hfQBFi2O9Jldjp1mW8HUpTtLA2a5

    貌似这个一直都可以用。另外感觉大佬思路真心不错,向大佬低头。

    2019年2月3日 下午6:54 评论

发表评论

╮( ̄▽ ̄)╭ |  (= ̄ω ̄=) |  (>﹏<) |  Σ( ° △ °|||)︴ |  Σ(っ °Д °;)っ |  X﹏X |  (╯-_-)╯╧╧

小提示:提交评论后刷新本页面即可看到隐藏的文件哦~
十年之约
加载中……