0x00 起因

起因是在Android上用了一段时间的AndPods觉得不太好用之后,换到了另一个Play商店推荐的App。动画、连接和电量提示都用的很满意,就是每次连接的弹窗和APP里面都有广告,就想着改成Pro版把广告去掉。


0x01 解包分析

首先把apk拿出来解包,开始看代码。

代码没有加固,用了混淆,搜索关键字之后发现,只做了一个签名校验,pro版本通过一个常量来判断并通过SP明文存储。

root过的话直接通过adb修改SP的内容就好,由于手机没有root,只好通过改代码的方式来实现破解。


0x02 修改Pro版

通过搜索代码确定,pro版的判定只通过MenuItem::isPro,直接把值写死,setter方法return就好。

  • 修改MenuItem.smali的constructor,在return-void前为isPro初始化
# direct methods
.method public constructor <init>()V
.locals 1 invoke-direct {p0}, Ljava/lang/Object;-><init>()V new-instance v0, Ljava/util/ArrayList; invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V iput-object v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->possibleVariants:Ljava/util/ArrayList; sget-object v0, Lcom/pryshedko/materialpods/model/MenuItem$PROPERTY_TYPE;->TEXT:Lcom/pryshedko/materialpods/model/MenuItem$PROPERTY_TYPE; iput-object v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->type:Lcom/pryshedko/materialpods/model/MenuItem$PROPERTY_TYPE; const/4 v0, 0x1 iput-boolean v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->isVisible:Z const/high16 v0, 0x43110000 # 145.0f iput v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->maxValue:F sget-object v0, Lb/a/a/a/a/b/a$b;->d:Lb/a/a/a/a/b/a$b; iput-object v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->unit:Lb/a/a/a/a/b/a$b; const/high16 v0, 0x40800000 # 4.0f iput v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->defaultFloatValue:F + const/4 v0, 0x1
+ iput-boolean v0, p0, Lcom/pryshedko/materialpods/model/MenuItem;->isPro:Z return-void
.end method
  • 修改MenuItem.smali的setPro方法,直接删除iput-boolean
.method public final setPro(Z)V
.locals 0 - iput-boolean p1, p0, Lcom/pryshedko/materialpods/model/MenuItem;->isPro:Z return-void
.end method

0x03 绕过签名校验

通过搜索代码确定,签名校验的接口为b.g.b.b.b.g.b(),直接修改方法的返回值

