记录第一次破解 .NET单行阅读器无限试用
最近在上班摸鱼的时候发现了一个好用的阅读器,他只有一行文字,可以完美的隐藏在屏幕里面,光明正大的摸鱼而不被老板发现。具体效果如下:
但是用了几天之后发现,发现试用天数已经到了,必须要充值才能继续使用。
对于一个刚开始打工的牛马来说,掏钱那是万万不可能的。所以我先尝试在网上寻找有没有“学习版”来使用一下。但是这个软件好像太小众了,52里也没有相关的资源。
然后我就开始琢磨着自己尝试破解一下。首先先跟着论坛里的新手导航帖学习了一下工具的使用,发现通常破解的第一步是要先确定软件是用什么语言编写或用什么软件编译的。
那么我就试着先给这个软件拖到DIE里看一看。
发现他使用了一个叫.NET Framework的库,刚好我在浏览新手导航帖的时候发现有一个Blue大佬的.NET系列教程,于是我就去拜读了一下大佬的第一篇教程。
首先使用NETReflector8软件打开需要破解的阅读器软件。并在搜索栏搜索充值弹窗的字符串,看看能不能从代码上下文找到突破口。
搜索后发现只有一个CheckOverDue的函数里有包含这个字符串,那么点进去看看。
运气很好,一下就找到了控制弹窗出现的逻辑。仔细分析一下这个函数,这个函数的作用是检查用户的试用期限是否到期。
首先将用户的状态与一个叫OverDue的变量进行比较,如果不相等就直接返回true。那跟着看看状态函数和OverDue变量。
可以看到OverDue是一个值为-1的常亮,而状态函数里如果用户的使用时间超过了软件设置的时间,则会使状态等于OverDue,那么在checkOverDue这个函数里的第一个判断语句里,判断的值一定就为False,没有办法到达return true的语句,所以就会进行第二个判断,并弹出需要充值的弹窗。
那么现在问题的关键就已经找到了,只需要使checkOverDue这个函数永远也无法到达第二个判断语句,那么我们就不会再触发充值弹窗了。首先使用reflexil1插件看一下checkOverDue的IL代码。
发现02行代码中,使用bne.un.s来比较status与-1的值,经过网上查阅发现,ben.un.s操作码的作用是如果两个值不相等,则执行后面的语句。
但是前面分析发现现在status的值一定是等于-1的,那是不是意味着,如果我把这个代码的逻辑改为,两个值相等就执行后面的语句,就可以直接返回true,而避开第二个判断语句了?
说干就干,在网上查阅发现beq.s操作码的作用是如果两个值相等,则执行后面的语句,所以可以使用reflexil1插件将02行代码中的ben.un.s操作码改为beq.s操作码。
点击update,再使用reflexil1插件保存后,打开软件试一试。
可以看到现在已经可以成功打开小说阅读了,这次的破解就完成了。
但是后面仔细思考了之后发现,目前改的这个逻辑,只适用于已经到期了的用户。如果是一个新用户,就会出现他明明有试用天数,但是却会弹出充值窗口。
后来发现可以将CheckOverDue函数的逻辑改为,不管怎样,都直接返回true,这样无论是哪一个用户,都可以有无限的试用。
最终CheckOverDue函数修改代码如下,主要是将第00行代码,改为直接用一个ldc.i4.1操作码向栈中存入一个1,也就是true值。
然后将第01行代码改为ret操作码,ret操作码的作用就和return一样,返回一个值。
最后将第02行代码删除,保存后即可成功破解。
原文件和破解文件如下:
隐蔽性似乎强于thief 状态与一个叫OverDue的变量进行比较,如果不相等就直接返回true。那跟着看看状态函数和OverDue变量。
既然这样?为嘛部直接一字节修改“!=”为“=”达到破解目的? 感谢分享,学习一下 这个阅读器简直是摸鱼神器 学习一哈,软件看着不错 感谢分享,受教了。 {:301_997:}{:301_997:}感谢分享 感谢分享! 厉害,学习到了。 单行阅读,像我一目十行这种,不知道读起来会不会觉得慢