一、模拟器环境搭建

1、工具下载下载

一键收回

雷电9

官网地址:https://www.ldmnq.com/

或者有我个人的工具包,在群里

apk_debug

2、apk_debug:https://yzhqvq.lanzoux.com/b02vfzqmh 密码:52pj

选择下载里面的apk_debug文件

2、模拟器开启root权限

在模拟器设置中,选择root,然后重启就可以了

img

3、安装并部署apk_debug

(此文件也叫magic,也叫面具)

将debug拖到模拟器中,自行安装

安好之后图标是这样的:

img

首次打开之后会有一个提示:请求root权限的,选择永久记住选择就可以了

img

然后点击安装,之后弹出的所有请求权限都允许即可

img

然后就来到了这个界面:

img

此时不要动,然后稍等一会,然后按右下角的方块键,把这个进程给划掉。然后重启magic

img

然后再按照刚才的步骤,点击安装–>下一步

然后弹出选择方式,就选择安装到系统分区

img

然后显示all done就是代表安装完成

img

纠错处理:显示installation failed

img

这种情况是因为您下载的是最新版的模拟器,需要在设置中打开读写权限,选择可写入

img

然后重复之前的操作就可以解决问题

img

然后 重启:

img

重启之后,然后再次点击进入magic,会有这样的报错,无所吊胃,不用管他

img

然后点击确定之后又,再右上角点击设置,然后打开 Zygisk

img

再然后就是刷一个LSposed的模块

4、LSposed模块

下载地址:https://github.com/LSPosed/LSPosed/releases/download/v1.8.6/LSPosed-v1.8.6-6712-zygisk-release.zip

模拟器点击更多->共享文件夹->打开电脑文件夹

img

img

然后将LSposed拖动到文件中:

img

然后在虚拟机中选择模块:

img

从本地安装,然后单机左上边三个横线,点击文件管理器

img

然后找到prctures文件夹,打开

img

找到模块:

img

双击之后,就开始运行:

img

出现如上情况就代表安装成功了,然后重启模拟器

然后重新打开magic,单击模块出现这个界面,那就代表安装完成了!

img

二、初识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就可以找到对应的资源

img

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

把该安装的都安一下:

img

demo-app-release实战

由于出题人在制作这个apk的时候没考虑好屏幕适配。所以直接打开会导致屏幕错位的情况,可以暂时改一下屏幕的分辨率,来方便更好的解决这个问题

img

使用mt管理器提取安装包

一键收回

打开mt,然后给他要的权限都选择确定

img

然后点击三个横线,选择安装包提取

img

选择demo(wuaipojie)

img

提取安装包

img

选择定位

img

然后就找到了提取的安装包

img

单击包

img

选择apk共存

img

然后勾选自动签名

结果发现需要会员,所以就先不用了(也可以找破解版)

这里我们用np管理器,还是一样的操作

img

img

再把那个新的安装包安装一下,就实现了双开

img

tips:由于我们的双开是通过修改包名来实现的,所以修改了应用的签名信息,如果开发者设置了签名校验,就会容易产生崩溃和闪退的功能

3、汉化apk技术

简单的逆向流程图:

img

demo挑战一:汉化(Arsc、xml、dex汉化)

一键收回

img

首先先登录一下mt管理器,这样才能实现反编译ID功能

img

Hello 52pojie汉化

首先跟着以上路径先找到这个app的跟文件夹

img

单击,打开以下页面,然后点击查看,来到内部的结构

img

img

然后这里用到的一个是搜索的功能:

img

然后选择高级搜索,之后在下面的文件夹输入“hello”,然后就开始搜索要找到内容

img

img

然后点进去:

img

然后就找到了这段代码的源码,随后在需要修改的地方更改一下就可以了

img

然后点击右上角的保存

之后按一下返回键,提示文件被修改了,单击确定就好

img

然后这里,由于我们对这个软件进行了修改,也就导致了软件的签名跟我们刚安装的软件签名不一样

先返回两次到以下见面然后点击安装包,点击安装

img

弹出来了这个提示

img

所以只能在设置的关闭这个验证选项:

img

然后再次去安装,还是会出现一种情况:

img

这里的这个问题也是签名不一致的问题造成的,对于这个问题有一个专门的模块来解决这个问题,叫做核心破解

