18980640023

安卓逆向从0开始(1)-初识smali、双开、汉化、去广告

  • 来源:www.yunshengan.com
  • 发布日期: 2024-05-31
  • 浏览量: ..

“失败不是终点,放弃才是。”

1.模拟器环境搭建

2.初识APK文件结构、双开、汉化、基础修改
2.1所需工具
教程demo
MT管理器/NP管理器(部分需要MT会员的功能可以使用NP替代)
雷电模拟器
开发者助手(查看应用布局)

2.2apk结构介绍
apk全程Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为zip即可解压(和直接拖入jadx后的资源文件部分效果相同)
apk文件结构大体相同,主要存在以下几个文件:
assets目录:存放APK静态资源文件,比如视频,音频。图片等;
lib目录: armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的Android设备,x86常见用于Android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件(此处armeabi-v7a和arm64-v8a均指的安卓CPU架构);
META-INF目录:保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否有被修改);
res目录:res目录存放资源文件,包括图片,字符串等等,APK的界面由它的layout文件设计(存放在assets下的资源在运行打包的时候都会打入程序安装包中,而res中的资源在运行打包操作的时候,没有被使用到的文件资源不会打包到安装包中);
AndroidMainfest.xml文件:APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息;
classes.dex文件:classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑;
resources.arsc文件:编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源。
认识完上面的结构,我们需要知道,想要修改APK对应的功能时,应该到哪个文件夹下去修改,比如想要修改代码逻辑,就到dex文件中修改,想要修改媒体文件,就到assets目录下修改。

2.3双开
2.3.1 修改包名双开
在MT管理器中提取包->功能->找到apk共存->安装->双开
修改的包名即下图中的包名,也就是AndroidMainfest中的包名
PS:上述demo没有做签名校验,所以可以重新签名并安装

2.4汉化
2.4.1搜索文字定位
可以看到这里有几处需要汉化的文字,因为在不同的文件中,或许是dex文件,xml还有arsc文件中可能都存在需要汉化的文字。
此时我们不知道上述文字在dex文件中或是其他文件中,所以我们全局搜索,然后在搜索结果中修改并重新打包安装即可。

2.4.2看不懂的文字替换
需要用到工具开发者助手(打开demo软件后,在上图页面打开开发者助手浮窗,点击界面资源分析即可开始分析,复制下图文字然后全局搜索即可
此处搜索到文件在arsc文件中,点击对应文件->翻译模式->default(第一个)->找到上图语言->点击修改翻译后文字即可(MT管理器vip可使用汉化插件)
2.5 AndroidMainfest.xml介绍
AndroidMainfest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provide和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidMainfest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。
下面列举文件中常见属性:
versionCode:版本号,主要用来更新,例如1.2
versionName:版本名,给用户看的,例如1.2
package:包名,例如com.zj.52pj
uses-permission android:name="":应用权限,例如android.permission.INTERNET代表网络权限
android:label="@string/app_name" :应用名称
android:icon="@mipmap/ic_launcher":应用图标路径
android:debuggable="true":是否开启debug权限

2.5.1修改应用图标以及名称等
讲图标上传到共享文件夹->np管理器->功能->通用编辑->修改后重新安装
 
3.初始smail,vip终结者,一键三连
3.1工具
除了上述工具之外,需要用到核心破解、jadx-gui
3.2 什么是JVM、Dalvik、ART
JVM:java虚拟机,运行java字节码程序
Dalvik:Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)
ART:即Android Runtime,相当于Dalvik的升级版,本质与Dalvik无异

3.3 smali及其语法
smali是Dalvik的寄存器语言,smali代码是dex反编译而来的,在修改apk的时候,不能直接修改java代码,需要修改smali代码。
关键字:
名称
注释
.class
类名
.super
父类名,继承上级类名名称
.source
源名
.field
变量
.method
方法名
.register
寄存器
.end method
方法名的结束
public
公有(修饰符)
protected
保护,只有一家人才能用
private
私有,只能自己使用
.parameter
方法参数
.prologue
方法开始
.line xxx
位于第xxx行
数据类型对应:

smali类型
java类型
注释
V
void
无返回值
Z
boolean
返回布尔类型值
B
byte
字节类型,返回字节
S
short
短整数类型,返回数字
C
char
字符类型,返回字符
I
int
整数类型,返回数字
J
long(64位,需要两个寄存器储)
长整数类型,返回数字
F
float
单浮点类型,返回数字
D
double(64位,需要两个寄存器存储)
双浮点类型,返回数字
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
获取寄存器数据
3.4 实战修改
demo第二关(快速定位的方法可用1.搜索关键字;2.抓取按钮id,例如用开发者助手)
长按提示不是大会员
在jadx中搜索上述文本:
    public static final boolean m457onCreate$lambda2(Ref.IntRef intRef, ChallengeSecond challengeSecond, ImageView imageView, ImageView imageView2, ImageView imageView3, View view) {
        if (intRef.element < 10) {
            Toast.makeText(challengeSecond, "请先获取10个硬币哦", 1).show();
        }
        if (challengeSecond.isvip()) {
            ChallengeSecond challengeSecond2 = challengeSecond;
            Toast.makeText(challengeSecond2, "当前已经是大会员了哦!", 1).show();
            imageView.setImageResource(R.mipmap.zan_active);
            imageView2.setImageResource(R.mipmap.coin_active);
            imageView3.setImageResource(R.mipmap.collect_active);
            SPUtils.INSTANCE.saveInt(challengeSecond2, "level", 2);
        } else {
            Toast.makeText(challengeSecond, "请先充值大会员哦!", 1).show();
        }
        return true;
    }
