本帖最后由 听鬼哥说故事 于 2014-8-28 18:01 编辑
软件介绍:跟电脑上面的按键精灵类似 目的:免费使用 软件地址:自己搜索即可,去官网下
第一步:分析软件的相关功能
通过简单使用软件,可以得到以下几点: 1.软件未注册版本只能使用30分钟; 2.可以通过注册码,注册文件两种方式注册; 3.原包正常可用,除使用时间限制外其他功能正常
第二步:猜测可用突破点1.根据提示可使用30分钟进行突破 在res/values.xml中发现相关内容”toast_tryTime”,表示我们可以这样做. 2.分析注册码相关使用算法,写出相关注册机代码 在lib/libjni.so中发现相关注册算法,这样方式可用. 其实到这里先简单说一下,如果上面两种方式可用,那么就很简单,此文也就不必写出的,所以有耐心的同学继续往下看,这里写我的分析过程,方便同学们以后遇到软件的思路拓展。
第三步:开始尝试我们先进行简单的,去根据限制时间的提示寻找上下文内容。
通过相关搜索,可以看到只有一个gt.smali文件。 下面已经对这个字符串使用的上下文写了注释,直接参考一下即可。
注释已经很详细了,最简单的,我们直接修改那个判断if-nez改为if-eqz即可。或者可以根据这个判断的含义,在if-nez上面写上一句 const/4 v0, 0x1 ,不等于0则跳,我们写做1,肯定直接跳到下面的执行流程上,而不执行提示使用限制时间。
好了,我们重新打包,运行测试。。。。
然后运行我们刚才录制的一段脚本,然后提示如上图所示。 前面两步测试已经说过,软件所有功能都正常使用,所以这里有错误提示,那么我们就继续跟进错误查看。 Unicode编码一下,继续搜索:有两个文件都存在,这里只列举一个
相关代码已经注释清楚,这里我们还按照简单的思路走,修改if的判断,(搜索出来的文件,都修改下)然后重新打包,继续运行。。。
又提示其他错误了。。。
然后又是一段漫长的过程,追踪代码,然后到最终无果。。。
到了这里,我们就应该思考,软件是不是有其他验证,否则的话,我们上面的修改就已经起作用了。
第四步:再次思考通过上面的尝试,我们猜测到软件有防护,所以我们从注册方面入手,查看smali中注册的相关内容,第三步中,已经发现那个a()方法是注册成功与否的标志,那么我们跟进。
看到上图的注释,我们可以了解,这里是通过检测本地的一个文件,取出三个数值,来调用valid方法判断软件是否注册,这三个字符串具体的含义,我们稍后分析。
从这里,我们则继续看valid方法,那个是主要判断注册成功与否的方法。
看到这里,我们就有眉目了,是调用的so 里面的算法了,那么我们就挂起IDA来继续分析,同时,如果核心代码在so里面,那么我们只修改so而可以不用对dex进行任何操作,所以这里我们可以先观察看看,排除此软件的验证是对dex的。
说起来修改so,有难的,有简单的,这里我们是通过java代码跟进,所以知道这里这个方法的返回值是布尔类型的,所以,最简单的方法,不外于直接返回数值true。
查看一下上下文,发现有这个,名称简单猜测,是打开调试Log的信息,这里,我们需要的是他的代码,即
Movs r0,#0 BX LR 了解ARM汇编的,很容易看出这个代码意思,将0赋值给R0,然后执行返回方法。 所以这里我们需要修改的是将true,也就是1赋值给R0,然后返回。
点击Hex-View查看一下: Mov R0, #0 对应的16进制为 00 20 BX LR 对应的16进制为 70 47
我们简单修改一下,将这四个字节改为 01 20 70 47,然后点击Apply Changes ,(快捷键F2),查看IDA-View 窗口,发现一切正常,那我么就直接操作valid方法去:
如上图所示,我们就修改完了,一切正常,那么我们就记录下内存,movs R0 ,#1的地址,然后用010Editor之类工具跳转到对应地址,修改为上面所述4个字节,好了,这样起码我们没有对dex进行任何操作,那么如果此软件是对dex进行验证的话,那么我们就可以直接绕过了。
注明:不熟悉 ARM语法的直接找找资料看即可,网上很多,上面的修改是为了方便叙述介绍其他地方引用相关指令来直接修改,熟练掌握arm汇编,自己计算即可。所以这里不必问如果此so没有类似指令,是不是就不能破解了这类问题了。
我们使用zip打开apk包,替换掉lib/libjni.so , 然后签名重新运行。
再次运行后,我们发现软件已经注册成功:
但是在播放脚本的时候,还是出错,错误又回到了我们最初修改dex时候的。
好吧,到这里再做一步,对软件原包进行重新签名,安装运行。。。
一样的错误,所以,现在我们应该确定是签名或者md5类的验证了。
大致浏览了下smali和so,都没发现验证,功力太低,没办法。。
那么我们就继续想其他方法吧
第五步:打坐思考
经过了上面一系列的操作和尝试,我们现在应该静下心来思考一下了。。。
目前我们还可使用的方法如下: 1.分析注册算法 2.不操作原包的情况下修改,即hook方面的
跟进valid方法,就可以追寻到注册算法相关内容了,我动态调试了下:
相关参数之类的,看着不是太难,不过本身我C++方面能力比较差,从恢复重写算法来说难度还是比较大,所以也先放弃了这个方法。
然后我们就想hook方面的东西吧,反正注册成功与否的判断方法我们有了,那么接下来操作就应该比较简单了。。。
话说,手里的hook代码还有很多bug,时灵时不灵的,于是向朋友求助索取了一份hook代码,目前还没看完,所以这里先不用hook的方法,等我分析完毕之后,重新补充下。。。
此软件的使用,必须是root情况下的,所以手机肯定必须得root,那么,我们有root,又是本地使用的,何必再多费心思呢。
于是shell下进入data/data/net.aisence.Touchelper/lib下面
权限之类的记得修改
现在大家就知道要做什么操作了,我们直接rm libjni.so文件,然后将上述第四步修改完毕的so直接替换一下不就行了。
然后重新打包,运行,播放一个脚本,没限制时间提示,打开注册状态页面,显示已经注册。。。
通过上述操作,我们已经可以正常使用此软件了,那么,软件是不是每一次都会重新还原覆盖lib这个文件夹呢?
其实,测试不测试,都没啥太大效果了,因为我们必须有root权限的,如果会还原那么现在我们还没使用hook方式的时候,我们直接重新写个apk来操作lib文件夹下libjni.so的替换不就是了,权限够大,没啥事的,就是每次使用麻烦一点而已。
或者,可以直接写个apk来启动触摸精灵,然后启动软件几秒钟后,替换那个文件。。
第六步:更好方式的破解
看到这里,相信大家对上述的操作都有了了解,上文都是采用比较简单的方式来破解的,但是还有更好的方法破解,因为时间和技术问题,上文没有对那些方法进行继续分析使用,例如直接hook掉这个函数,再或者写个注册机,有兴趣的朋友,欢迎继续分析下去,发出来文章分享~
开发做软件不容易,软件原包以及其他东西不再发出,有兴趣的自行研究即可.
如果感觉上述不完善,那么就开始注册方面修改。
动态分析的相关资料也放上,未完成,希望有兴趣的朋友,继续分析下去、
~听鬼哥说故事
|