Android
文章平均质量分 90
Roland_Sun
职业旅程:Engineer->Senior Engineer->QA Manager->Project Manager->Senior Staff Engineer
展开
-
如何向AOSP中添加根证书
工作中经常需要修改AOSP的代码,定制特定的ROM方便做应用程序分析。但是,由于需要抓取HTTPS的包进行分析,所以,每次刷机后都要倒一个根证书到手机中,非常麻烦。那能不能直接将这个根证书添加到AOSP的代码中,直接包含在编译出的ROM中呢?答案当然是肯定的。其实,AOSP包含的所有根证书都位于“libcore/luni/src/main/files/cacerts”或者是“system/原创 2017-04-24 16:17:03 · 3016 阅读 · 0 评论 -
Android 6.0中art虚拟机编译dex时已完全放弃使用LLVM
记得在Android 4.4发布的时候,Google正式引入了称做ART(Android Run Time)的虚拟机,用来取代传统的Dalvik虚拟机。ART虚拟机最大的特点就是,将代码优化的过程从Davlik的JIT(Just In Time)模式转换成了AOT(Ahead Of Time)模式。也就是说,在程序正式执行之前就完成了优化和编译的工作。而编译的时机时在程序安装的时候,由dex2原创 2015-10-13 22:17:20 · 7954 阅读 · 0 评论 -
Google自己出品的dex转jar工具enjarify的介绍
Android是使用Java语言进行编程的。但是,由于其使用了自己的Dalvik虚拟机,所以Android的指令集使用的是Dalvik,且可执行文件格式也是使用的专有的DEX格式。这样的话,如果想反编译Android的程序,就需要专门的反编译工具软件。但是,其实Android在编译的时候,其实是先使用Java的工具链,然后在用自己提供的dx程序,将编译好的Java程序,抓换成专属的DEX文原创 2015-10-20 14:07:16 · 9187 阅读 · 2 评论 -
如何在VirtualBox虚拟机中安装Android x86
Android x86最近出了一个5.1的新版本,其中包括了Intel新的houdini版本,以及其和ART虚拟机的集成。最近想对其做一个研究。但是,直接找一台机器装实在太浪费。因此,决定将其安装在VirtualBox的虚拟机中。首先,下载安装光盘镜像文件。最新版的Android-x86安装盘.iso文件,可以从这里下载到。笔者下载的是最新版,文件名是“android-x86-5.1-rc原创 2015-11-05 12:37:56 · 27677 阅读 · 26 评论 -
Android平台下hook框架adbi的研究(下)
上篇中,我大致介绍了一下如何将一个dlopen()的调用插入到指定进程的执行序列中去。但是,光插入这个没用,还没有具体解决如何hook进程中指定函数的问题。这个任务就要交给dlopen()函数加载进来的那个动态库来完成了。但是具体要hook哪个进程内的,哪个动态库中的哪个函数,以及hook之后做什么,肯定是要使用者自己来指定的。adbi的作者写了一个简单的框架来帮助使用者,这个就是所谓的i原创 2014-06-30 22:04:38 · 10328 阅读 · 24 评论 -
Android系统ODEX文件格式解析
对于一个Android的apk应用程序,其主要的执行代码都在其中的class.dex文件中。在程序第一次被加载的时候,为了提高以后的启动速度和执行效率,Android系统会对这个class.dex文件做一定程度的优化,并生成一个ODEX文件,存放在/data/dalvik-cache目录下。以后再运行这个程序的时候,就只要直接加载这个优化过的ODEX文件就行了,省去了每次都要优化的时间。不过,原创 2015-08-01 21:37:30 · 23238 阅读 · 2 评论 -
Dalvik虚拟机中DexClassLookup结构解析
在Android系统中,所有的类定义以及具体的代码都是包含在DEX文件中的。但是,一个功能丰富的程序往往都比较复杂,由很多类组成。而每一个类,都由一个所谓类描述符(Class Descriptor)的字符串来唯一标识,两个类不可能有同一个类描述符。类描述符不仅包含类名,还包含了类所在的包名。例如,如果你的类所在包名是“com.trendmicro.mars”,且类名是“Test”的话,那么这个原创 2015-07-14 14:27:06 · 2470 阅读 · 0 评论 -
Dalvik虚拟机中RegisterMap结构解析
Dalvik虚拟机中每一个方法都由一个称作Method的结构体来表示(包括JNI方法)。在这个结构体中,有一个指向所谓RegisterMap结构的指针:struct Method { ClassObject* clazz; u4 accessFlags; u2 methodIn原创 2015-07-10 16:25:26 · 3137 阅读 · 2 评论 -
Android平台下Dalvik层hook框架ddi的研究
通过adbi,可以对native层的所有代码进行hook。但对于Android系统来说,这还远远不够,因为很多应用都还是在Dalvik虚拟机中运行的。那么,有没有什么办法可以对Dalvik虚拟机中跑的代码进行hook呢?adbi的作者再接再厉,写了一个叫做ddi(Dynamic Dalvik Instrumentation)的框架,可以从这里获得其源代码:https://github.com/原创 2014-08-17 16:56:49 · 10990 阅读 · 11 评论 -
Android NDK中C++运行时库介绍
Android NDK中C++运行时库介绍原创 2015-10-31 23:15:51 · 8138 阅读 · 4 评论 -
dex2oat程序参数总结
Android从4.4开始正式引入了ART虚拟机,并从5.0开始取代了Dalvik成为默认的虚拟机。ART与Dalvik最大的不同就是,在程序安装的时候就将其编译成本地指令集(即所谓的Ahead Of Time,AOT),而不像Dalvik是在运行的时候对经常掉用的函数动态编译的(即所谓的Just In Time,JIT)。但是最终编译的动作,还是通过程序dex2oat来执行的。这个程序本身可带非原创 2015-12-11 13:47:58 · 12252 阅读 · 0 评论 -
如何向AOSP代码中添加编译好的可执行文件到ROM中
工作当中需要向AOSP的代码中添加一个可执行文件,从而可以打包进ROM里面,方便研究使用。研究一番后,发现其实步骤很简单,一共分成两部:1)将要放进ROM中的可执行文件放到AOSP的prebuilts目录下例如,如果我想将ida的调试服务器android_server文件放到ROM里面,那么我可以在prebuilts目录下建立一个ida目录,然后将android_server拷贝进去。...原创 2019-11-05 15:26:59 · 1611 阅读 · 2 评论 -
关于“Android所有根Activity中的Intent都存在被其它程序读到风险”的研究
这几天在研究Android Application Secure Design/Secure Coding原创 2014-06-05 20:21:21 · 2710 阅读 · 1 评论 -
如何查看Android设备上的分区信息
cat /proc/partitionsmountdfls -al /dev/block/platform/msm_sdcc.1/by-name原创 2016-03-24 14:51:11 · 45863 阅读 · 6 评论 -
如何从oat文件中提取内嵌的dex文件
在Android的ART虚拟机使用的oat文件中,其实是包含了一个完整的dex文件的。可以通过解析oat文件将dex文件的偏移和长度都检索到,然后再将这段数据单独读取出来存成dex文件就可以了。当然,自己可以动手写一个提取的程序,逻辑不复杂。但是,程序员都是很懒的,如果已经有别人免费提供了这类工具,就绝不会自己动手写。经过一番查找,发现了一个比较好用的工具,叫做dextra(http:原创 2016-02-17 10:53:53 · 5896 阅读 · 1 评论 -
Android-X86集成houdini所做的修改
Android-X86其实是基于Android的源码编译出来的一个X86版本,可以运行在X86系列处理器上。对于应用程序来说,如果全是使用Java语言编写的话,不会有什么问题。就算用到了JNI函数,如果编译出来了一个X86的动态库,并且包含在apk文件中,也不会有问题。要命就要命在有许多应用程序内部,只有ARM指令集的动态库,就不能在Android-X86平台下运行了,并且这类应用还不在少数。为了原创 2015-12-07 16:05:43 · 20813 阅读 · 5 评论 -
如何打开Android X86对houdini的支持
前面的文章中介绍了如何在VirtualBox虚拟机中安装Android X86。不过,安装结束后,试了几个只有ARM版.so文件的apk程序,发现都打不开。难道是新版Android X86动态将ARM指令集转成X86指令集的houdini兼容性有问题?经过一番研究,发现默认情况下,其实Android X86是不带houdini的,也就是不能运行只有ARM版.so文件的程序。不过,可以通过几原创 2015-11-09 15:49:25 · 48922 阅读 · 12 评论 -
用于Android ART虚拟机JNI调用的NativeBridge介绍
有一个项目叫做Android-X86,它是一个可以在X86平台上运行的Android系统。目前许多市面上销售的Intel Atom处理器的平板电脑,就是使用的这个系统。对于普通用Java代码编写的程序来说,理论上在Android-X86平台上运行是没有任何问题的。但是,如果你的程序包含JNI函数,并且还只用ARM编译器编译,那么在Android-X86系统上肯定跑不起来,X86处理器怎么可能会执行原创 2015-11-25 22:47:19 · 9669 阅读 · 7 评论 -
MUTF-8编码格式介绍
在Android应用程序的Dex文件中,所有的字符串都是使用一种叫做MUTF-8(Modified UTF-8)的编码格式进行编码的。所谓的MUTF-8编码,其实是对UTF-16字符编码的再编码。具体的实现可以查看MUTF-8编码的代码(代码位于libcore\dex\src\main\java\com\android\dex\Mutf8.java中):public final cla原创 2015-07-01 23:29:40 · 4777 阅读 · 0 评论 -
Android系统allowBackup属性安全风险研究
现在智能手机更新换代的速度极快,基本上是每年都要换新的手机。但是,换了手机后最麻烦的事情是要重新装很多软件,并且最好还能将原来手机上的配置和数据等信息都还原到新的手机上来,最大程度的减少换机带来的不方便。对于iOS设备来说,恢复起来很容易。但是,在Android设备上就比较痛苦了。还好,Google在Android API Level 8以上,官方提供了通过adb对应用程序数据的备份和恢复的功原创 2015-03-20 17:52:41 · 4085 阅读 · 0 评论 -
Android应用程序私有目录下文件操作总结
每一个Android程序都有一个特有的,只能由本程序自己访问的私有目录,这个目录一般位于/data/data//目录下。所有应用程序私有目录中保存的文件在用户卸载该应用的时候,都会被自动删除掉。在Android应用程序开发中,经常使用的一些系统提供的API,会在这个私有目录中创建一些子目录,并将相应的数据存放于其中。而这些对于应用程序开发者来说,完全是透明的,本文将对所有会访问应用程序私有目录原创 2015-06-11 17:26:44 · 27937 阅读 · 0 评论 -
Fiddler抓取Android真机上的HTTPS包
在分析一个apk的时候,经常希望可以原创 2014-06-12 16:59:02 · 59209 阅读 · 3 评论 -
Android平台下hook框架adbi的研究(上)
对于Android系统来说,底层本质上来说原创 2014-06-30 17:12:03 · 17002 阅读 · 16 评论 -
ELF文件查看利器之readelf用法
Android在NDK开发工具中提供了rea,用来帮助开发者查看编译后目标文件的组成结构和具体内容。常用的有以下几个功能选项:原创 2014-07-14 10:50:08 · 24954 阅读 · 2 评论 -
ELF文件查看利器之objdump用法
objdump,用来查看编译后目标文件的组成结构和具体内容,原创 2014-07-03 16:09:03 · 20813 阅读 · 1 评论 -
Android应用程序apk内xml文件编码解析
每一个Android应用程序中都有一个AndroidManifest.xml文件原创 2014-06-01 15:37:54 · 7184 阅读 · 0 评论 -
Android ART运行环境下Image文件格式简析
可以通过阅读代码来帮助分析Image文件的格式。首先,在art\runtime\Image.h文件中,有相关的定义:原创 2014-05-09 14:54:28 · 4561 阅读 · 3 评论 -
Android无源码调试APK(使用ApkTool和Eclipse ADT)
现在已经有很多方法可以反编译apk文件,常用的有dex2jar和JD-Gui的组合,可以看到近似java的代码,非常容易理解,使得破解一个apk的难度大大降低。但有时候,静态看代码也非常复杂,参数传来传去,尤其是那些不是直接调用,而是通过类似intent传过来的,要找到调用的源并了解每个参数的含义,还是比较复杂的。那么有没有一种方法,可以方便的在没有源码的情况下,对一个apk进行调试,从而原创 2014-05-20 23:30:49 · 10912 阅读 · 0 评论 -
Android ART Oat文件格式简析(下)
在上篇中,我们分析到了OatFile的begin_和end_原创 2014-05-15 22:05:41 · 6672 阅读 · 2 评论 -
Android ART Oat文件格式简析(上)
上文大致描述了一下Image文件的结构,本文将接下来简单描述一下Oat文件的大致结构。首先,还是来看一下代码。Oat文件的读取是通过OatFile::ElfFileOpen(art\runtime\Oat_file.cc)进行的:原创 2014-05-13 16:30:00 · 9462 阅读 · 4 评论 -
Android应用程序签名验证过程分析
在前面的《Android应用程序签名过程分析》中,我大致分析了Android应用程序签名的过程,接下来我将结合源代码,分析一下Android应用程序在安装过程中对签名进行验证的过程。我们还是用前面的例子分析,假设签名后,apk文件中多了一个META-INF目录,里面有三个文件,分别是MANIFEST.MF、CERT.SF和CERT.RSA:通过前面的分析,我们可以知道,MANI原创 2014-12-19 16:03:19 · 9984 阅读 · 2 评论 -
使用tcpdump抓取Android模拟器或真机上的HTTP包
前面我介绍了如何使用Fiddler在真实的Android手机上抓取HTTPS包的方法。但是那个方法有一个比较大的前提条件,就是被分析的应用程序必须支持代理服务器,如果不支持的话则无能为力。然而现实的情况是,谷歌不强制所有的应用程序必须支持代理,市面上就有很多应用根本不支持代理,对于这一类的应用,可以使用tcpdump来抓包,然后配合Wireshark对抓出的包进行分析。Android SDK提原创 2014-11-25 16:32:38 · 8390 阅读 · 2 评论 -
Android应用程序签名过程分析
在正式解释Android应用程序签名过程之前,作为铺垫,还得先讲讲最基本的一些概念。一、非对称加密算法非对称加密算法需要两个密钥:公开密钥(简称公钥)和私有密钥(简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密原创 2014-12-09 16:43:25 · 4127 阅读 · 2 评论 -
uleb128、sleb128和uleb128p1编码格式介绍
在程序中,一般使用32位比特位来表示一个整型的数值。不过,一般能够使用到的整数值都不会太大,使用32比特位来表示就有点太浪费了。对于普通计算机来说,这没什么问题,毕竟存储空间那么大。但是,对于移动设备来说,存储空间和内存空间都非常宝贵,不能浪费,能省就省。Android的Dalvik虚拟机中,就使用了uleb128(Unsigned Little Endian Base 128)、uleb12原创 2015-07-01 11:11:42 · 8117 阅读 · 0 评论 -
Android中如何将原生程序向stdout和stderr的输出重定向到logcat
在init进程执行动作(action)或启动服务(service)时,默认已将标准输入、标准输出、标准错误从定向到/dev/__null__这个“无底洞”节点,所以任何的输出都会被忽略,但有时我们确实是想把一些执行文件的输出记录下来以便我们进行分析,这里logwrapper这个工具可以派上用场了。有时候第三方应用程序的日志输出是通过printf之类的标准函数输出的,logcat不能原创 2015-05-22 22:36:24 · 7983 阅读 · 0 评论 -
如何指定让Android的NDK工具编译出Release版本或Debug版本的Native程序
Android提供了NDK开发工具,它在GNU Make的基础上,自己预先写好了一些通用的脚本。这样就使得开发者不需要重头编写MakeFile,只需要为自己的模块编写相应的Application.mk(如需详细了解请参考《Application.mk语法解释》)和Android.mk(如需详细了解请参考《Android.mk语法解释》)脚本文件,并且在脚本中还可以使用很多Android N原创 2015-06-01 21:02:26 · 13870 阅读 · 0 评论 -
如何让指定程序启动一个Android系统中的Java进程
Android系统中的所有应用程序都是由所谓的Zygote进程(准确的说是/system/bin/app_process)“孵化”出来的。所有新创建的程序,都会继承Zygote进程内所有的资源。这样做的好处是免去了各个程序自己加载各自资源的时间,同时减少了系统总的内存使用量,代价仅仅是增加了每次系统重启的时间。但同时也带来了一些问题。例如,如果开发者想分析或调试某个应用程序,而某些分析工具必须原创 2015-05-20 14:41:32 · 4201 阅读 · 1 评论 -
Application.mk语法解释
Application.mk是用来描述你的应用程序需要哪些模块,以及这些模块所要具有的一些特性。而相对的Android.mk是用来描述要编译某个具体的模块,所需要的一些资源,包括要编译的源码、要链接的库等等。Application.mk所要描述的内容主要包括:1)你程序正常运行,所需要到模块的具体列表;2)程序要编译成什么机器指令集的;3)所有模块要被编译成Release版本还是D原创 2015-06-01 23:51:03 · 10513 阅读 · 2 评论 -
Android.mk语法解释
大家在编写Android的Native代码时,经常会接触到一个叫做Android.mk的文件。虽然编译的时候都用到的是make,但是这个Android.mk文件里的语法还跟一般的make文件语法不太一样。本质上,Android.mk只是GNU MakeFile的一个片段,编译系统在编译的时候有可能会多次解释Android.mk文件,所以要尽量少在脚本里面申明变量,也不要假设任何没有在脚本中原创 2014-06-13 11:09:47 · 5514 阅读 · 0 评论 -
使用Valgrind找出Android中Native程序内存泄露问题
Android程序通常使用Java程序编写,由于Dalvik虚拟机集成了垃圾回收机制,所以内存使用比较不容易出错,通常就是一个本该被释放的对象却被另一个对象长时间持有着。对于这类问题,可以使用MAT工具,在Eclipse下结合DDMS进行分析。但是,目前任然有很多Android的应用程序,出于性能或者是安全的考虑,还包含了通过JNI调用的Native程序。这些Native程序使用C或C++语言原创 2015-05-27 17:18:42 · 11534 阅读 · 7 评论