【小白】去除飞鸽传输安卓端的广告

查看 124|回复 9
作者:yyspawn   
个人情况:有一定的Java基础,不懂安卓逆向,对照反编译的Java代码能大概看明白smail表达的内容
这次想找个安卓版的飞鸽传书,配合飞秋可以往手机中传剪切板内容或者文件,从谷歌市场上搜索到目前评分较高的软件为
https://play.google.com/store/apps/details?id=com.tj.feige.app


image.png (167.75 KB, 下载次数: 0)
下载附件
2021-10-1 17:48 上传

下载运行发现它能在安卓11上使用,同时支持单文件传输,基本满足需求,但是,它里面的谷歌广告着实烦人,鉴于作者已经N年没更新过了,我们就替他更新一下去掉广告功能吧
从apk pure搜索并下载这个apk,将下载好的软件拖入jadx分析,鉴于这个apk的功能和界面都非常简单,我们不妨直接搜索“广告”


image.png (55.74 KB, 下载次数: 0)
下载附件
2021-10-1 17:52 上传

哦,原来赚够积分升级为正式版就不用看广告了呢,那么我怎么知道我的积分够不够呢?自然是搜索积分看看了,经搜索发现积分不够会弹出提示,若积分充足会执行另一段代码:


image.png (88.22 KB, 下载次数: 0)
下载附件
2021-10-1 17:56 上传

当然,我这里并不打算直接此处的改跳转实现去广告,因为我在我的手机上根本看不到积分相关的UI,这部分功能可能由于api版本过低已经没法运作了,所以我们不妨看看
[Java] 纯文本查看 复制代码a("正在升级正式版请稍候...", new e(this), new f(this));
中的传入的另外两个对象都是咋定义的。
观察发现第一个只是让线程暂停了2秒,估计是为了避免读写冲突,第二个就有点意思了,内容如下:
[Java] 纯文本查看 复制代码
class f implements l {
    final /* synthetic */ FeiGeAdManagerUI a;
    f(FeiGeAdManagerUI feiGeAdManagerUI) {
        this.a = feiGeAdManagerUI;
    }
    @Override // com.tj.feige.app.a.l
    public void a(Object obj) {
        int n = this.a.d.n();
        int m = this.a.d.m();
        a.e = true;
        this.a.d.a("del_ad_flag", 1);
        this.a.d.a("del_ad_day", Integer.valueOf(n));
        this.a.d.a("del_ad_time", Long.valueOf(System.currentTimeMillis()));
        FeiGeAdManagerUI.a(this.a, m);
        e.a(this.a, "恭喜您已经升级成为正式版.");
        this.a.finish();
    }
}
注意到
this.a.d.a("del_ad_flag", 1);
this.a.d.a("del_ad_day", Integer.valueOf(n));
this.a.d.a("del_ad_time", Long.valueOf(System.currentTimeMillis()));
非常像判断是否删除广告的标记,另外这种设置方式看上去也挺像key-value的,不妨先把this.a.d当成Map类型,那么我们只要找到del_ad_flag出现的位置,并阻止程序将它设置为0就可以了。
将del_ad_flag改为0的代码只有寥寥几行,甚至都是在同一个函数中的:


image.png (28.62 KB, 下载次数: 0)
下载附件
2021-10-1 18:03 上传

