Android安全之旅系列博客导读

总结下近一年的学习经历,以中国的新年为节点。时间从2015年年后到今天,2015年年末。

首先我必须要感谢前辈的书籍和高质量的博客。

1、重新学习了一遍《Linux内核源代码情景分析上下册》,毛德操著,并记录学习历程,写下了博客。

2、重新学习了一遍《Android系统源代码情景分析》,罗升阳著,并记录从开机启动到Home界面的展示整个流程。

3、学习了一个小型java虚拟机的源代码,并调试修改源代码中的错误,最后可以运行了。参考链接https://github.com/cloudsec/ajvm

4、学习了Dalvik虚拟机的工作原理,参考的博客是老罗写的,列出来:

1)Dalvik虚拟机简要介绍和学习计划

2)Dalvik虚拟机的启动过程分析

3)Dalvik虚拟机的运行过程分析

4)Dalvik虚拟机JNI方法的注册过程分析

5)Dalvik虚拟机进程和线程的创建过程分析

6)Dalvik虚拟机垃圾收集机制简要介绍和学习计划

7)Dalvik虚拟机Java堆创建过程分析

8)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库中整数溢出导致的堆破坏漏洞的发现与利用,漏洞利用代码比较复杂,只讲解其中一部分。

实际的博客可能还有出入,我也在学习中,欢迎交流,每条回复我都会认真回。

时间: 2024-10-12 02:20:33

Android安全之旅系列博客导读的相关文章

nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 .而近期会加入的文章将主要是算法和Android.只是其他内容也会继续完好. About the Author 独立 Windows App 和

Android系列博客撰写计划

Android系列博客撰写计划 Hello,各位博友,大家好!小巫好久没写博客,由于工作的原因没有太多时间来把自己的开发经验总结出来,根据以往的博客,博文的发布都是没啥规律的,也没有定任何计划说要写一系列的博文,比较散乱.最近我自己也想了一下,改变以往博客的写法,少些一些功能性的博文,而多写一些架构性或者解决方案的博文,以方便广大初学者能更快的掌握重要的点,而不是盲目的去解决一个一个功能点,而没有形成一个整体的思想.以后的博文将会以我个人学习大牛的经验和我个人的经验来呈现给大家,我也希望通过这种

android开源应用(主要是博客上带有分析的)收集 【持续更新】

2014.5.24更新: (android高仿系列)今日头条    http://blog.csdn.net/vipzjyno1/article/details/26514543 CSDN Android客户端的制作    http://blog.csdn.net/lmj623565791/article/details/26676137 LookAround开元之旅         http://blog.csdn.net/lancees/article/details/17696805 如果

Flutter 即学即用系列博客——04 Flutter UI 初窥

前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutter 的 UI. 前言 说到 UI,我就简单说下 Flutter 作为一门跨平台语言具有的优势之一,提高效率吧. 举个例子: 假设现在要开发一个界面,Android 开发需要一天,iOS 开发也需要一天.那么就是两天. 如果你用 Flutter 开发,就只需要一天(因为 Android 和 iOS 都

窥探Swift系列博客说明及其Swift版本间更新

Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift书籍是1.0版本,所以上面一些东西并不在适用.虽然Swift语言仍在更新,但是其整体的基础框架已经形成,大的改动应该不会有,版本的更新更多的是语言新功能的添加和完善,所以并不用担心现在学的Swift会过时.更新也就是在原有的基础上去更新,所以学学Swift还是很有必要的.新的Swift版本中引入了好

关于算法导论系列博客的说明

本系列博客主要为练习<算法导论(第三版)>的记录.发表目的在于希望通过大家的帮助,不断地改进程序,使其在时间和空间方面效率不断提高.由于水平有限,错误在所难免.但是,我一定尽力消除.另外, 欢迎大家指出错误,提出宝贵的建议,感谢大家的指点和帮助. 特别注明: 你们的评论对我是一种莫大的鼓励,哪怕一个字也好,万分感谢. 在开始之前,对各练习的程序作出统一说明,以后不再重复. 一  程序一般用C语言写,编译为GCC. 二   程序一般为子程序的形式,不提供调用主程序,只完成要求的功能. 三   不

Linux系列博客开篇

自从决定做开发,已经好久没有配置过Linux系统了.再不尝试着写一下博客,可能真的要还给老师了.本着一边复习,一边记录的原则,将一些Linux的配置和维护记录在此,不要贻笑大方才好. 为了完成接下来的这些博客,我可能会参考众多前辈的文章,我会尽量留下参考的出处,但是要是因为某些原因未能留下出处,还请原作者见谅.您可以联系我,我将及时改正. 按照我的计划,我会从Linux的安装.基本配置.常用命令开始,一直写到各种网络服务以及Linux存储集群.数据库集群等.基本思路按照尚观主机班的培训思路,不过

MVC系列博客之排球计分(一)需求分析

项目简介: 这是MVC系列博客之排球计分程序,该程序可以是对教练或者裁判使用的,让教练有权限对队员进行查询得分情况,让教练对队员的优势劣势进行了解,以便对队伍进行调整. 让裁判更好的判定比赛输赢. 需求分析:     作为一名排球教练,我需要统计对方球队的队员信息,得分情况,技能得分,以便能做出针对性的训练. 进入本程序后,需要选择身份,然后就可以对队员信息进行操作了.(增删改查) 本身份只能对本队队员进行操作,要想操作对方队员,只能退出程序,重新选择身份. 作为一名裁判,我需要对场上两队得分进

郭晓东的“系列博客,专辑”集锦

基础知识: 字符编码的奥秘[专辑],浏览其中一篇:字符编码的奥秘utf-8, Unicode <深度探索C++对象模型>[系列笔记]--对象模型.存储形式:默认构造函数一定会构造么? <深入理解计算机系统>[系列笔记]虚拟存储器,malloc,垃圾回收 <PNG文件格式>PNG文件格式分析 iOS平台知识: iOS开始学习[系列博客]Objective-c 语法,继承,protocol和delegate(iOS学习笔记,从零开始) Objective-c高效变成[专辑]