总结下近一年的学习经历,以中国的新年为节点。时间从2015年年后到今天,2015年年末。
首先我必须要感谢前辈的书籍和高质量的博客。
1、重新学习了一遍《Linux内核源代码情景分析上下册》,毛德操著,并记录学习历程,写下了博客。
2、重新学习了一遍《Android系统源代码情景分析》,罗升阳著,并记录从开机启动到Home界面的展示整个流程。
3、学习了一个小型java虚拟机的源代码,并调试修改源代码中的错误,最后可以运行了。参考链接https://github.com/cloudsec/ajvm。
4、学习了Dalvik虚拟机的工作原理,参考的博客是老罗写的,列出来:
还有就是邓老师最近写的深入理解Dalvik虚拟机,在看邓老师的文章前,最好先看老罗的文章,老罗的文章具有系统性,邓老师的文章是看完虚拟机的总结,直接看邓老师的不容易看懂。
为了看懂Dalvik虚拟机,最好理解java虚拟机,不过市面上讲java虚拟机的几乎都不涉及源码,没有什么用,所以推荐大家去看看上面github实现的小型jvm,对应解释代码的博客请参考http://club.alibabatech.org/article_detail.htm?articleId=6。
我的学习思路就是多看源码,少看理论,这可能是低手学习的比较好的途径,高手一般愿意看理论,看理论的时候代码就已经在心里生成了。
5、学习Android安全,并已经写下了几篇文章,涉及到Android安全机制,反编译等。
6、下面要说重点了,从十一后就没有更新博客,这段时间我一直在研究Android安全,我打算接下来的三个礼拜把近期研究的成果分享出来。现在简单的梳理一下,方便后续写博客。
以下每个标题都会独立写成博客。所有博客都会给出源代码。
Android逆向分析
0x00
研究了Android加固的原理,网上大多只给多了源码,参考Android中的Apk的加固(加壳)原理解析和实现,但没有说明为什么,我从系统的源码的角度来分析目前常用加壳脱壳的原理,使用Android2.3源码。
0x01
我们在分析阿里壳子的时候,发现脱壳根本不涉及java层的代码,可见核心脱壳的程序写在了native层。这篇博客中我会把所有的脱壳程序通过JNI移到native层,并在Android2.3的模拟机上运行成功,并会公开源代码。
0x02
讲解DexClassLoader、PathClassLoader原理,adb install和开机自动时加载dex,都是通过PathClassLoader。而动态加壳脱壳则使用的是DexClassLoader。
讲解上面的整个流程,包括优化dex。简单的脱壳都是在dvmDexFileOpenPartial下断点,结合下面一篇文章你就能明白为什么要在这个函数下断点。
0x03
讲解dex文件优化,dex文件解析为DexFile,运行时加载数据为ClassObject到最后运行的流程。基于Android2.3源码进行讲解。
0x04
讲解Davlik虚拟机运行时篡改字节码,参考apk自我保护的一种实现方式——运行时自篡改dalvik指令。
0x05
阿里的壳子会用一种技巧导致反编译dex,看到的方法都被替换为throw exception(),这是怎么做到的,运行时又是怎么样动态修复的呢?在这篇文章中,我会抛砖引玉,把其中一个方法修改为throw exception(),并且在运行时动态修复。当然所有的代码都会放在github上。
0x06
讲解一个开源的脱壳机,DexHunter,参考从Android运行时出发,打造我们的脱壳神器。进一步理解Dalvik虚拟机执行流程。其实就是一张图:
0x07
使用ida静态和动态调试so,网上有很多这样的文章,为了在init_array下断点,每个人都不一样,其中最有效率的一个是安卓动态调试七种武器之孔雀翎-ida-pro,除了分析动态调试so,还要分析so调用函数的堆栈,方便看懂so的arm汇编语言。
0x08
讲解常用的native反调试的方法,并且讲解如何通过修改so来过掉这些反调试。
0x09
使用ida动态调试dex的smali源码,有两种方式,一种是反编译apk + eclipse中调试smali,一种是直接使用ida调用dex。
0x0a
讲解常用的防反编译的方式,比如通过验证签名,验证是否运行在虚拟机中等方式。这部分代码可能在java层,也可能在native层。
0x0b
讲解通过smali注入log或者注入方法的调用栈,来动态分析程序的运行。
0x0c
讲解so加壳,一是对section加壳,一个是对函数加壳。参考Android逆向之旅---基于对so中的section加密技术实现so加固,Android逆向之旅---基于对so中的函数加密技术实现so加固。
0x0d
讲解so注入和c/c++利用GOT表进行hook。参考Android中的so注入(inject)和挂钩(hook) - For both x86 and arm。
0x0e
讲解dex注入,参考dex注入实现详解。
0x0f
讲解java拦截技术,最简单的拦截就是替换,在加壳脱壳程序中我们已经看到了。还有一种方式是通过Dalvik虚拟机的方式,如果我们能把一个Java函数修改为Native函数,并且将nativeFunc指针设置为自定义的函数,那么就可以实现拦截了,参考注入安卓进程,并hook java世界的方法。
0x10
讲解从system.loadlibrary到执行init_array的流程。
Android APP漏洞挖掘
组件公开安全漏洞
Content Provider文件目录遍历漏洞
AndroidManifest.xml配置安全检测
Intent劫持风险安全检测
数据存储安全检测
WebView高危接口安全检测:webview高危接口漏洞,有漏洞利用代码和详细的讲解。
拒绝服务攻击安全检测
WebView明文存储密码漏洞
随机数生成函数使用错误
WebView不检验证书漏洞
中间人攻击漏洞: 有漏洞代码和详细的讲解。
从sdcard加载dex漏洞
Activity被劫持风险
file跨域访问:webview跨域访问访问文件,有漏洞利用代码和详细的讲解。
端口开发:主要分析Baidu地图和高德地图,并有漏洞利用代码,展示实际的效果。并且通过反编译smali分析了为什么漏洞利用代码要这么写。
明文存储,明文传输
Android系统漏洞
0x00
讲解了Linux下ROP,参考一步一步学ROP之linux_x86篇。
0x01
讲解了android下ROP,DEP,ASLR,Information Leak,参考一步一步学rop之android-arm-32位篇。
0x02
讲解了cve-2014-7911,讲解了Dalvik-Heap Spray,C++反编译后代码的利用,参考Cve-2014-7911安卓提权漏洞分析,再论CVE-2014-7911安卓序列化漏洞。
0x03
讲解部分Android Libcutils库中整数溢出导致的堆破坏漏洞的发现与利用,漏洞利用代码比较复杂,只讲解其中一部分。
实际的博客可能还有出入,我也在学习中,欢迎交流,每条回复我都会认真回。