安卓逆向环境搭建---吾爱复现
一、模拟器环境搭建
1、工具下载下载
一键收回
雷电9
或者有我个人的工具包,在群里
apk_debug
2、apk_debug:https://yzhqvq.lanzoux.com/b02vfzqmh 密码:52pj
选择下载里面的apk_debug文件
2、模拟器开启root权限
在模拟器设置中,选择root,然后重启就可以了
3、安装并部署apk_debug
(此文件也叫magic,也叫面具)
将debug拖到模拟器中,自行安装
安好之后图标是这样的:
首次打开之后会有一个提示:请求root权限的,选择永久记住选择就可以了
然后点击安装,之后弹出的所有请求权限都允许即可
然后就来到了这个界面:
此时不要动,然后稍等一会,然后按右下角的方块键,把这个进程给划掉。然后重启magic
然后再按照刚才的步骤,点击安装–>下一步
然后弹出选择方式,就选择安装到系统分区
然后显示all done就是代表安装完成
纠错处理:显示installation failed
这种情况是因为您下载的是最新版的模拟器,需要在设置中打开读写权限,选择可写入
然后重复之前的操作就可以解决问题
然后 重启:
重启之后,然后再次点击进入magic,会有这样的报错,无所吊胃,不用管他
然后点击确定之后又,再右上角点击设置,然后打开 Zygisk
再然后就是刷一个LSposed的模块
4、LSposed模块
下载地址:https://github.com/LSPosed/LSPosed/releases/download/v1.8.6/LSPosed-v1.8.6-6712-zygisk-release.zip
模拟器点击更多->共享文件夹->打开电脑文件夹
然后将LSposed拖动到文件中:
然后在虚拟机中选择模块:
从本地安装,然后单机左上边三个横线,点击文件管理器
然后找到prctures文件夹,打开
找到模块:
双击之后,就开始运行:
出现如上情况就代表安装成功了,然后重启模拟器
然后重新打开magic,单击模块出现这个界面,那就代表安装完成了!
二、初识APK文件结构、双开、汉化、基础修改
工具
1.教程Demo 2.MT管理器/NP管理器 3.开发者助手 4.雷电模拟器
1.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文件设计 |
AndroidMainfest.xml文件 | APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息 |
classes.dex文件 | classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑 |
resources.arsc文件 | resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源 |
apk签名
1:apk包名不是我们看到的中文或者英文,一般情况下你是看不到的
2:apk包名的格式为com.xxxxx.xxxxxx,每个程序的长度都不一样,比如腾讯QQ的包名为:com.tencent.mobileqq,百度输入法的包名为:com.baidu.input。(java约定俗成的
域名反过来写来命名包)
3:因为版权问题,包名一般无法修改,也有些软件为了保护版权,只要你修改了包名,一进去就闪退
2.双开及原理
双开:简单来说,就是手机同时运行两个或多个相同的应用,例如同时运行两个微信
原理 | 解释 |
---|---|
修改包名 | 让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP |
修改Framework | 对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开 |
通过虚拟化技术实现 | 虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间 |
以插件机制运行 | 利用反射替换,动态代{过}{滤}理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp |
把该安装的都安一下:
demo-app-release实战
由于出题人在制作这个apk的时候没考虑好屏幕适配。所以直接打开会导致屏幕错位的情况,可以暂时改一下屏幕的分辨率,来方便更好的解决这个问题
使用mt管理器提取安装包
一键收回
打开mt,然后给他要的权限都选择确定
然后点击三个横线,选择安装包提取
选择demo(wuaipojie)
提取安装包
选择定位
然后就找到了提取的安装包
单击包
选择apk共存
然后勾选自动签名
结果发现需要会员,所以就先不用了(也可以找破解版)
这里我们用np管理器,还是一样的操作
再把那个新的安装包安装一下,就实现了双开
tips:由于我们的双开是通过修改包名来实现的,所以修改了应用的签名信息,如果开发者设置了签名校验,就会容易产生崩溃和闪退的功能
3、汉化apk技术
简单的逆向流程图:
demo挑战一:汉化(Arsc、xml、dex汉化)
一键收回
首先先登录一下mt管理器,这样才能实现反编译ID功能
Hello 52pojie汉化
首先跟着以上路径先找到这个app的跟文件夹
单击,打开以下页面,然后点击查看,来到内部的结构
然后这里用到的一个是搜索的功能:
然后选择高级搜索,之后在下面的文件夹输入“hello”,然后就开始搜索要找到内容
然后点进去:
然后就找到了这段代码的源码,随后在需要修改的地方更改一下就可以了
然后点击右上角的保存
之后按一下返回键,提示文件被修改了,单击确定就好
然后这里,由于我们对这个软件进行了修改,也就导致了软件的签名跟我们刚安装的软件签名不一样
先返回两次到以下见面然后点击安装包,点击安装
弹出来了这个提示
所以只能在设置的关闭这个验证选项:
然后再次去安装,还是会出现一种情况:
这里的这个问题也是签名不一致的问题造成的,对于这个问题有一个专门的模块来解决这个问题,叫做核心破解
在后面的学习的时候会详细解决这个问题,这里用一个巧妙的方法来解决这个问题:卸载掉原来的安装包
然后再去安装就解决了问题
解决!
arsc汉化
刚刚的hello是可以直接打出来的,但是遇到不知道语言,就很麻烦,比如这一段:Я не могу поверить, что это работает, почему?,这里就要用到一个新的工具,叫开发者助手,他可以进行一些识别操作然后就可以复制出来想要的文字了
安装好然后赋予一切权限之后,打开就是这样的
点击开始,就开始识别了
然后单击要复制的文字,单击然后复制就可以了
然后就是如上的步骤,进行搜索了,就找到了一个arsc文件
然后一样的操作,进入,但是这里弹出来选项,选择翻译模式
选择第一个
然后在这里就看到了很多很多的字符串,
然后单机只会就可以进行翻译
然后一直返回并保存就好
然后重新安装
但是这次并没有出现之前的弹窗,是因为我们对他改了两次签名,用的签名的信息是一致的,就不会产生冲突的问题,现在重新看一下文件:
完成!
hex汉化
还是用一样的操作,用开发助手复制下来那些话
Reverse determines height, development determines depth.
先按照之前的方法试一下。搜索到了dex文件
然后按照之前的操作,使用翻译模式去手动翻译
但是这样的文字太多了,花了很久才找到,特别麻烦
所以这里用另一种方法,使用dex编辑器++
然后点击搜索,搜索类型可以改成字符串
为了减少时间,所以不勾选完全匹配
然后就搜索到了结果
然后点进去,修改保存即可
然后都保存关闭,然后重新安装一下就好了
完成!
4、初识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权限 |
修改软件图标以及名称实战
一键收回
这是我改完之后的图标
首先打开电脑共享文件夹,然后把要修改的图片放进去
该功能在mt管理器中需要vip,所以就使用np管理器
文件一般是存放在MT2/apks文件夹下
然后单机要修改的apk,选择功能
通用编辑
然后图片选择系统图库(因为我们已经把图片放到电脑的共享目录下了)
然后安装即可
三、初识smali,vip终结者
1.更新demo
原来的demo文件更新了可以重新下载一下,新版的demo
2.什么是JVM、Dalvik、ART
JVM是JAVA虚拟机,运行JAVA字节码程序 Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable) Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异
3.smali及其语法
smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。
关键字
名称 | 注释 |
---|---|
.class | 类名 |
.super | 父类名,继承的上级类名名称 |
.source | 源名 |
.field | 变量 |
.method | 方法名 |
.register | 寄存器 |
.end method | 方法名的结束 |
public | 公有 |
protected | 半公开,只有同一家人才能用 |
private | 私有,只能自己使用 |
.parameter | 方法参数 |
.prologue | 方法开始 |
.line xxx | 位于第xxx行 |
数据类型对应
smali类型 | java类型 | 注释 |
---|---|---|
V | void | 无返回值 |
Z | boolean | 布尔值类型,返回0或1 |
B | byte | 字节类型,返回字节 |
S | short | 短整数类型,返回数字 |
C | char | 字符类型,返回字符 |
I | int | 整数类型,返回数字 |
J | long (64位 需要2个寄存器存储) | 长整数类型,返回数字 |
F | float | 单浮点类型,返回数字 |
D | double (64位 需要2个寄存器存储) | 双浮点类型,返回数字 |
string | String | 文本类型,返回字符串 |
Lxxx/xxx/xxx | object | 对象类型,返回对象 |
常用指令
关键字 | 注释 |
---|---|
const | 重写整数属性,真假属性内容,只能是数字类型 |
const-string | 重写字符串内容 |
const-wide | 重写长整数类型,多用于修改到期时间。 |
return | 返回指令 |
if-eq | 全称equal(a=b),比较寄存器ab内容,相同则跳 |
if-ne | 全称not equal(a!=b),ab内容不相同则跳 |
if-eqz | 全称equal zero(a=0),z即是0的标记,a等于0则跳 |
if-nez | 全称not equal zero(a!=0),a不等于0则跳 |
if-ge | 全称greater equal(a>=b),a大于或等于则跳 |
if-le | 全称little equal(a<=b),a小于或等于则跳 |
goto | 强制跳到指定位置 |
switch | 分支跳转,一般会有多个分支线,并根据指令跳转到适当位置 |
iget | 获取寄存器数据 |
其余指令可用语法工具查询
定位方法:搜索弹窗关键字、抓取按钮id
4、安装核心破解与jadx
一键收回
将核心破解拖动到雷电虚拟机中,然后会弹出如下提示:
然后点击进去设置一下:
勾选启用模块并且选择系统框架,然后重启虚拟机
然后将新的demo拖动到jadx中反编译一下,然后就到了源码,可以进行操作
5、demo挑战二:初识smail语法&快速定位id于字符串
一键收回
首先先看一下程序是什么样的
在这里点击获得硬币会在硬币数的地方加一,然后长按一键三连的话,就会提示充值大会员
所以就在jadx中搜索大会员的字样,去寻找靠近大会员的函数部分
然后直接点击就可以转跳到相应的代码去查看对应的java代码的逻辑了
Q:这里如果没有搜索到“大会员字符”1为什么
A:因为jadx的版本问题,老版本的jadx并不会把汉字显示出来,而是通过一种编码的形式来展现,叫做Unicode编码,所以在搜索的时候可以上搜索相对应的Unicode编码
网站:
代码分析(需要java基础,但是不难,没学过java的也能看懂):
在这里可以看到一些有用的信息:
函数在编译之前的名字叫onCreate$lambda2
至于前面的m36是因为函数加了一些混淆,但是并不是很影响使用
带注释版本的smail语法:
1 | //一个私有、静态、不可变的方法 方法名 |
修改方法:修改判断、强制跳转、修改寄存器的值
由于jadx没有修改的功能
首先是快速定位,去找到相对应的函数,然后跳转到smail的代码部分,再然后三种方法去修改达成目的
理论成立,实践开始
一键收回
修改判断
打开模拟器,安装最新的demo,然后提取一下安装包方便进行定位
查看
搜索硬币去定位函数
然后就找到了这里的代码
接下来看看怎么修改
首先要跳过10个硬币的检测,关键语句是
if-ge是大于等于跳转,所以我们给这个代码改成if-le就是小于等于跳转了
然后这里的大会员的核心判断语句
首先isvip()的返回值肯定是0,也就是没vip,所以这里为了防止跳转,就采取加注释,把那个判断的语句给注释掉就解决了问题
然后直接重新安装就好了
然后这里可以对比一下:
修改寄存器的数值
这方法和之前的差不多
知识修改寄存器的数值,和之前的方法一样去搜索定位
但是这里引进一个新的方法—id
打开开发者助手
界面资源分析
复制出图片的id-hex,然后去搜索
0x7F0801EB
记得不要搜索字符串,不然是没有结果的
然后有三个结果,挨个找找就好了,一下就得到代码
将v0的赋值语句改为给v0赋值,这样的话大于等于零就跳转了
长按isvip()函数,选择跳转
然后把初始赋值语句改为0x1,这样在下面检索的时候就不会跳转了
强制跳转
使用 goto语句去实现强制跳转
直接把 if-ge p0, v0, :cond_15给改成 goto :cond_15
就实现了,很简单
四、恭喜你获得广告&弹窗静默卡
.了解安卓四大组件、Activity生命周期 2.弹窗定位、去更新 3.广告分析与布局优化
1、工具
1.教程Demo(更新) 2.MT管理器/NP管理器 3.算法助手 4.雷电模拟器 5.开发助手
2、广告的类型
启动广告 弹窗&更新广告 横幅广告
3.安卓四大组件
组件 | 描述 |
---|---|
Activity(活动) | 在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。 |
Service(服务) | Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。 |
Broadcast Receiver(广播接收器) | 一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。 |
Content Provider(内容提供者) | 作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等) |
启动广告流程: 启动Activity->广告Activity->主页Activity
修改方法: 1.修改加载时间 2.Acitivity切换定位,修改Intent的Activity类名
demo实战
一键收回
打开广告之后,真的很混乱,我只截图了其中一个,还有很多广告,真的牛皮
activity定位
首先在mt管理器中打开服务
然后去打开网页,去开启那个挂广告界面
注意左上角的activity发生变化
然后回到mt去看一下记录,找到广告的activity
复制下来之后去搜索一下
减少时长
由于转成java需要会员,所以,转到np,同样的操作定位到这个activity
然后转为java代码查看一下
找到一个代码
这行的代码大概意思是停留3000ms,所以想办法给这个数值改成0就可以了
找到相对应的代码,改成0x0就可以了
然后保存就不会再看到刚进去的广告了