Android Base

N1ng / 2024-10-21 / 原文

工欲善其事,必先利其器--《论语·卫灵公》
因此可见想学好Android逆向,了解相应基础知识是必要的,基础知识包括文件基础结构,双开,汉化等

结构基础

四大组件

Activity:面向用户应用组件或者用户操作可视化界面,基于Activity基类,底层由ActivityManager统一管理,也负责处理应用内或应用间发送的Intent消息
Broadcast Receiver:接受并过滤广播信息的组件,应用想显示的接收广播信息,需在Manifest清单文件中注册一个receiver,用Intent filter过滤特定类型的广播信息/应用内通过registerReceiver在运行时动态注册
Service:通常用于处理后台耗时逻辑,用户不直接与Service对应的应用进程交互,通过IPC机制接收和发送Intent。使用Service必须在Manifest清单注册,Service可以通过Intent进行启动,停止,绑定。
Content Provider:应用程序间数据共享的组件。

APK文件结构

目录名 文件 解释
mainfest.mf 清单文件
meta-inf目录 cert.rsa 应用签名文件
cert.sf 资源列表及对应的SHA-1签名
armeabi 所有ARM处理器相关文件
armeabi-v7a ARMv7及以上处理器相关文件,基本通用所有设备
lib目录 arm64-v8a 所有ARMv8处理器下的arm64相关文件
(又称库目录) x86 所有x86处理器相关文件
x86_64 所有x86_64处理器相关文件
mips MIPS处理器相关文件
res目录 没有编译至resources.arsc中的其他资源文件,包括:图片,字符串等,APK图标由layout文件设计
assets目录 能通过AssetManager访问访问到的资源文件,比如:图片,音频等
AndroidManifest.xml Android组件清单文件,包括应用名称,版本,权限等信息,以二进制XML文件格式存储,通过apktool,AXMLPrinter2等工具转换成XML明文格式
classes.dex java源码编译后生成的java字节码文件,APK运行主要逻辑
resources.arsc 编译后二进制资源文件,映射资源和id,通过R文件中id找到对应资源

Dex文件格式

Dex文件包含该可执行文件所有Java代码

hearder部分包含文件大小,校验码,各数据类型表的偏移和大小等数据
string表:每一表项都指向一个string数据偏移。string数据由两部分组成,起始位置为uleb128算法编码的变长string长度,后面紧跟string具体数据,由'\0'结尾
type表:存储各type在string表中的索引
proto表:每项包含3个元素,分别为函数原型简写,返回类型索引,参数偏移,参数偏移处第一个元素类型为uint,表示参数个数
field表:每个表项用3个元素描述一个变量,分别为该变量所属的类,该变量所属类型和该函数名字
method表:每个表项用3个元素描述一个函数,分别为该函数所属类,该函数原型和该函数名
class表:每个表项用8个元素来描述一个函数,分别为类名,类属性access flag,父类偏移,接口偏移,源文件索引,类注释,类数据偏移,静态变量偏移
maps表:保存上述各表大小和起始偏移,系统能够通过该表快速定位到各表

初始XML

xml作为整个应用程序信息描述文件,包含组件信息,文件名不可修改。描述package中暴露组件,各自实现的类,各种能被处理的数据和启动位置

属性 解释
versionCode 版本号,主要用于更新
versionName 版本名,给用户看
package 包名
user-permission android:name="" 应用权限,例如:android.permission.INTERNET表示网络权限
android:label="@string/app_name" 应用名称
android:icon="@mipmap/ic_launcher" 应用图标路径
android:debuggable="true" 应用是否开启debug权限

双开

原理 解释
修改包名 让手机系统认为这是2个APP,生成2个数据存储路径
修改Framework 对于有系统修改权限的厂商,修改Framework实现双开,比如:小米自带双开
通过虚拟化技术实现 虚拟Framework层,虚拟文件系统,模拟Android对组件的管理,模拟应用进程管理等一整套虚拟技术,APK复制一份至虚拟空间运行
以插件机制运行 反射替换,动态代理,hook系统的大部分与system-server进程通讯函数,通过"欺骗"系统认为是一个,"瞒过"插件认为自己安装
注:若开发者做了签名校验,则双开文件会出现闪退等情况

Java

Android编程语言由Java,在2017年5月修改为Kotlin,Android入口函数为onCreat函数

Java编程

public class MainActivity extends ActionBarActivity{
    /** Called when the activity is first created. */
    public void onCreat(Bundle savedInstanceState){
        super.onCreat(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("CTF","Hello world Android");
    }
}

AndroidMainfest.xml

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package = "com.ctf.test">
        <user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <user-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <application
            android:allowBackup = "true"
            android:icon = "@mipmap/ic_launcher"
            android:label = "@string/app_name"
            android:supportRtl = "true"
            android:theme = "@style/AppTheme">
        <activity android:name = ".MainActivity">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />
                <category android:name = "android.intent.category.LAUNCHER" />
            <intent-filter>
        </activity>
    </application>
</manifest>