课程目标

  1. 了解APK文件结构
  2. 双开APK,简单了解原理
  3. 汉化APK
  4. 简单修改APK名字、图标

使用到的工具

  1. 教程Demo
  2. MT管理器/NP管理器
  3. 开发者助手
  4. 雷电模拟器

注意:使用NP管理器需要断网,因为联网后要强制更新,更新后有些功能要登陆才能使用

学习内容

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的脸蛋(UI)由他的layout文件设计
AndroidMainfest.xml文件 APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息
classes.dex文件 classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑
resources.arsc文件 resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源

案例apk解压后如下图(该图中无assets和lib目录,也就是说这两个目录不一定每个apk都有)

image-20230906164848491

了解了上述的所展示的文件的作用后,以后我们在对apk进行修改时就能快速定位。比如要修改一个图片或音频,就应该从assets目录中去修改或替换;如果要修改apk的一个主要逻辑,就应该对.dex文件进行修改

双开及原理

双开:简单来说,就是手机同时运行两个或多个相同的应用,例如同时运行两个微信

下述四种后三种对初学来说较为困难,故只复现第一种:修改包名。

原理 解释
修改包名 让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP
修改Framework 对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开
通过虚拟化技术实现 虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间
以插件机制运行 利用反射替换,动态代{过}{滤}理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp

使用np管理器对案例app进行安装包提取,提取后使用np管理器的APK共存功能,确定后

image-20230906165954710

image-20230906170047960

该方法的弊端:因为修改包名会导致签名信息发生变化,重新安装apk,若该apk校验了签名信息,则会发生闪退或崩溃的情况。

案例

对如下内容进行汉化

image-20230906172518014

外加修改app封面图标和app的名称

简单的逆向流程

image-20230906170912371

汉化APK

汉化:使用专门的工具对外文版的软件资源进行读取、翻译、修改、回写等一系列处理,使软件的菜单、对话框、提示等用户界面显示为中文,而程序的内核和功能保持不变,这个过程即为软件汉化

Xml汉化

对”Hello 52pojie”进行汉化

搜索字符串定位

image-20230906172601462

image-20230906172630363

反编译后进行修改

image-20230906172828496

image-20230906172847282

Arsc汉化

对”Я не могу поверить, что это работает, почему?”进行汉化

需要借助“开发者助手”来复制字符串

image-20230906173141645

复制后进行搜索字符串定位

image-20230906173230544

image-20230906173332494

点击该文件选择“翻译模式”

image-20230906173425442

进去后点击”[DEFAULT]”,然后过滤

image-20230906173559089

image-20230906173639603

Dex汉化

对” Reverse determines height,
development determines depth.”进行汉化

搜索方法依旧采用搜索字符串就不再赘述

搜索结果

image-20230906174118968

选择Dex编辑器++

再搜索找到详细位置

image-20230906174259102

image-20230906174333275

image-20230906174456698

image-20230906174445633

修改图片

需要先找到res目录,找到该图片

image-20230906174905186

重新换一个图片,然后改成一样的名字cf.jpg

image-20230906175029874

最终效果

image-20230906175125573

修改app封面图标和app的名称

使用np管理器中的”通用编辑”功能

image-20230907092428012

image-20230907092506831

修改好后安装即可

image-20230907092534934

初识AndroidManifest.xml

AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。

属性 定义
versionCode 版本号,主要用来更新,例如:12
versionName 版本名,给用户看的,例如:1.2
package 包名,例如:com.zj.52pj.demo
uses-permission android:name=”” 应用权限,例如:android.permission.INTERNET 代表网络权限
android:label=”@string/app_name” 应用名称
android:icon=”@mipmap/ic_launcher” 应用图标路径
android:debuggable=”true” 应用是否开启debug权限,动态调试时会用到的一个权限

对于第四个应用权限,uses-permission android:name=””,假如一款app在使用前向我们索要摄像头权限,若不给就会退出app。这时候我们可以反编译AndroidManifest.xml文件,找到关于摄像头权限的属性,将其注释掉就好了,相当于禁用了该权限。

相关资源

《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修

https://www.bilibili.com/video/BV18G411j7gV/?spm_id_from=333.788&vd_source=fb474708f246c21e5933eeb76372688d

https://www.aliyundrive.com/s/TJoKMK6du6x