[Kyana]逆向安卓基础

WonderTraveller / 2024-02-15 / 原文

APK文件结构

  • assets:不需要编译的资源文件
  • lib.so动态链接库文件,C/C++编译后文件
  • META-INF:所有文件的摘要信息
  • res:编译过的资源文件(图标、布局等)
  • AndroidManifest:安卓设备配置文件
  • classes.dex:Java代码编译后文件
  • resources.arsc:字符串样式等资源

APK打包流程

  1. AADT编译资源文件,生成R文件
  2. 其它资源文件、R文件和JAVA源码一起编译成class文件,并和第三方包编译成dex文件
  3. 其它资源、已编译资源和dex文件打包成apk文件并签名压缩

APK安装流程

  1. 先复制到tmp文件夹,提取出dex文件
  2. 在data\app下创建文件夹存放资源文件

APK包修改

  • 修改包名:使用ApkKiller和apktools反编译apk,搜索工程进行替换(不能有xml转义字符)
  • 修改图标:搜索相应图片路径替换
  • 修改包名实现共存:搜索修改,双版本共存如果提供者不一样要修改相应的provider标签
  • 该配置禁网络实现去广告:修改AndroidManifest.xml,功能可以正常使用但容易报错,仅离线。删除INTERNET ACCESS_NETWORK_STATE ACESS_WIFI_STATE三项在xml中所有标签

虚拟机与汇编

  • Java代码使用hotspot等虚拟机,翻译class文件(jar包是java字节码的集合),基于栈架构
  • dalvik虚拟机翻译dex(优化后odex)文件(dalvik字节码),基于寄存器架构,可执行文件体积更小,AndroidL以下使用,JIT(just-in-time即时翻译)机制。
  • art(android-run-time)虚拟机使用dex优化后的oat文件,AndroidL及以上,AOT(ahead-of-time提前翻译)机制。现阶段也有混合使用的。
  • 使用不同虚拟机的区别:persist.sys.dalvik.vm.lib参数如果是libdvm.so就是dalvik虚拟机,如果是libart.so就是art虚拟机。java代码汇编成smali文件,c代码汇编成so文件。
  • /system/bin/dexopt对dex文件进行优化,/system/bin/dex2oat将dex文件转换为oat文件,系统启动需要/system/app/system/framework/data/app路径

dalvik字节码

  • dalvik虚拟机中的寄存器都是32位。寄存器命名分v和p两种方法,smali.jar使用p命名方法,ddx.jar使用v命名方法。
  • v命名法:对参数寄存器,是v0-vn;局部变量寄存器是vn+1-vn+m。即前面存放参数后面存放局部变量,现在不常用。
  • p命名法:参数寄存器:p0-pn,局部变量寄存器:v0-vn
  • 类型(smali):V-void,Z-boolean,B-byte,S-short,C-char,I-int,J-long,F-float,D-double,L-java_class,[-array。

smali文件结构

  1. 描述类的信息:.class<访问权限>[修饰关键字]<类名>.super<父类名>.source<源文件名>

  2. 静态字段(static fields):.fields<访问权限>static[修饰关键字]<字段名>:<字段类型>

  3. 实例字段(instance fields):同上,没有static

  4. 直接方法(direct methods):.method<访问权限>[修饰关键字]<方法原型>

    <.locals>指定使用的局部变量个数,[.paramet]指定方法的参数,[.prologue]指定代码的开始处,[.line]该处指令在源代码中的行号,<代码体>,.end method,虚方法相同但注释为virtual

  5. 接口和注解:.implement,.annotation[注解属性]<注解类名>[注解字段=值].end annotation