处理滴答清单修改本地会员后不提醒问题

查看 86|回复 13
作者:芽衣   
这是原贴:https://www.52pojie.cn/thread-1814157-1-1.html
那么多的浏览量,也不知道有多少个人是发现有问题的,就是修改会员后闹钟到时间不提醒问题。这样改是没办法正常使用的,还不如用原版。这里就涉及到多重判断的问题,比如说有会员没支付信息,或者初次安装就有会员等,这些都是检测方案,碰到过很多类似的检测,联网的先不说,就说本地的,本地判断的方案基本上是一样的,了解这些检测原理,对于新手逆向会有一些帮助。

软件用的是刚下载最新版7.0.0.5,工具反编译之类的自己准备好,建议用MT、NP管理器,环境都不用搭,手机就是环境。



1.png (98.36 KB, 下载次数: 0)
下载附件
2023-11-18 11:33 上传

如上图,怎么找isPro()Z我就不说了,非常简单。保存后安装测试,发现时间到了都没有弹出提醒,而且断网或者不登录都没有用,基本上可以判定是验证了支付信息,并且肯定调用了这个方法。用MT管理器看了一下调用,差不多800个,看来这条路行不通。再看一下本类方法列表,发现了疑似检测的地方。


1.png (48.45 KB, 下载次数: 0)
下载附件
2023-11-18 11:39 上传

如图,列表中有一些验证方法,比如邮箱、用户,最为可疑的是getProTypeForFake(获取伪造的pro类型),Fake我相信大家都很熟悉,川建国经常说的词。然后查找该方法的调用,一共有7个,点进去逐个查看,基本可以确定就是这些调用在检测真假会员。


1.png (87.36 KB, 下载次数: 0)
下载附件
2023-11-18 11:46 上传

public void tryToLogFakeUser() {
                        SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
                        if (defaultSharedPreferences.getBoolean("jia_yonghu_tongji", false)) {
                                        return;
                        }
                        User currentUser = this.mApplication.getAccountManager().getCurrentUser();
                        if ((currentUser.getProTypeForFake() == 1) != currentUser.isPro()) {
                                        id.d.a().sendEvent("other_data", "jia_yong_hu", currentUser.isLocalMode() ? "local" : "server");
                                        defaultSharedPreferences.edit().putBoolean("jia_yonghu_tongji", true).apply();
                        }
        }
先看第一个,此处代码在尝试记录伪造用户,从字符串“jia_yonghu_tongji”就知道他想干什么,检测到伪造用户了以后就会被记录到SP目录下,后续取值就可以判断是否伪造。
其它地方同理,处理方案建议全部清掉void的代码。
继续往下看
private final String piracyUserSuffix() {
                        User a10 = j.a();
                        boolean z2 = false;
                        if (a10.isLocalMode()) {
                                        z2 = a10.isPro();
                        } else if (a10.isPro() && a10.getProTypeForFake() == 0) {
                                        z2 = true;
                        }
                        return z2 ? "_db" : "";
        }
piracyUserSuffix(盗版用户后缀),用于识别盗版用户,并上传服务器。&&:与,此处代码理解较为简单。处理方案建议返回空字符串。
最后再看一下拦截提醒的方案
public final boolean h() {
                        User user = new User();
                        if (user.isPro() || user.getProType() != 0 || new SignUserInfo().isPro()) {
                                        return true;
                        }
                        User a10 = defpackage.j.a();
                        if (a10.isLocalMode()) {
                                        return a10.isPro();
                        }
                        return a10.isPro() && a10.getProTypeForFake() == 0;
        }
该代码先初始化用户信息,||:或,全为false时,计算结果为false,否则为true。刚才修改了isPro,返回值为1,这就导致了h方法返回true,提醒无效。如果返回false,代码继续往下运行,它先判断是否为本地模式,再决定如何返回isPro的值,如果是本地模式,你又没有登录过,当然是盗版用户,它是这么一套验证流程。所以处理方案建议直接返回0。

方案, 用户

sdieedu   

看不懂,还是来个github成品吧嘿嘿
之与之   

有成品吗?
gqdsc   


爸爸爱你 发表于 2023-11-27 20:33
跟着大佬的教程完成修改之后出现一个问题
就是登陆后过一段时间就自动退出,需要重新登陆。
大佬分析一下 ...

用本地模式好了,哈哈,同步了就行
gqdsc   


芽衣 发表于 2023-12-14 18:36
你看一下调用就知道了,调用h的代码用于拦截系统通知。

感谢大佬指教,受益匪浅
gqdsc   


K7Rain 发表于 2024-3-16 12:01
可是教程是java代码,其实我两个代码都还不会,只是浅学了一点。大佬我可以看一下你是怎么修 ...

举例说明:
修改smali_classes3\uf\d.smali的最后面h():(【关键】闹钟时间到的拦截提醒,直接返回false
.method public final h()Z
    .locals 4
    .line 1
    const/4 v2, 0x0
    return v2
.end method
其他的你类似修改下就行了
Wisdom_xiaogui   

表示用WeekToDo这个Planner也不错
Wryyy6   

感谢大佬分享,学到了
qq533   

感谢大佬分享,学到了
bucai1   

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

返回顶部