.method public static b(Landroid/content/pm/PackageInfo;Z)Z
.locals 3 - const/4 v0, 0x0 - if-eqz p0, :cond_1 - iget-object v1, p0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature; - if-eqz v1, :cond_1 - const/4 v1, 0x1 - if-eqz p1, :cond_0 - sget-object p1, Lb/g/b/b/b/t;->a:[Lb/g/b/b/b/q; - invoke-static {p0, p1}, Lb/g/b/b/b/g;->a(Landroid/content/pm/PackageInfo;[Lb/g/b/b/b/q;)Lb/g/b/b/b/q; - move-result-object p0 - goto :goto_0 - :cond_0
- new-array p1, v1, [Lb/g/b/b/b/q; - sget-object v2, Lb/g/b/b/b/t;->a:[Lb/g/b/b/b/q; - aget-object v2, v2, v0 - aput-object v2, p1, v0 - invoke-static {p0, p1}, Lb/g/b/b/b/g;->a(Landroid/content/pm/PackageInfo;[Lb/g/b/b/b/q;)Lb/g/b/b/b/q; - move-result-object p0 - :goto_0
- if-eqz p0, :cond_1 - return v1 - :cond_1
- return v0 + const/4 v0, 0x1 + return v0 .end method

0x04 重打包&签名

由于我是用apktool2.4.0和旧的framework-res进行解包的,AndroidManifest中的foregroundServiceType="location"没有被正确解析,导致重打包时报了foregroundServiceType的错误,升级到apktool2.5.0并安装最新的framework-res.apk即可解决。


0x05 总结

这个App没有做过多的防护,重打包的过程也只是因为工具版本太低出现了一点小问题,修改起来没有什么难度,分析签名校验和Pro鉴权也算顺利,没遇到什么坑。

破解 Android 上 airpods 连接软件的pro版的更多相关文章

  1. Charles在Mac、iPhone、Android上抓http/https协议的包

    1.我使用的版本是4.0.2,下载和破解网上方法很多,不做说明 2.Charles在Mac上抓http/https协议的包 2.1先把这三个都给装上,装完后会自动跳转到钥匙串中 2.2如果装完后提示证 ...

  2. 用Kotlin破解Android版微信小游戏-跳一跳

    前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...

  3. 通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击

    通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击 大家肯定知道前几天刚爆出来一个linux内核(Android也用的linux内核)的dirtycow漏洞.此洞可 ...

  4. TensorFlow 在android上的Demo(1)

    转载时请注明出处: 修雨轩陈 系统环境说明: ------------------------------------ 操作系统 : ubunt 14.03 _ x86_64 操作系统 内存: 8GB ...

  5. 71.Android之长连接实现

    转载:http://blog.csdn.net/qq_23547831/article/details/51690047 本文中我们将讲解一下App的长连接实现.一般而言长连接已经是App的标配了,推 ...

  6. android上传文件到服务器

    package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...

  7. PhoneGap 在 Android 上的插件开发方法介绍

    移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...

  8. Android平台上长连接的实现

    Android 平台上长连接的实现 为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰. Android 上定时运行任务常用的方法有2种,一种方法用 Timer,另一种是 ...

  9. [转]Mac OS X 下部分Android手机无法连接adb问题之解决方案

    时至当今,Android山寨手机厂商已如此之多,能修改和个性化定制Android OS的能人已是多如牛毛,有的牛人修改Android系统只会影响所修改的点,不会影响其它,然后还有的就不多说了,总之做的 ...

随机推荐

  1. 简单判断long long 以内的回文数

    bool Ispalindrome(long long x) { if(x<0||(x>0&&x%10==0))return false; long long back=0 ...

  2. 2019HDU多校 Round10

    Solved:3 Rank:214 08 Coin 题意:n组硬币 每组有两个 分别有自己的价值 每组的第一个被拿了之后才能拿第二个 问拿1,2....2n个硬币的最大价值 题解:之前贪心带反悔的做法 ...

  3. 2019牛客多校 Round8

    Solved:3 Rank:261 E Explorer (线段树) 题意:n个点 m条边 每条边只有身高l,r内的人可以穿过 问有几种身高可以从1走到n 题解:把l,r离散化后(左闭右开) 线段树叶 ...

  4. Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)

    题目链接:https://codeforces.com/contest/1359/problem/C 题意 热水温度为 $h$,冷水温度为 $c\ (c < h)$,依次轮流取等杯的热冷水,问二 ...

  5. Java 窗口 绘制图形 #3

    写在前面: 高数下学到第二章,突发奇想要写一个程序画二元函数图像 思路分了三层: ①抽象层: 因变量z,自变量x.y,坐标原点x0.y0.z0 ②投影实现层: 屏幕投影坐标px.py,x轴与屏幕水平方 ...

  6. Codeforces Round #673 (Div. 2) B. Two Arrays (贪心)

    题意:给你一组数\(a\)和一个数\(T\),将这组数分为两组\(c\)和\(d\),定义\(f(x)\)为数组\(x\)中任意两个不同元素的和为\(T\)的个数,问为了使\(min(f(c)+f(d ...

  7. httprunner(9)运行测试用例的方式总结

    前言 用过pytest的小伙伴都知道,pytest的运行方式是非常丰富的,可以说是你想怎么运行怎么运行,想运行哪些运行哪些,那httprunner是否同样可以呢? 运行用例的各种方式 运行指定路径的用 ...

  8. Pyqt5使用

    一.帮助文档 二.PyQt5库结构 三. 面向对象的编程模式 class Windows(QWidget): def __init__(self): #继承父类的QWidget的方法 super(). ...

  9. 记一次FreeRTOS错误配置导致无法进入临界区

    最近项目用到FreeRTOS,在实际调试中发现我自己的一段代码本来好用的(在无RTOS的情况下),但是当我在带RTOS的情况下把代码放到一个单独的任务中运行时我发现本来好用的代码莫名其妙的出现问题,有 ...

  10. R语言学习2:绘图

    本系列是一个新的系列,在此系列中,我将和大家共同学习R语言.由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成. 参考教材:<R语言实战>第二版(Robert I.Kaba ...