1

App逆向实基础学习

 1 year ago
source link: http://xianyucoder.cn/2019/08/26/%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%E5%AD%A6%E4%B9%A01-%E9%80%86%E5%90%91%E5%9F%BA%E7%A1%80/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

App逆向实基础学习

2019-08-26

| App逆向

| 0

| 643次阅读

5.2k

|

9 分钟

常见加密算法

  • escape

    • unescape
  • encodeURIComponent

    • decodeURIComponent
  • Base64

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

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

  • 对称加密算法

    • 加密/解密使用相同的密钥
    • DES 数据加密标准
    • 3DES TripleDES DESede
    • AES 高级加密标准
      • 根据密钥长度不同又分为AES-128 AES-192 AES-256
      • 其中AES-192 AES-256在Java中使用需获取无政策限制权限文件
    • CryptoJS提供ECB,CBC,CFB,OFB,CTR五种模式填充提供NoPadding ZeroPadding Pkcs7(Pkcs5) Iso10126 Iso97971 AnsiX923
  • 非对称加密算法

    • RSA
      • 使用公钥加密,使用私钥解密
      • 公钥是公开的,私钥保密
      • 加密处理安全,但是性能极差,单次加密长度有限制
        • pkcs1padding 明文最大字节数为密钥字节数-11密文与密钥等长
        • NoPadding 明文最大字节数为密钥字节数 密文与密钥等长
      • RSA既可用于数据交换,也可用于数据校验
      • 数据校验通常结合消息摘要算法 MD5withRSA 等
      • 两种加密算法常见结合套路
      • 随机生成密钥
      • 密钥用于AES/DES/3DES加密数据
      • 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

煌金 wechat
扫描关注公众号,回复「1024」获取为你准备的特别推送~

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK