2018年总结——从攻击到防守

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014476720/article/details/85622304

        又一年过了,这一年里学到的东西最多的就是移动安全方面的,从攻击到防守都大概过了一遍。最开始我是从实战中切入的,起因是参加一项某app的安全众测,对其接口分析得到的数据都是加密的,对其app包反编译得到的都是加固后的壳包。心里很不甘心就这样放弃,就网上百度脱壳这方面的知识,因为加固的厂商就那么几个,坚信肯定有很多脱壳的方法的。开始搞这个的时候,我是先接触Xposed框架的,因为这个框架可以脱壳,后来玩着玩着发现这个框架真的很强大,分析app的源码的时候还可以hook相应的方法进行打印输出,也可以动态的修改参数之类的,这个对于分析接口数据,获取加密前的组装内容是有非常大的帮助的,不过玩这个框架的前提是要将手机root的。玩了一段时间发现Xposed有个不好的,就是每次重新安装完插件都要重新启动手机才能生效,这个操作感觉很烦琐。后来知道还有一个神器 (Frida) 比Xposed厉害的,每次修改完插件后又不用重启手机,非常便利,于是我就开始接触Frida了。用Frida脱壳也很方便,不过原理都是跟Xposed的一样的。Frida的厉害之处就是可以hook底层so文件的函数方法和Java层的方法,而Xposed的只能hook到java层的方法。

         以前的app加密算法都是大部分都是放在java层的,现在大部分开发人员都将加密算法放在底层so文件里面了,因为放在Java层的都很容易可以通过分析源码得出用了什么加密算法,而放在so文件的就有点难度,所以现在可能是大家的安全意识都加深了吧。如果是放在so文件里面处理,对于不会IDA的人来说就永远也不会知道用了啥加密算法。鉴于此,我又去了解了一番IDA这个逆向分析的工具。虽然不是很熟练,但是还是可以进行静态和动态分析so文件的,静态分析的话可以得出里面的函数方法,之后可以用Frida进行hook相应函数方法的传入值进行打印输出,动态分析的话可以一步一步调试程序逻辑,及可以查看到相应参数的传递。

         自己毕竟是一个做Android开发的人,又怎么容忍别人这样去分析自己的app。如果自己做加壳,好像又不太现实,毕竟市场上已经有几大厂商做的那么成熟了。更何况你想到的人家也已经想到了,想想还是算了,于是决定换一条路走走,走心理战,就是将自己代码混淆的更难分析。

         开始我的做法是反制Xposed、反制Frida、反制IDA动态调试、反制抓包,反制Frida和反制IDA动态调试共同原理都是监听相应端口,Xposed是反射特征路径及相应属性,反制抓包是监听是否设置代理。上面这些写在java层明显是不行的了,然后我又去温习了一下NDK的开发,虽然之前搞过一下,但是不经常用总会生疏的。开始搞NDK开发的时候,我都是用静态注册jni方法,后来丢进IDA里面一看,方法名都是对应着java层相应文件的,这岂不是很容易给人家提供分析破解的方向,后来就换成了动态注册jni方法了。

动态注册jni的原理其实就是利用反射获取到相应的Class,再将class里面的方法跟jni里面的方法相对应,这个的好处就是方法名可以自己随意写。其实在这里还有一个问题的,如果利用反射的话是需要指明文件的绝对路径,这个如果放进IDA里面一看,是可以很清楚的知道这个路径的,有经验的开发者一看这个路径就大概知道想干嘛了。为了解决这个明文的问题,我的做法是相应的字符串都进行加密后的显示,但是问题来了,解密的步骤又怕耗性能。后来鉴于性能和安全的考虑,就用了一个最简单的加密解密的方法(异或加解密)。综上,就这样一个简简单单的防护盾原型出来了。

         上面都是基本的防护,做完这些之后,我就开始了搞代码混淆的了。首先想到的是Proguard这个大家都知道的混淆工具,其原本混淆后显示的是26个字母的,可是这个细心的去分析的话还是可以搞清楚相应逻辑,后来在四哥的博客里面知道,原来Proguard是开源的,可以自己去下载回来编译,也了解了一些大神的思路,有一个思路挺不错的,就是将混淆用到的字符,都用相似字符。这个放进反编译工具一看,文件名和方法名都差不多的,可以说看得有点眼花缭乱的。还有一位大佬的方法,就是空混淆,这种方法我挺想用的,可惜没有琢磨透,我按照其的方法进行编译,一直报错,有点遗憾。

         上面工具是java的混淆的,so文件的混淆肯定也要搞的,毕竟重要的算法都在里面。So文件的混淆我用的是Ollvm,我的环境搭建在虚拟机里面的Ubantu,搞Ollvm混淆这个东西很苦逼,最后是因为NDK版本的问题,弄了很久才成功编译处理。

         在2018年里,混淆方面的还有一个遗憾,就是没有搞定资源混淆的,网上查询修改aapt源码重新编译出一个aapt处理可以达到目的,可惜一直没有成功,希望在2019年里能够搞定。

         上述是安全方面的总结,接下来是Android开发中的。在2018年里,最开心的是为自己写了一个最实用的工具(便捷U盘),其原理就是在手机上用jetty搭建一个微型服务器而已,在局域网内可以相互传输文件,手机当U盘使用,可以告别忘记拿U盘的苦恼。在开发中也习惯了模块化,对于常用的工具及第三方sdk会习惯性的封装起来,当下个项目需要用到的时候直接导入进去使用,目前封装的模块包有Aspectj(面向切面)权限处理、极光推送sdk包、Rxgalleryfinal图片选择包。

         做开发这么久以来,只要有即时通讯的项目,都是我负责融云的sdk,在2018年的项目里,庆幸的是有加入到新的东西,就是音视频的开发,不过好像也没啥,都是调取融云的sdk,底层的东西人家都是封装好的,只是拿来用就行。我觉得对于融云这个东西,任何人看一下文档都能搞啦,虽然过程会跑多几个坑,但是谁不是从坑里面过来的。

         在分析人家的app的时候,其实也有很多东西可以应用到自己的开发中来,比如说RxJava2+Retrofit2,以前我从来都不用RxJava,看人家写的时候感觉很繁琐,不过当自己真正用到实战中的时候,觉得这个东西还是挺有逻辑性的,代码不会看起来写的很乱。

         好了,先总结到这里了,虽然在2018年里还有很多东西想学,但是还没来的及去学,希望在2019年里都搞定。2019年的重点目标:资源混淆、组件化、插件化、性能优化、空混淆、C++…

 

猜你喜欢

转载自blog.csdn.net/u014476720/article/details/85622304
今日推荐