Android逆向 | 基础知识篇 - 01

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Android逆向 | 基础知识篇 - 01

常见加密算法

编码
  • Base64
  1. 所有的数据都能被编码为只用65个字符就能表示的文本。
    标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n)。不论每行是否满76个字符,都要添加一个回车换行符。
  2. 65字符:A~Z a~z 0~9 + / =
    URL Base64算法中,为了安全,会把 + 替换成 - ,把 / 替换成 _
    = 有时候用 ~ 或 . 代替
  3. Base64的应用
    密钥,密文,图片,数据简单加密或者预处理
  4. Base64编码解码与btoa、atob
  • Hex
  1. 二进制数据最常用的一种表示方式。
  2. 用0-9 a-f 16个字符表示。每个十六进制字符代表4bit。也就是2个十六进制字符代表一个字节。
  3. 在实际应用中,尤其在密钥初始化的时候,一定要分清楚自己传进去的密钥是哪种方式编码的,采用对应方式解析,才能得到正确的结果
单向散列函数(消息摘要算法)
  • 不管明文多长,散列后的密文定长
  • 明文不一样,散列后结果一定不一样
  • 散列后的密文不可逆
  • 一般用于校验数据完整性、签名 sign
  • 由于密文不可逆,所以后台无法还原,也就是说他要验证,会在后台以跟前台一样的方式去重新签名一遍。也就是说他会把源数据和签名后的值一起提交到后台。所以我们要保证在签名时候的数据和提交上去的源数据一致,这种算法特喜欢在内部加入时间戳
  • 常见算法
  • MD5
  • SHA1
  • SHA256
  • SHA512
  • HmacMD5
  • HmacSHA1
  • HmacSHA256
加密算法

加密和解密的过程是可逆的

  • 对称加密算法
  • 根据密钥长度不同又分为AES-128 AES-192 AES-256
  • 其中AES-192 AES-256在Java中使用需获取无政策限制权限文件
  • 加密/解密使用相同的密钥
  • DES 数据加密标准
  • 3DES    TripleDES   DESede
  • AES 高级加密标准
  • CryptoJS提供ECB,CBC,CFB,OFB,CTR五种模式填充提供NoPadding ZeroPadding Pkcs7(Pkcs5) Iso10126 Iso97971 AnsiX923
  • 非对称加密算法
  • 使用公钥加密,使用私钥解密
  • 公钥是公开的,私钥保密
  • 加密处理安全,但是性能极差,单次加密长度有限制
  • RSA既可用于数据交换,也可用于数据校验
  • 数据校验通常结合消息摘要算法 MD5withRSA 等
  • 两种加密算法常见结合套路
  • 随机生成密钥
  • 密钥用于AES/DES/3DES加密数据
  • RSA对密钥加密
  • 提交加密后的密钥和加密后的数据给服务器
  • pkcs1padding 明文最大字节数为密钥字节数-11密文与密钥等长
  • NoPadding    明文最大字节数为密钥字节数     密文与密钥等长
  • RSA

APK基本结构

  • lib:各种平台下使用的对应的so文件
  • META-INF文件夹:存放工程一些属性文件
  • CERT.RSA:公钥和加密算法描述
  • CERT.SF:加密文件,他是使用私钥对摘要明文加密后得到的密文信息,只有使用私钥配对的公钥才能解密该文件
  • MANIFEST.MF:程序清单文件,他包含包中所有文件的摘要明文
  • resource.arsc:资源加密(语言包)对res目录下的资源的一个索引文件,保存了原工程中strings.xml等文件内容
  • drawable:图片
  • layout:布局
  • menu:菜单
  • AndriodMainfest.xml:清单文件(图标、界面、权限、入口),安卓工程的基础配置属性文件。
  • classes.dex:java代码编译得到的Dalvik VM能直接执行的文件
  • assets:资源文件(图片、音频、数据库、网页、配置文件等)
  • res:资源文件,需要编译
res目录与assets目录区别在哪?
  • res目录下的资源文件在编译时会自动生成索引文件(R.java),在java代码中用R.xxx.yyy来引用
  • asset目录下的资源文件不需要生成索引,在java代码中需要用AssetManager中访问。
  • 一般来说,除了音频和视频资源(需要放在raw或asset下),用java开发的安卓工程使用到的资源文件都会放到res下;使用c++游戏引擎的资源文件均需要放在asset下。