在后面的学习的时候会详细解决这个问题,这里用一个巧妙的方法来解决这个问题:卸载掉原来的安装包

img

然后再去安装就解决了问题

img

解决!

arsc汉化

刚刚的hello是可以直接打出来的,但是遇到不知道语言,就很麻烦,比如这一段:Я не могу поверить, что это работает, почему?,这里就要用到一个新的工具,叫开发者助手,他可以进行一些识别操作然后就可以复制出来想要的文字了

安装好然后赋予一切权限之后,打开就是这样的

img

点击开始,就开始识别了

img

img

然后单击要复制的文字,单击然后复制就可以了

img

然后就是如上的步骤,进行搜索了,就找到了一个arsc文件

img

然后一样的操作,进入,但是这里弹出来选项,选择翻译模式

img

选择第一个

img

然后在这里就看到了很多很多的字符串,

img

然后单机只会就可以进行翻译

img

然后一直返回并保存就好

img

然后重新安装

img

但是这次并没有出现之前的弹窗,是因为我们对他改了两次签名,用的签名的信息是一致的,就不会产生冲突的问题,现在重新看一下文件:

img

完成!

hex汉化

还是用一样的操作,用开发助手复制下来那些话

Reverse determines height, development determines depth.

先按照之前的方法试一下。搜索到了dex文件

img

然后按照之前的操作,使用翻译模式去手动翻译

但是这样的文字太多了,花了很久才找到,特别麻烦

img

所以这里用另一种方法,使用dex编辑器++

img

然后点击搜索,搜索类型可以改成字符串

img

为了减少时间,所以不勾选完全匹配

img

然后就搜索到了结果

img

然后点进去,修改保存即可

img

然后都保存关闭,然后重新安装一下就好了

完成!

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权限

修改软件图标以及名称实战

一键收回

这是我改完之后的图标

img

首先打开电脑共享文件夹,然后把要修改的图片放进去

img

该功能在mt管理器中需要vip,所以就使用np管理器

文件一般是存放在MT2/apks文件夹下

img

img

然后单机要修改的apk,选择功能

img

通用编辑

img

然后图片选择系统图库(因为我们已经把图片放到电脑的共享目录下了)

img

img

然后安装即可

img

三、初识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

一键收回

将核心破解拖动到雷电虚拟机中,然后会弹出如下提示:

img

img

然后点击进去设置一下:

img

勾选启用模块并且选择系统框架,然后重启虚拟机

然后将新的demo拖动到jadx中反编译一下,然后就到了源码,可以进行操作

img

5、demo挑战二:初识smail语法&快速定位id于字符串

一键收回

首先先看一下程序是什么样的

img

在这里点击获得硬币会在硬币数的地方加一,然后长按一键三连的话,就会提示充值大会员

所以就在jadx中搜索大会员的字样,去寻找靠近大会员的函数部分

img

然后直接点击就可以转跳到相应的代码去查看对应的java代码的逻辑了

Q:这里如果没有搜索到“大会员字符”1为什么

A:因为jadx的版本问题,老版本的jadx并不会把汉字显示出来,而是通过一种编码的形式来展现,叫做Unicode编码,所以在搜索的时候可以上搜索相对应的Unicode编码

网站:

img

代码分析(需要java基础,但是不难,没学过java的也能看懂):

img

在这里可以看到一些有用的信息:

函数在编译之前的名字叫onCreate$lambda2

至于前面的m36是因为函数加了一些混淆,但是并不是很影响使用

带注释版本的smail语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//一个私有、静态、不可变的方法   方法名
.method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z
//(这里面是方法的参数)这里是方法返回值类型,表示布尔值类型,返回假或真
.registers 7 //寄存器数量

.line 33 //代码所在的行数
iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I
//读取p0(第一个参数,参考寄存器知识)中element的值赋值给p0const/4 p5, 0x1 //p5赋值1const/16 v0, 0xa //v0赋值10,在16进制里a表示10if-ge p0, v0, :cond_15 //判断p0的值是否大于或等于v0的值(即p0的值是否大于或等于10),如果大于或等于则跳转到:cond_15

.line 34 //以下是常见的Toast弹窗代码
check-cast p1, Landroid/content/Context; //检查Context对象引用const-string p0, "请先获取10个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0

