一、前言
今天的套路和之前不同,因为最近看到了一些零散的知识,我不想一些简单的知识单独写一篇文章,因为我想要的是每篇文章都能让你们看很长时间,这样我一周发一篇才算合理,所以本文就把四个零碎的不太熟知的知识点介绍一下吧:
第一、如何将一号店应用签名爆破
第二、应用启动速度优化方案X2C工具
第三、如何修改Android中的类加载器
第四、如何快速启动Android中的四大组件
二、如何爆破「一号店」应用签名
首先来看一号店的签名爆破功能,为什么会无意中想起来爆破一号店呢?因为之前无意中在小密圈里面有人问过一个问题就是一号店的防Xposed的hook功能很厉害悄无声息的让你的日志无法打印,所以对于这种样本就非常感兴趣就尝试去弄,不过还没弄好但是无意中发现他的签名爆破倒是可以先爆破一下,说起签名爆破大家首先想到的就是我的kstools工具,其实我也是这么想的,不过用了还是不好使,所以就去分析代码,因为二次打包之后启动就闪退,这个问题我之前介绍过,这个一般闪退的话校验代码肯定是在Application中,看这里主要看三部分:静态代码块,attachBaseContext方法,onCreate方法;我们用Jadx打开应用:
attachBaseContext这个方法没啥问题,可以忽略了,接着看onCreate方法:
onCreate方法中有很多逻辑,不过通过分析可疑点都不是校验的地方,大家可以自行点击跟踪查看代码,最后是静态代码块了:
最后看到静态代码块中加载了一个so文件,通过文件名也发现这个地方可疑,而通过上面的排除法,可以非常肯定就是这个模块的校验问题了,同时也告诉大家Xposed的防护也是在这里的,不过这个代码我们不去看,告诉大家一个简单的方法就是尝试先把这个so加载代码注释了,为什么可以这么做呢?因为如果这个so只是单纯的校验安全功能的,而不会影响应用的后续运行逻辑,注释掉肯定是没啥问题的,因为这个也是尝试所以就注释掉,在打包看看效果:
看到了不闪退了,但是有这个提示不过这个不要怕了,这时候再去用kstools一下就好了:
访问的时候都会携带签名信息的,所以看到整个爆破过程非常简单,这里一定要注意先用kstools操作然后在注释那个加载so的代码,因为kstools需要获取原始签名信息的。
总结:以后遇到签名信息先用kstools操作一下,如果不行就去看看程序的入口Application类的三个地方,发现可以代码;不过现在很多都把校验放到so中操作了,所以如果so中的逻辑不影响后续程序运行的逻辑可以直接注释加载逻辑,这样就可以过掉校验逻辑了,比如这里的so中就是校验操作,但是又不会影响后续的逻辑所以可以直接注释!
三、应用启动速度优化布局方案
上面的签名爆破逻辑介绍完了,接下来看第二件事就是应用的启动速度优化问题,这个跨度有点大不过没关系我们能学到东西就好,我们在做应用的时候是非常看重应用的启动速度的问题,这里只是介绍一个点就是如何对界面的加载优化,我们知道现在很多应用的首页都有很多元素而且xml布局非常复杂,这样启动之后系统会加载xml文件,然后解析xml文件最后是通过Class.forName加载控件类,这个过程是很耗时间的,而且元素很多就更加耗时了。有的同学可能会说那很简单就是对于首页直接进行代码布局,这样就好多了,的确优化的最终方案就是代码编写布局的,但是不是我们手动的去编写因为这样手动编写程序猿受不了后面维护的人也受不了。这也是Android中不建议代码布局的原因。那不手动编写该怎么编写呢?这个就是掌阅公司出了一个X2C框架,这个框架其实原理非常简单,在应用编译期会借助注解处理器把系统解析xml等后续的工作提前做了,这样就会自动生成xml中的所有View控件,在应用启动的时候就会先去找代码中已经定义好的控件;这样就会在编译期项目中多了一些中间类文件,这个和项目中的R文件非常类似,所以为了应用包大小以及兼容问题,不会对项目中的所有界面都用这种方式去处理,而是对于一些需要优化启动速度的页面进行处理即可:https://github.com/iReaderAndroid/X2C;
总结:这个框架对于界面复杂的启动逻辑有效果,不是把整个项目都用这种方式处理,那么无形中增加了很多中间类,同时兼容性也不一定好。我们的目的就是为了启动速度优化而已。核心技术就是利用注解处理器在编译期间提前生成控件类。
四、如何修改类的加载器
上面说完了第二件事启动速度优化问题,接着介绍第三件事就是如何修改类加载器,这个问题也是在小密圈里面有人提问如何修改系统的类加载器,因为系统中有一些方法调用会判断是否是系统类加载器加载的类,如果不是调用失败的也是系统为了安全考虑,所以这里我们就来看看如何修改;其实这种操作肯定是在Native层做了,我们通过查看代码art/runtime/mirror/class.h:
这里有一个方法可以设置类加载器,不过接受的是ObjPtr类型,继续查看这个类型,找到一个函数可以把jclass转化成这个类型:
这里有一个ToClass函数可以转换操作,到这里我们就找到了两个关键函数就可以操作了,我们把需要改变类加载器的类传递到Native层的jclass进行转换即可,不过按照国际惯例调用系统函数,肯定需要去看system/lib/libart.so中找到调用函数的导出地址,然后用dlopen和dlsym函数调用即可:
接下来代码就简单了:
然后上层调用即可:
最后打印运行看一下效果:
类加载器的确变成了系统加载器了,这样我们就成功的修改了一个类的加载器为系统的了,那么就解决了小密圈里面的那位同学的问题了,当然这个技术和知识点大家也要记住,因为后面肯定有这需求。
总结:以后记住可以修改类的加载器了,不是用Java方法,而是通过Native层去操作。把自己的类变成系统类来欺骗系统,这样就可以做一些坏事了。
五、如何快速启动组件
好了介绍完了第三件事修改类加载器,接下来在介绍一个黑科技就是如何快速的启动系统组件也就是activity等,这个有的同学好奇了?这个能怎么快呀而且为什么要快呀?这个你记住未来的某一天你肯定有这个需求,所以你就记住这个技术就好了,接下来介绍怎么快,这个当然又要说activity的启动流程了,前面的流程不多说了,直接说重点:
在系统类:frameworks\base\core\java\android\app\ActivityManagerNative.java 代码中看到最终的启动activity需要获取很多消息,那么如果想要加速启动,有一些信息是否可以不用获取呢?进而节约时间,然后我们我们就尝试一个一个参数添加:
只要传递这几个参数就可以启动了,然后我们在用反射获取ActivityManagerNative中的Binder对象用于启动逻辑:
最后直接启动即可:
然后这样就可以比正常快了启动,通过多次测试发现比正常的启动速度快了10ms,有的同学会说就10ms也没什么用呀?其实不然有时候我们做一些事情需要和系统抢时间,手机硬件很好10ms可以做很多事情了,不要小看这10ms哦。
总结:记住这个技术用非正常方式启动组件是为了更快的和系统抢时间,特定需求以后一定会用到。只要比系统的一些逻辑执行快我们可以做一些坏事。
本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去编码美丽小密圈自取,欢迎加入小密圈一起学习探讨技术
六、总结
本文介绍的知识是没有相互关系的,但是都是比较冷的黑科技技术,大家可能看了之后发现并不会用到,但是请记住有这些技术可以做一些事,以后遇到一些问题可以想到这一篇文章即可,感谢小密圈的同学们提的问题,定时会在小密圈里收集问题有空就研究一下自己学习和大家分享,小密圈是一批大神和热爱学习的人聚集地。
《Android应用安全防护和逆向分析》
点击立即购买:京东 天猫
更多内容:点击这里
关注微信公众号,最新技术干货实时推送