安卓逆向入门一
0x01 前置
-
下载migisk
-
Magisk(俗称面具),是一个ROOT工具。
- 它提供了多种功能,包括但不限于:
1 2 3 4MagiskSU: 提供应用程序的 root 访问权限。 Magisk 模块: 通过安装模块来修改只读分区。 MagiskBoot: 用于解包和重新打包 Android 启动镜像的最完整工具。 Zygisk: 在每个 Android 应用程序的进程中运行代码。 -
不要去Magisk中文网,这里用的是正己提供的安装包

这里如果下载失败的话,可以去设置里修改下图选项

0x02 apk的文件结构
Apk结构
apk 全称 Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为zip即可解压。
| 文件 | 注释 |
|---|---|
| assets目录 | 存放APK的静态资源文件,比如视频,音频,图片等 |
| lib 目录 | armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件 |
| META-INF目录 | 保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改) |
| res目录 | res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计 |
| AndroidManifest.xml文件 | APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息 |
| classes.dex文件 | classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑 |
| resources.arsc文件 | resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源 |

- demo实例中另外出现的kotlin代表这个apk文件大概是有kotlin语言编写,OkHttp 是一个流行的开源 HTTP 客户端库,用于发送和接收网络请求。
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。
Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。
在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言。
0x03 双开及原理
-
指手机同时运行两个或多个相同的应用
-
通过在宿主容器上面新建一个进程供插件 APK 寄宿,然后通过 hook 一些系统接口欺骗应用—让虚拟化后应用以为自己是正常运行的独立 APP,欺骗系统—让系统认为此虚拟化应用是一个已正常安装在系统的应用。
| 原理 | 解释 |
|---|---|
| 修改包名 | 让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP |
| 修改Framework | 对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开 |
| 通过虚拟化技术实现 | 虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间 |
| 以插件机制运行 | 利用反射替换,动态代{过}{滤}理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp |

0x04 汉化APK
-
1.Arsc汉化
-
2.xml汉化
-
3.Dex汉化 (
教程里的汉化插件需要vip,我这里是手动改的,知道原理就行)教程中用到的主要就是在mt管理器或者np管理器中对文件进行字符串搜索(管理器中设置了自动签名),如果手动的话,可以反编译改源码等 apk安装包快速反编译,多种反编译及失败的解决方案
这是汉化前⬇

这是汉化(手改)后⬇

0x05 初识AndroidManifest.xml
AndroidManifest.xml是Android应用的入口文件,它描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)。
注:这里文件名不能修改
AndroidManifest.xml文件主要包含以下几个元素:
| 元素 | 功能描述 |
|---|---|
| action | 添加一个action到intent filter |
| activity | 声明 activity组件 |
| activity-alias | 声明activity别名 |
| application | 声明应用程序 |
| category | 添加一个category名称到intent filter |
| compatible-screens | 定义应用所兼容的每种屏幕配置 |
| data | 添加数据定义到intent filter |
| grant-uri-permission | 定义应用数据的子集以供父内容提供者有权限可以访问 |
| instrumentation | 声明Instrumentation工具类并是您可以监控应用程序的交互系统 |
| intent-filter | 定义activity、service或者是broadcast receiver可以响应的意图(intent)类型, |
| manifest | AndroidManifest.xml文件中的根元素 |
| meta-data | 一条额外添加的名称-值对,可以给父组件提供任意的数据。 |
| path-permission | 在content provider内定义所需路径和权限特定子集数据 |
| permission | 声明一个安全权限,可以用来限制访问特定应用的组件或功能 |
| permission-group | 声明一个相关权限的逻辑组名称 |
| permission-tree | 声明权限树的基础名称 |
| provider | 声明一个内容提供者(content provider)组件 |
| receiver | 声明一个广播接收器(broadcast receiver)组件 |
| service | 声明一个服务(service)组件 |
| supports-gl-texture | 声明一种应用单一支持的GL纹理(texture)压缩格式 |
| supports-screens | 声明应用所支持的屏幕尺寸大小以及在启用兼容模式下系统屏幕超出应用所支持的尺寸 |
| uses-configuration | 声明应用程序的软硬件需求 |
| uses-feature | 声明应用程序需要用到的软、硬件特性。 |
| uses-library | 指定应用程序必须引用的共享库 |
| uses-permission | 指定了让应用程序正常运行,用户必须授予的系统权限。 |
| uses-permission-sdk-23 | 指定了应用程序在Android 6.0以上所需的特定权限 |
| uses-sdk | 通过API整数值来声明应用程序所兼容的Android平台版 |