zoukankan      html  css  js  c++  java
  • Android逆向基础

     

    0. Android逆向基本介绍

    1. Android APK文件结构
    2. SDK工具-adb,monitor
    3. 逆向工具介绍
    4. Android逆向分析方法
    5. 字符串分析法-实例-破解一个apk的流程
    6. 日志过滤分析法
    7. 配置环境问题

    1. Android APK文件结构

    基本的APK是一个压缩包,压缩包中有

    META-INF目录: 签名信息,包括公司信息、文件的HASH值
    Res目录: 资源信息,包括图片、xml(布局文件、字符串、风格样式等)
    AndroidMainfest.xml :清单文件,包括APK包名、四大组件的一些申明定义、权限、程序的入口
    Classes.dex: 可执行文件,包括java的类信息、方法信息、字段信息、虚拟机指令。dex文件的生成流程是从java源码->class文件->dex文件
    Resources.arsc: 资源序号文件,包括资源里的所有ID、名称。资源ID对应文件是R.class

    在Android studio 中,打开apk文件,在Lib目录 动态库,扩展名是.so ,包括C++代码,有各种平台,比如x86,arm

    Assets目录 自定义资源,比如.txt,mp4,等等

    问题:那么Android APK的入口函数是什么?

    自己定义的MainActivity中onCreate
    而且清单文件中application节点可以添加android:name属性,指定继承自application的类,用于初始化整个app的全局信息。
    继承自application的类有两个重写函数会执行,是程序最早执行的函数。
    ① attachBaseContext
    ② onCreate


    所以一个app最早执行的函数是 application的类中的attachBaseContext函数
    一般apk加固之后,都会自定义application类,并重写其中的attachBaseContext函数或onCreate函数,并且声明为native类型的函数。
    app运行的流程

    Android 系统历史

    分为三个阶段
    ① android2.3~4.0 卡顿
    ② android4.1~4.4 成长,飞跃
    android虚拟机dalvik->art
    ③ android5.0~现在 整体不错
    逆向分析的环境
    系统:android 4.4 (同时有dalvik和art)
    手机: google nexus 4/5(500左右)
    google nexus 6p(800左右)

    2. SDK工具-adb,monitor

    adb命令

    ① 列举设备
    adb devices
    ② 将apk上传到设备
    adb push

    ③ 安装apk
    adb install -r apk文件名 (可以覆盖安装)
    ④ 启动apk
    adb shell am start -n <包名/activity名称>

    adb -s emulator-5556 shell am start -n com.bluelesson.helloworldndk21/.MainActivity

    adb shell am start -D -n <包名/activity名称> (以调试方式启动)
    ⑤ shell命令
    ls,cd,su,ps,ps | grep com,kill,chmod

    monitor操作

    ① 概况

    • androidstudio中打开
    • 文件目录中打开
    • 主要窗口

      ② 设备列表

      ③ 文件夹操作

      ④ 日志

      过滤日志

    3. Android逆向工具

    ①命令行工具

    1.AndroidManifest.xml清单文件解密工具

    • AXMLPrinter2.jar
      java -jar AXMLPrinter2.jar <清单文件>
      java -jar AXMLPrinter2.jar AndroidManifest.xml > out.xml
    • APK15PBParser.jar(集成了AXMLPrinter2.jar,apktool.jar中xml解析部分代码)
      java -jar APK15PBParser.jar
      java -jar APK15PBParser.jar HelloWorld1.apk

    2.Dex文件反汇编、汇编工具

    Dex文件是android java代码编译生成的二进制文件,包含了虚拟机指令(dalvik虚拟机)

    • Baksmali.jar(反汇编工具,将虚拟机指令反汇编成smali代码)
      java -jar baksmali.jar -o <输出目录>
      java -jar baksmali.jar classes.dex -o out_dir
      反汇编生成的目录中,包括所有dex文件中的类代码,每一个类就是一个smali文件。
      Java中有三种类,外部类、内部类、匿名类
      外部类:MainActivity.java -> MainActivity.smali
      内部类:MainActivity类中MyOnClickListener类 MainActivity$MyOnClickListener.smali
      匿名内部类:MainActivity类中new OnClickListener对象 -> MainActivity$1.smali
    • smali.jar(汇编工具,将smali代码汇编生成dex文件)
      java -jar smali.jar <目录> -o 文件名
      java -jar smali.jar out_dir -o out.dex
      修改smali代码,#号是注释代码
      // # if-eqz v2, :cond_24

    3.apk签名工具

    签名工具,使用android系统源码编译时用到的一个工具
    java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
    签名工具:signapk.jar
    密钥对:公钥testkey.x509.pem,私钥 testkey.pk8
    签名:java -jar signapk.jar testkey.x509.pem testkey.pk8 代签名.apk 已签名.apk
    签名工具的配置
    打开发送到的文件夹:shell:sendto
    java -jar 全路径 signapk.jar 全路径 estkey.x509.pem 全路径 estkey.pk8 %1 %1_signed.apk

    4.apk反编译工具-apktool

    反编译apk
    java -jar apktool.jar d
    java -jar apktool.jar d HelloWorld.apk
    ①将清单文件解密
    ②将资源序号文件与资源名称做了一个对应关系表
    生成在了/res/values/public.xml
    ③将dex文件反编译成了smali代码

    回编译 apk目录
    java -jar apktool.jar b <反编译的apk文件目录>
    java -jar apktool.jar b HelloWorld
    生成的APK在 <反编译的apk文件目录>/dist目录中

    5.Dex2jar工具(转换文件格式)

    dex2jar>d2j-dex2jar.bat
    dex2jar>d2j-dex2jar.bat classes.dex
    dex2jar classes.dex -> .classes-dex2jar.jar

    6.Java反编译工具(将java文件反编译为源码)

    ②可视化工具

    1.AndroidKiller工具(集成了反编译、回编译、安装apk、查看源码)

    • apktool
      所在目录:AndroidKiller_v1.3.1inapktoolapktool

      AndroidKiller SDK环境

      在Androidkiller中设置新的apktool



    • adb工具
      常用命令
      打开shell:adb shell , adb -s 设备名称 shell
      安装apk: adb install 1.apk , adb install -r 1.apk
      列举设备: adb devices

    • dex2jar工具集
      将dex文件转成jar文件,方便jd-gui反编译

    • jd-gui工具
      可以查看smali代码对应的java源码

      此外还有一些好工具的辅助工具

      编码转换

    2.JEB反编译工具

    3.Jadx-GUI

    4.GDA 反编译工具

    4. Android逆向分析方法

    ① 字符串分析法
    ② 日志分析法
    ③ 动态调试smali, 动态调试so文件(c++生成的文件)
    ④ API下断(调试so,对linux API下断),栈回溯分析

    5. 字符串分析法-实例-破解一个apk的流程

    破解步骤

    1. 拿到apk
    2. 使用反编译工具进行反编译
    3. 根据apk运行提示,查找字符串
    4. 查找字符串进行分析,找关键代码修改
    5. 使用重打包工具进行重打包
    6. 使用签名工具进行签名

    使用AndroidKiller用字符串分析法

    但是需要注意的是,中文字符串在Android是以Unicode编码方式显示的,格式类似u4e0du597du610fu601d。我们需要进行转换,AndroidkKiller提供了这个功能

    通过查找到对应代码,然后在代码附近可以发现显示成功的字符串。在成功字符串上面有关键跳转,我们只需要将关键跳转nop掉即可。其实在smali使用#号注释掉即可。

    在代码的上方,应该就是正确密码比对的地方,查看上下文发现v2寄存器,使用资源ID中获取的一个字符串。

    在这个时候,一般在工程中搜索资源ID,从资源ID找到对应的资源名称以及类型,然后再根据类型和名称找到对应资源的定义。

    然后再去搜索对应资源名称,找到字符串定义,因为已经知道类型是sting,直接可以查看文件res/values/strings.xml。

    之后,重新编译,安装测试。

    6. Smali代码-HelloWorld

    .class public LHelloWorld;
    
    #Ye olde hello world application
    #To assemble and run this on a phone or emulator:
    #
    #java -jar smali.jar -o classes.dex HelloWorld.smali
    #zip HelloWorld.zip classes.dex
    #adb push HelloWorld.zip /data/local
    #adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld
    #
    #if you get out of memory type errors when running smali.jar, try
    #java -Xmx512m -jar smali.jar HelloWorld.smali
    #instead
    
    .super Ljava/lang/Object;
    
    
    .method public static main([Ljava/lang/String;)V
        .registers 2
    
        sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
    
        const-string    v1, "Hello World!"
    
        invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
    
        return-void
    .end method
    

    7. 日志过滤法-实例

    使用Monitor过滤日志

    ①添加过滤项

    ②搜索过滤

    使用AndroidKiller过滤日志


    8. 配置环境问题

    夜神模拟器adb连接


    复制androidkiller中的adb以及dll,到SDK目录、夜神安装目录

     

  • 相关阅读:
    docker-compose命令简介及安装
    Dockerfile文件常用指令详解
    Keras API记录
    EM(最大期望)算法推导、GMM的应用与代码实现
    K均值聚类和代码实现
    Keras DEMO
    多元函数链式法则与反向传播算法的实例推演
    神经网络中常用的激活函数
    TIKZ——LaTeX基本绘图
    python 爬虫基本玩法,统计杭电oj题目正确率并排序
  • 原文地址:https://www.cnblogs.com/by-clark/p/9129663.html
Copyright © 2011-2022 走看看