进入函数,发现如下内容:
[Java] 纯文本查看 复制代码    public boolean o() {
        int i2 = this.i.getInt("del_ad_flag", 0);
        String f2 = f("showAllAd");
        if (ab.a(f2)) {
            f2 = "0";
        }
        if (i2 != 1) {
            return "1".equals(f2);
        }
        long currentTimeMillis = System.currentTimeMillis();
        long j2 = this.i.getLong("del_ad_time", 0);
        if (currentTimeMillis
显然这是一个判断要不要展示广告的函数,那自然是不要了,既然函数在将del_ad_flag设为0后才返回true,那就说明true代表展示广告,false代表不展示,因此,我们让函数在一开头就返回false就行了,也不用管del_ad_flag到底是几,这就方便了不少。
分析完毕,下面我们开始改smail:
用命令
[color=] java -jar .\Apktool_2.5.0.jar d '.\飞鸽传输 IP Messenger_v2.3.6_apkpure.com.apk'
将apk解包,根据方法o的限定名 com.tj.feige.app.a.o ,找到对应的 a.smail文件,其中,方法o对应的smail代码如下:
[Java] 纯文本查看 复制代码.method public o()Z
    .locals 12
    .prologue
    const-wide/16 v10, 0x0
    const/4 v0, 0x1
    const/4 v1, 0x0
    .line 627
    iget-object v2, p0, Lcom/tj/feige/app/a;->i:Landroid/content/SharedPreferences;
    const-string v3, "del_ad_flag"
    invoke-interface {v2, v3, v1}, Landroid/content/SharedPreferences;->getInt(Ljava/lang/String;I)I
    move-result v3
    .line 630
    const-string v2, "showAllAd"
    invoke-direct {p0, v2}, Lcom/tj/feige/app/a;->f(Ljava/lang/String;)Ljava/lang/String;
    move-result-object v2
    .line 631
    invoke-static {v2}, Lcom/tj/feige/app/a/ab;->a(Ljava/lang/String;)Z
    move-result v4
    if-eqz v4, :cond_0
    .line 632
    const-string v2, "0"
    .line 660
    :cond_0
    if-ne v3, v0, :cond_3
    .line 661
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
    move-result-wide v2
    .line 665
    iget-object v4, p0, Lcom/tj/feige/app/a;->i:Landroid/content/SharedPreferences;
    const-string v5, "del_ad_time"
    invoke-interface {v4, v5, v10, v11}, Landroid/content/SharedPreferences;->getLong(Ljava/lang/String;J)J
    move-result-wide v4
    .line 666
    iget-object v6, p0, Lcom/tj/feige/app/a;->i:Landroid/content/SharedPreferences;
    const-string v7, "del_ad_day"
    invoke-interface {v6, v7, v1}, Landroid/content/SharedPreferences;->getInt(Ljava/lang/String;I)I
    move-result v6
    .line 667
    int-to-long v6, v6
    const-wide/32 v8, 0x5265c00
    mul-long/2addr v6, v8
    add-long/2addr v6, v4
    .line 669
    cmp-long v6, v2, v6
    if-lez v6, :cond_2
    .line 670
    const-string v2, "del_ad_flag"
    invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
    move-result-object v3
    invoke-virtual {p0, v2, v3}, Lcom/tj/feige/app/a;->a(Ljava/lang/String;Ljava/lang/Object;)V
    .line 671
    const-string v2, "del_ad_day"
    invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
    move-result-object v1
    invoke-virtual {p0, v2, v1}, Lcom/tj/feige/app/a;->a(Ljava/lang/String;Ljava/lang/Object;)V
    .line 672
    const-string v1, "del_ad_time"
    invoke-static {v10, v11}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
    move-result-object v2
    invoke-virtual {p0, v1, v2}, Lcom/tj/feige/app/a;->a(Ljava/lang/String;Ljava/lang/Object;)V
    .line 683
    :cond_1
    :goto_0
    return v0
    .line 674
    :cond_2
    cmp-long v2, v2, v4
    if-ltz v2, :cond_1
    move v0, v1
    .line 677
    goto :goto_0
    .line 680
    :cond_3
    const-string v3, "1"
    invoke-virtual {v3, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    move-result v2
    if-nez v2, :cond_1
    move v0, v1
    .line 683
    goto :goto_0
.end method
我不怎么懂smail的语法,但由于要修改的内容非常简单,还是可以做出猜测的:
整个方法里面只有一个 return v0,表示返回,v0中自然要存放具体的返回值,并且这个值在函数返回前是可以被多次修改的,里面的若干句 move v0, v1 就证明了这点
我们再往上看,
    const/4 v0, 0x1
    const/4 v1, 0x0
明显声明了两个变量并赋值为整数,也就是说我们的返回值也是在v0或v1中间选一个就可以了,具体要选哪个呢?
前面的分析表明我们应当让函数返回false,因此要选择0x0,为了证明这一点,不妨找到return true;对应的smail代码:


image.png (141.93 KB, 下载次数: 0)
下载附件
2021-10-1 18:17 上传

大概看一下smail的流程,可以发现v0的值并没被修改,可见return true就是返回了0x1
因此,为去掉广告,我们只要在函数的开头return false,也就是将return v1放在合适的位置即可,不妨就放在这两个变量刚声明完的地方:


image.png (22.35 KB, 下载次数: 0)
下载附件
2021-10-1 18:21 上传

保存文件,用  java -jar .\Apktool_2.5.0.jar b "飞鸽传输 IP Messenger_v2.3.6_apkpure.com" 命令重新打包,然后再用
jarsigner -keystore debug.keystore -storepass pass -signedjar signed.apk '.\飞鸽传输 IP Messenger_v2.3.6_apkpure.com.apk' keyalias
命令为apk签名,卸载掉原版飞哥传输,安装我们的版本,可以发现广告已经全部没有了
附件:
飞哥传输原版+修改版
https://wwa.lanzoui.com/b00oyfaze
密码:bt7h

下载次数, 广告

asd9988   


zgzaaa 发表于 2021-10-1 20:32
ip messager支持开热点传输文件不

应该是支持的,不过两边都要装客户端
xuka   

大佬太6了,带带我 ,先mark一下。
zgzaaa   

牛牛牛牛
skyadmin   

ip messager支持开热点传输文件不
jiangx23   

学习一下积分去除教程
wqs0987   

办公现在都用钉钉啦!飞秋加油哦以前都是飞秋
T疒毒   

感谢大佬的无私分享
liuyanhao49   

谢谢,学习了,感谢大佬分享经验
zgzaaa   

感谢分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部