Android Base
工欲善其事,必先利其器--《论语·卫灵公》
因此可见想学好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>