JVM、DVM与ART

  • JVM:Java虚拟机,运行的是.java文件编译后的.class文件
  • DVM:Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件,但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex文件。Dalvik虚拟机在启动的时候会先将.dex文件转换成快速运行的机器码,又因为65535这个问题,导致我们在应用冷启动的时候有一个合包的过程,最后导致的一个结果就是我们的app启动慢,这就是Dalvik虚拟机的JIT特性。
  • Dalvik是google专门为安卓操作系统设计的一个虚拟机,经过深度的优化,虽然安卓上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事,Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex,JVM则执行的是java字节码。
  • 通过Dalvik的字节码我们不能直接看到原来的逻辑代码,这是需要借助如Apktool或dex2jar+jd-gui工具来帮助查看,但是注意的是最终我们修改APK需要操作的是.smali文件,而不是导出来的java文件重新编译。
  • ART:ART虚拟机是在Android5.0才开始使用的Android虚拟机,ART虚拟机必须要兼容Dalvik虚拟机的特性,但是ART有一个很好的特性AOT(ahead of time),这个特性就是我们在安装APK的时候就将dex直接处理成可直接供ART虚拟机使用的机器码,ART虚拟机将.dex文件转换成可直接运行的.oat文件,ART虚拟机天生支持多dex,所以也不会有一个合包的过程,所以ART虚拟机会很大的提升APP冷启动速度。
    Xposed hook的是Java代码,所以Xposed不支持5.0以及以上系统。

安卓分区

Android通常有以下分区(用df 来查看分区情况)

  • System分区: 就是我们刷ROM的分区
  • Data分区:  分区就是我们装APK的分区
  • Catch分区:  是缓存分区
  • SDCard分区: 就是挂载的SD卡。

data分区常见目录:app、system、data、local、misc

  1. data/data目录
    存放的是所有APK程序数据的目录,每个APK对就一个自己的Data目录,就是在data/data/目录下,会产生一个跟 Package一样的目录。比如有一个APK,它的包名叫com.test.hello,则在data/data/目录下会有一个 com.test.hello的目录,这个APK只能操作此目录,不能操作其它APK的目录
  2. data/app目录
    用户安装的APK放在这里。我们如果把APK放入这个文件夹下面的话,就算安装好了。这就叫静默安装。不用管APK文件里面的lib目录下的库文件,系统会自动帮我们放入调用库
  3. data/misc目录
    保存WIFI帐号,VPN设置信息等。比如保存了一个WIFI连接帐号,则此目录下的WIFI目录下面wpa_supplicant.conf可以查看到

system分区常用目录:app、lib、xbin、bin、media、framework

  1. system/app目录
    存放系统自带的APK。将APK放入到System/app目录下,也是静默安装
  2. system/lib目录
    存放APK程序用到的库文件
  3. system/bin目录和system/xbin目录
    存放的是shell命令
  4. system/framework目录
    启用Android系统所用到框架,如一些jar文件

sd卡目录:/sdcard    /mnt/sdcard

相关文章
|
7月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
78 2
|
7月前
|
Android开发
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
117 0
|
7月前
|
Java Linux Android开发
Android基础知识:解释什么是Android(安卓)操作系统?
Android基础知识:解释什么是Android(安卓)操作系统?
955 0
|
7月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
471 0
|
7月前
|
Java Shell Linux
Android——编译(一):编译make的基础知识
Android——编译(一):编译make的基础知识
159 0
|
7月前
|
Android开发
Android基础知识:什么是Fragment?与Activity的区别是什么?
Android基础知识:什么是Fragment?与Activity的区别是什么?
1334 54
|
7月前
|
数据库 Android开发 开发者
Android基础知识:什么是Android应用的四大组件?
Android基础知识:什么是Android应用的四大组件?
186 1
|
7月前
|
Java 开发工具 Android开发
[Android]JNI的基础知识
[Android]JNI的基础知识
120 0
[Android]JNI的基础知识
|
Android开发 iOS开发
测试开发工程师需要知道的 Android和iOS CPU架构基础知识
测试开发工程师需要知道的 Android和iOS CPU架构基础知识
511 0
|
安全 Java 编译器
Android逆向 | 基础知识篇 - 03 - 关于 Android 体系结构的学习
Android逆向 | 基础知识篇 - 03 - 关于 Android 体系结构的学习