check-cast p0, Ljava/lang/CharSequence; //检查CharSequence对象引用

invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
//将弹窗文本、显示时间等信息传给p1

move-result-object p0 //结果传递给p0

invoke-virtual {p0}, Landroid/widget/Toast;->show()V //当看到这个Toast;->show你就应该反应过来这里是弹窗代码

goto :goto_31 //跳转到:goto_31

:cond_15 //跳转的一个地址

invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z //判断isvip方法的返回值是否为真(即结果是否为1)

move-result p0 //结果赋值给p0if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址const p0, 0x7f0d0018 //在arsc中的id索引,这个值可以进行查询

.line 37
invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源const p0, 0x7f0d0008

.line 38
invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V

const p0, 0x7f0d000a

.line 39
invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V

.line 40
sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils;

check-cast p1, Landroid/content/Context;

const/4 p2, 0x2 //p2赋值2const-string p3, "level" //sp的索引

invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //写入数据

goto :goto_50 //跳转地址

:cond_43

check-cast p1, Landroid/content/Context;

const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //请先充值大会员哦!

check-cast p0, Ljava/lang/CharSequence;

invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

move-result-object p0

invoke-virtual {p0}, Landroid/widget/Toast;->show()V

:goto_50
return p5 //返回p5的值
.end method //方法结束//判断是否是大会员的方法
.method public final isvip()Z
.registers 2

const/4 v0, 0x0 //v0赋值0

return v0 //返回v0的值

.end method

修改方法:修改判断、强制跳转、修改寄存器的值

img

由于jadx没有修改的功能

首先是快速定位,去找到相对应的函数,然后跳转到smail的代码部分,再然后三种方法去修改达成目的

理论成立,实践开始

一键收回

修改判断

打开模拟器,安装最新的demo,然后提取一下安装包方便进行定位

img

查看

img

img

img

搜索硬币去定位函数

img

然后就找到了这里的代码

img

接下来看看怎么修改

首先要跳过10个硬币的检测,关键语句是

img

if-ge是大于等于跳转,所以我们给这个代码改成if-le就是小于等于跳转了

然后这里的大会员的核心判断语句

img

首先isvip()的返回值肯定是0,也就是没vip,所以这里为了防止跳转,就采取加注释,把那个判断的语句给注释掉就解决了问题

img

img

然后直接重新安装就好了

img

然后这里可以对比一下:

img

修改寄存器的数值

这方法和之前的差不多

知识修改寄存器的数值,和之前的方法一样去搜索定位

但是这里引进一个新的方法—id

打开开发者助手

界面资源分析

img

img

复制出图片的id-hex,然后去搜索

0x7F0801EB

记得不要搜索字符串,不然是没有结果的

img

然后有三个结果,挨个找找就好了,一下就得到代码

img

将v0的赋值语句改为给v0赋值,这样的话大于等于零就跳转了

img

长按isvip()函数,选择跳转

img

然后把初始赋值语句改为0x1,这样在下面检索的时候就不会跳转了

img

强制跳转

使用 goto语句去实现强制跳转

直接把 if-ge p0, v0, :cond_15给改成 goto :cond_15

就实现了,很简单

四、恭喜你获得广告&弹窗静默卡

.了解安卓四大组件、Activity生命周期 2.弹窗定位、去更新 3.广告分析与布局优化

1、工具

1.教程Demo(更新) 2.MT管理器/NP管理器 3.算法助手 4.雷电模拟器 5.开发助手

2、广告的类型

启动广告 弹窗&更新广告 横幅广告

img

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实战

一键收回

打开广告之后,真的很混乱,我只截图了其中一个,还有很多广告,真的牛皮

img

activity定位

首先在mt管理器中打开服务

img

然后去打开网页,去开启那个挂广告界面

img

img

注意左上角的activity发生变化

然后回到mt去看一下记录,找到广告的activity

img

复制下来之后去搜索一下

img

减少时长

img

由于转成java需要会员,所以,转到np,同样的操作定位到这个activity

img

然后转为java代码查看一下

img

img

找到一个代码

img

这行的代码大概意思是停留3000ms,所以想办法给这个数值改成0就可以了

img

找到相对应的代码,改成0x0就可以了

然后保存就不会再看到刚进去的广告了

在后面的有点难了,下次慢慢学!!!