方法1:修改寄存器的值;
方法2:修改判断为相反(大于小于);
方法3:goto强制跳转;
方法4(大会员绕过):上述代码会判断调用了isvip函数后的返回值,找到isvip函数,修改其返回布尔值。

寄存器:
在smali里所有的操作都必须经过寄存器来进行,本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2。参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指"this",p1表示函数的第一个参数,p2代表函数的第二个参数。而在static函数中p0才是对应第一个参数(因为java的static方法中没有this方法)

4.恭喜你获得广告&弹窗静默卡
4.1工具
增加算法助手
4.2安卓四大组件、Activity生命周期
四大组件:

组件
描述
Activity(活动)
在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。
Service(服务)
Service可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台音乐播放,文件下载等。
Broadcast Receiver(广播接收器)
一个用户接收广播信息,并做出对应处理的组件。常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。
Content Provider(内容提供者)
作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等)
Activity生命周期:

函数名称
描述
onCreate()
一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。
onStart()
当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。
onResume()
这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。
onPause()
这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。
onStop()
这个方法是在Activity完全不可见的时候调用的。
onDestory()
这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。
onRestart()
当Activity从停止stop状态进入start状态时调用状态。
注意:这些都是回调方法哦!我们不能够去调用,我们能做的只是重写方法里面的内容,什么时候调用是由Activity所决定的。我们能够手动调用的就只有finish0方法该方法用于关闭某个Activtiy。

4.3弹窗定位、去更新
4.3.1 广告
广告类型:
启动广告、弹窗&更新广告、横幅广告
启动广告流程:
启动Activity->广告Activity->主页Activity
修改方法:
1.修改加载时间(修改方法本身)
2.Activity切换定位,修改Intent的Activity类名
3.修改调用(找到调用了广告Activity的方法进行修改)
PS:在AndroidMainfest.xml文件中,会声明实现应用部分可视化界面的Activity,必须使用AndroidMainfest中的元素表示所有Activity。系统不会识别和运行未进行声明的Activity。

启动广告
方法一:修改加载时间
打开页面首先有一个3秒广告,这个页面也是一个Activity。
我们可以定位该广告,将加载时间修改为0秒。那么如何定位广告的Activity呢?
MT管理器:
打开记录功能后打开教程demo的三秒停留页面,可以看到广告页面的Activity名称为AdActivity。
在dex文件中搜索类名com.zj.wuaipojie.ui.AdActivity,可以定位到加载时间代码
在smali代码中找到loadAd方法并将加载时间(16进制表示)改为0秒即可。

方法二:修改AndroidMainfest.xml文件
在AndroidMainfest.xml文件中,会声明可视化的Activity。看看下列代码:
        
            android:name="com.zj.wuaipojie.ui.ChallengeFirst" />
        
            android:name="com.zj.wuaipojie.ui.ChallengeFifth"  
            android:exported="true" />  
        
            android:name="com.zj.wuaipojie.ui.ChallengeFourth"  
            android:exported="true" />  
        
            android:name="com.zj.wuaipojie.ui.ChallengeThird"  
            android:exported="false" />  
        
            android:name="com.zj.wuaipojie.ui.ChallengeSecond"  
            android:exported="false" />  
        
            android:name="com.zj.wuaipojie.ui.AdActivity" />  
        
            android:label="@string/app_name"  
            android:name="com.zj.wuaipojie.ui.MainActivity"  
            android:exported="true">  
            
              
                
                
                    android:name="android.intent.action.MAIN" />  
                
                
                    android:name="android.intent.category.LAUNCHER" />  
              
          
标签中的android:name="android.intent.action.MAIN"表示上一级Activity标签中的android:name="com.zj.wuaipojie.ui.MainActivity"作为主Activity被启动,将七改为第三关的com.zj.wuaipojie.ui.ChallengeThird即可。
PS:不建议使用这种方式修改,因为在加载广告Activity之前可能会预加载一些其他的的Activity,如果这些其他Activity在启动时没有被加载的话,可能会造成软件闪退等。

方法三:修改调用
怎么查找调用了广告方法的方法呢?
在dex文件中搜索类名com.zj.wuaipojie.ui.AdActivity,长按选择复制
以代码方式搜索复制内容:


在如下结果中广告类本身的就不用管了

查看下列类中的调用
调用代码如下:
在smali代码中将其修改为第三关的class调用即可。

弹窗&更新广告
更新弹窗直接修改AndroidMainfest.xml中的versiocode即可。
定位弹窗:
1.搜索关键字
2.开发者助手/开发助手抓取布局(开发助手可抓取图片布局)
3.算法助手日志查看

弹窗广告修改:
方法一:hook弹窗
方法二:修改dex弹窗代码

方法一:
算法助手弹窗定位(返回键可取消):劫持了返回键的弹窗广告可以使用返回键退出。
屏蔽关键词弹窗:输入弹窗关键词可以屏蔽弹窗

方法二:修改dex代码
首先使用算法助手勾选教程demo的算法助手弹窗定位(返回键可取消),然后打开教程demo到对应的弹窗功能,接着在算法助手中查看日志。

在dex文件中找到弹窗的show()方法,将其注释或者删除。

横幅广告
使用开发助手定位图片(开发助手->布局查看)
在MT管理器中进行xml搜索:0x7f0801ca(View Id)
将上图中的宽度和高度改为0,或者在后面加上代码android:visibility="gone"(表示隐藏)。

参考链接

本文链接: http://www.yunshengan.com/news/info/128.html

推荐资讯

热门资讯