安卓逆向-《安卓逆向这档事》


打算从今天开始,零基础学习安卓逆向,此篇文章为记录帖,随缘更新(不知道我的三分钟热度能坚持到哪一天)。

总结

感觉有用的操作

  • 汉化软件(第2节第3点)
  • 更改软件名称和图标(第2节第4点)
  • 简单修改APP逻辑(第3节第2点)

日志&每日计划

  • 2023/12/14 观看教程第1节、第2节
  • 2023/12/15 观看教程第3节
  • 2023/12/16 观看教程第4节
  • 2023/12/17 观看教程第5节、第6节

一、模拟器环境搭建

第一节所需软件链接集合:百度网盘
第一节原始主页:吾爱破解

  1. 安装9.0版本的雷电模拟器-安卓9下载debug版本-以管理员运行
  2. 启动模拟器-软件设置root权限打开重启-把面具apk拖入模拟器中安装-永久允许root权限-右侧安装magisk-切换任务视角面清退面具-再点击一次安装点击下一步-方式选择安装至系统分区-出现all done则为安装成功-重启模拟器-打开面具-设置打开zygisk
    在这里插入图片描述
  3. 刷LSPosed模块-模拟器右侧更多共享文件夹打开电脑文件夹-把LSPosed包放到该目录下-模块本地安装找到该包安装-重启模拟器
    在这里插入图片描述
    出现问题
    ①按照视频步骤,但magisk安装失败,后续发现更改模拟器设置将磁盘共享变为可写入可解决此问题。

二、初始APK文件结构、双开、汉化、基础修改

第二节所需软件链接集合:百度网盘
第二节原始主页:吾爱破解

  1. apk相当于一个压缩包,解压后会呈现多个子文件夹
    例如:
    assets+lib(不一定有但常见)
    META-INF(验证签名完整性)
    res(存放资源)
    AndroidMainfest.xml(APK的应用清单)
    classes.dex(java字节码文件,运行的主要逻辑)
    resources.arsc(资源映射文件,靠id寻资源)

  2. 双开
    修改包名:让手机认为这是两个APP。用NP管理器/MT管理器提取应用安装包-定位-功能-APK共存(MT需要会员用NP管理器)-确认安装
    在这里插入图片描述

    修改Framework: 小米自带的多开
    通过虚拟化技术:看不懂-类似于虚拟空间
    以插件机制运行:看不懂-类似于VirtualApp

  3. 汉化
    常规的逆向流程:查壳-反编译(汉化)-修改代码-回编译签名-安装测试
    在这里插入图片描述
    第一关
    xml汉化】第二关Demo文件-点击安装包-查看-(MT)右上角搜索功能高级搜索第二关的关键词“hello”-找到xml文件反编译-汉化成中文
    在这里插入图片描述
    在这里插入图片描述

    arsc汉化】若要翻译的文字不是英文且并不认识-安装开发者助手-打开Demo-点击界面资源分析复制文本信息-打开arsc文件翻译模式-点击default-找到相应的文本进行汉化/VIP一键汉化-右下角自动翻译-插件管理-插件中心安装
    在这里插入图片描述
    在这里插入图片描述
    dex汉化】打开dex文件-dex编辑器+±搜索发起新搜索-用开发者助手复制文本-搜索类型为代码或者字符串去除完全匹配
    在这里插入图片描述
    在这里插入图片描述

  4. AndroidMainfest.xml
    整个应用程序的信息描述文件,可以更改此文件信息达到更换软件名称和图标的目的。(用NP管理器的通用编辑一键搞定)
    在这里插入图片描述

    包含以下属性:
    versionCode-版本号,用于更新
    versionName-版本名,给用户看
    package-包名,例如com.zj.52pi.demo
    uses-permission android:name=-应用权限,可以手动修改不想赋予应用的权限,例如android.permission.INTERNET代表网络权限
    android:label=“@string/app_name”-应用名称
    android:icon=“@mipmap/ic_launcher”-应用图标路径
    android:debuggable=“true”-是否开启debug权限

三、初识smali

第三节所需软件链接集合:百度网盘
第三节原始主页:吾爱破解

  1. 什么是JVM、Dalvik、ART
    JVM是JAVA虚拟机,运行JAVA字节码程序
    Dalvik是Android虚拟机,生成dex文件
    ART是Dalvik升级版,本质与其无异
  2. smali及其语法
    是Dalvik的寄存器语言,由dex反编译而来。因为不能直接修改java,而要修改反编译后的smali代码。smali是静态修改的前提条件。
    边学边查,用smali语法查询软件
    【反编译】电脑打开jadx-gui
    【无视签名】安装核心破解-启用模块勾选系统框架然后重启
    第二关
    思路:存在两个判断条件1)是否有10个硬币2)是否是大会员,针对这两个条件修改。
//一个私有、静态、不可变的方法   方法名
.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的值赋值给p0

    const/4 p5, 0x1  //p5赋值1

    const/16 v0, 0xa //v0赋值10,在16进制里a表示10

    if-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  //结果赋值给p0

    if-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赋值2

    const-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

在smali里的所有操作都必须经过寄存器来进行: 本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)
做法:
在这里插入图片描述
首先快速定位,在文件里搜索大会员文字,注意反编译后会将文字变为Unicode编码;或者用开发者助手抓取按钮id在文件里面搜索。(可以用NP管理器或者jadx-gui搜索,阅读代码逻辑)
在这里插入图片描述
在这里插入图片描述
接着按照修改方法,依次进行。
【修改判断】两处判断条件,一个将ge改为le,另一个直接注释
在这里插入图片描述
在这里插入图片描述
【强制跳转】不判断是否有10个硬币,选择直接跳转到判断vip,然后再把判断vip的逻辑语句注释掉。
在这里插入图片描述
【修改寄存器的值】把判断语句中寄存器的值更改一下
在这里插入图片描述
在这里插入图片描述

四、去除广告、弹窗

五、动态调试&log插桩

六、签名校验

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值