听鬼哥说故事 发表于 2014-8-18 12:59

听鬼哥说关于个别软件的保护绕过分析

本帖最后由 听鬼哥说故事 于 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,#0BX               LR了解ARM汇编的,很容易看出这个代码意思,将0赋值给R0,然后执行返回方法。所以这里我们需要修改的是将true,也就是1赋值给R0,然后返回。
点击Hex-View查看一下:MovR0,#0   对应的16进制为 00 20 BX   LR       对应的16进制为 70 47
我们简单修改一下,将这四个字节改为 01 20 70 47,然后点击Apply Changes ,(快捷键F2),查看IDA-View 窗口,发现一切正常,那我么就直接操作valid方法去:



如上图所示,我们就修改完了,一切正常,那么我们就记录下内存,movsR0 ,#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掉这个函数,再或者写个注册机,有兴趣的朋友,欢迎继续分析下去,发出来文章分享~
开发做软件不容易,软件原包以及其他东西不再发出,有兴趣的自行研究即可.


如果感觉上述不完善,那么就开始注册方面修改。
动态分析的相关资料也放上,未完成,希望有兴趣的朋友,继续分析下去、





~听鬼哥说故事


淡然出尘 发表于 2014-8-18 13:02

前来支持鬼哥 跟随鬼哥脚步学习哈{:301_997:}

taintitly 发表于 2014-9-4 18:58

听鬼哥说故事 发表于 2014-8-18 19:37
嗯,是的,注册算法那里,使用了几个参数,你看IDA我那个动态调试也可以简单看出。
有输入的注册码,密 ...

signed int __fastcall License::valid(int a1, const char *a2, int a3, int a4, int a5)
{
const char *v5; // r6@1
int v6; // r8@1
int v7; // r1@1
int v8; // r4@1
int v9; // r5@1
int v10; // r7@1
int v11; // r3@2
signed int result; // r0@7
int v13; // r0@9
time_t v14; // r0@12
int v15; // r1@12

v5 = a2;
v6 = a4;
v7 = *(_DWORD *)(a1 + 4);
v8 = *(_DWORD *)a1;
v9 = a1;
v10 = a3;
if ( v7 == *(_DWORD *)a1 )
    return 0;
while ( 1 )
{
    v11 = (*(_BYTE *)(v8 + 25) << 8) | *(_BYTE *)(v8 + 24) | (*(_BYTE *)(v8 + 26) << 16) | (*(_BYTE *)(v8 + 27) << 24);
    if ( v11 == 2 )
      break;
    if ( v11 == 3 )
    {
      v13 = License::checkWMAC(v9, v8 + 33, v6);
      goto LABEL_10;
    }
    if ( v11 == 1 )
    {
      LOBYTE(v13) = License::checkIMEI(v9, (const char *)(v8 + 33), v5);
      goto LABEL_10;
    }
    v8 += 100;
LABEL_6:
    if ( v7 == v8 )
      return 0;
}
v13 = License::checkIMSI(v9, v8 + 33, v10);
LABEL_10:
if ( !v13
    || (v14 = time(0),
      v15 = (*(_BYTE *)(v8 + 10) << 8) | *(_BYTE *)(v8 + 9) | (*(_BYTE *)(v8 + 11) << 16) | (*(_BYTE *)(v8 + 12) << 24),
      !((*(_BYTE *)(v8 + 14) << 8) | *(_BYTE *)(v8 + 13) | (*(_BYTE *)(v8 + 15) << 16) | (*(_BYTE *)(v8 + 16) << 24)))
    && v15 <= v14 )
{
    v7 = *(_DWORD *)(v9 + 4);
    v8 += 100;
    goto LABEL_6;
}
result = 1;
if ( a5 )
    *(_DWORD *)a5 = v15;
return result;
}

羅少 发表于 2014-8-18 13:01

前排顶的楼主!!!!

我是用户 发表于 2014-8-18 13:23

现在android端不用so库,基本上没什么加密可言了。

Tong 发表于 2014-8-18 13:28

好流弊的帖子

索马里的海贼 发表于 2014-8-18 13:32

精华一篇 不错不错,.

1013356744 发表于 2014-8-18 14:52

学习一下

pwelyn 发表于 2014-8-18 15:56

感谢分享,比较详细

小试锋芒 发表于 2014-8-18 16:10

期待鬼神的补充分析,精华奉上!

924410377 发表于 2014-8-18 16:19

谢谢分享,鬼哥v5
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 听鬼哥说关于个别软件的保护绕过分析