吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10559|回复: 20
收起左侧

[Android 原创] 狗语翻译器破解教程+成品

[复制链接]
schoolyears 发表于 2019-3-13 23:17
本帖最后由 schoolyears 于 2019-3-20 21:07 编辑

新人贴,听说这儿管得严,先发个教程避免删除ID。

有一段时间已经不破解了,所以拿之前帮人破解的软件来举例,先奉上软件链接吧。

未修改版本请百度。

破解版地址:  https://www.lanzouj.com/i3fvb2h

破解说明:去除广告以及每天2次限制转换功能。如图。

VIP界面。


收费界面+广告



下面开始破解教程。

第一步:打开mt管理器,选择第一个dex,用dex++打开,选择常量,搜索VIP,滑到最下面,看到VIP到期时间这几个字,如图。


因为之前界面提示需要VIP使用,所以第一时间肯定是搜索VIP尝试。


第二步:点击调转过去,看到如下代码。
.method public final initVipStatus()V
    .registers 7
    .annotation build Landroid/annotation/SuppressLint;
        value = {
            "SetTextI18n"
        }
    .end annotation

    .line 68
    sget-object v0, Lcom/planapps/dog/user/UserManager;->INSTANCE:Lcom/planapps/dog/user/UserManager;

    invoke-virtual {v0}, Lcom/planapps/dog/user/UserManager;->getUser()Lcom/planapps/dog/data/UserBean;

    move-result-object v0

    const/4 v1, 0x0

    if-eqz v0, :cond_14

    invoke-virtual {v0}, Lcom/planapps/dog/data/UserBean;->getVipBean()Lcom/planapps/dog/data/VipBean;

    move-result-object v0

    if-eqz v0, :cond_14

    invoke-virtual {v0}, Lcom/planapps/dog/data/VipBean;->getVip()I

    move-result v0

    goto :goto_15

    :cond_14
    const/4 v0, 0x0

    :goto_15
    const/4 v2, 0x1

    const/4 v3, 0x4

    const/4 v4, 0x0

    if-ne v0, v2, :cond_81

    .line 69
    sget v0, Lcom/planapps/dog/R$id;->vip_group:I

    invoke-virtual {p0, v0}, Lcom/planapps/dog/ui/activity/PurchaseActivity;->_$_findCachedViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/support/constraint/Group;

    const-string v2, "vip_group"

    invoke-static {v0, v2}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {v0, v1}, Landroid/support/constraint/Group;->setVisibility(I)V

    .line 70
    sget v0, Lcom/planapps/dog/R$id;->normal_group:I

    invoke-virtual {p0, v0}, Lcom/planapps/dog/ui/activity/PurchaseActivity;->_$_findCachedViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/support/constraint/Group;

    const-string v1, "normal_group"

    invoke-static {v0, v1}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {v0, v3}, Landroid/support/constraint/Group;->setVisibility(I)V

    .line 71
    sget-object v0, Lcom/planapps/dog/user/UserManager;->INSTANCE:Lcom/planapps/dog/user/UserManager;

    invoke-virtual {v0}, Lcom/planapps/dog/user/UserManager;->getUser()Lcom/planapps/dog/data/UserBean;

    move-result-object v0

    if-eqz v0, :cond_47

    invoke-virtual {v0}, Lcom/planapps/dog/data/UserBean;->getVipBean()Lcom/planapps/dog/data/VipBean;

    move-result-object v0

    goto :goto_48

    :cond_47
    move-object v0, v4

    .line 72
    :goto_48
    sget v1, Lcom/planapps/dog/R$id;->vip_end_tv:I

    invoke-virtual {p0, v1}, Lcom/planapps/dog/ui/activity/PurchaseActivity;->_$_findCachedViewById(I)Landroid/view/View;

    move-result-object v1

    check-cast v1, Landroid/widget/TextView;

    const-string v2, "vip_end_tv"

    invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v3, "您的vip到期时间为"

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    if-eqz v0, :cond_65

    invoke-virtual {v0}, Lcom/planapps/dog/data/VipBean;->getVipEnd()Ljava/lang/String;

    move-result-object v4

    :cond_65
    invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    check-cast v0, Ljava/lang/CharSequence;

    invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 73
    sget v0, Lcom/planapps/dog/R$id;->update_iv:I

    invoke-virtual {p0, v0}, Lcom/planapps/dog/ui/activity/PurchaseActivity;->_$_findCachedViewById(I)Landroid/view/View;

    move-result-object v0

    check-cast v0, Landroid/widget/ImageView;

    const v1, 0x7f0800ef

    invoke-virtual {v0, v1}, Landroid/widget/ImageView;->setImageResource(I)V

    goto/16 :goto_13d

代码比较多,只写这点。简单分析一下。if-ne v0, v2, :cond_81,81是开通VIP代码。(这里没有写出来,太长了。)

我们可以看到v0和v2不等的话就会跳转,调转过去就会收费,所以可以猜测这就是关键代码。而v2的值等于1,所以把v0值也改成1。如下

:cond_14
    const/4 v0, 0x0

    :goto_15
    const/4 v2, 0x1

修改测试之后,发现显示已经是VIP,但是依旧要收费。如图


通过调转调用这个方法的几个方法名我也都测试了,全部不对,太麻烦就不截图了。

通过继续分析,我们发现了这个代码。show_limit(限制弹窗)搜索查看代码如下。
.method public final showPurchaseNotice()V
    .registers 3

    .line 175
    iget-object v0, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->useUpDialog:Landroid/app/Dialog;

    if-eqz v0, :cond_e

    iget-object v0, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->useUpDialog:Landroid/app/Dialog;

    if-eqz v0, :cond_27

    invoke-virtual {v0}, Landroid/app/Dialog;->isShowing()Z

    move-result v0

    if-nez v0, :cond_27

    .line 176
    :cond_e
    iget-object v0, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->mActivity:Landroid/app/Activity;

    check-cast v0, Landroid/content/Context;

    const-string v1, "show_limit"

    invoke-static {v0, v1}, Lcom/umeng/analytics/MobclickAgent;->onEvent(Landroid/content/Context;Ljava/lang/String;)V

    .line 177
    invoke-virtual {p0}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->getMvpPresenter()Lcom/cherish/basekit/mvp/presenter/MvpPresenter;

    move-result-object v0

    check-cast v0, Lcom/planapps/dog/ui/presenter/fragment/PresenterDog;

    new-instance v1, Lcom/planapps/dog/ui/fragment/SuckDogFragment$showPurchaseNotice$1;

    invoke-direct {v1, p0}, Lcom/planapps/dog/ui/fragment/SuckDogFragment$showPurchaseNotice$1;-><init>(Lcom/planapps/dog/ui/fragment/SuckDogFragment;)V

    check-cast v1, Lcom/planapps/dog/ui/model/PurchaseModel$PriceLoadListener;

    invoke-virtual {v0, v1}, Lcom/planapps/dog/ui/presenter/fragment/PresenterDog;->loadPrices(Lcom/planapps/dog/ui/model/PurchaseModel$PriceLoadListener;)V

    :cond_27
    return-void

发现并没有关键,调转到27是直接返回,无用。所以我们需要知道是谁调用了这个方法。搜索如下代码。

Lcom/planapps/dog/ui/fragment/SuckDogFragment;->showPurchaseNotice()V

两个结果,第二个可以直接排除。点击第一个,代码如下。
# virtual methods
.method public final onTouch(Landroid/view/View;Landroid/view/MotionEvent;)Z
    .registers 7

    const-string p1, "event"

    .line 132
    invoke-static {p2, p1}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {p2}, Landroid/view/MotionEvent;->getAction()I

    move-result p1

    const/4 v0, 0x1

    if-ne p1, v0, :cond_17

    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->this$0:Lcom/planapps/dog/ui/fragment/SuckDogFragment;

    invoke-static {p1}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->access$getMAudioRecoderUtil$p(Lcom/planapps/dog/ui/fragment/SuckDogFragment;)Lcom/planapps/dog/utils/AudioRecorderUtil;

    move-result-object p1

    invoke-virtual {p1}, Lcom/planapps/dog/utils/AudioRecorderUtil;->stopRecord()J

    goto/16 :goto_117

    .line 133
    :cond_17
    invoke-virtual {p2}, Landroid/view/MotionEvent;->getAction()I

    move-result p1

    if-nez p1, :cond_10b

    .line 134
    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->this$0:Lcom/planapps/dog/ui/fragment/SuckDogFragment;

    invoke-static {p1}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->access$getMActivity$p(Lcom/planapps/dog/ui/fragment/SuckDogFragment;)Landroid/app/Activity;

    move-result-object p1

    check-cast p1, Landroid/content/Context;

    const-string p2, "click_talk"

    invoke-static {p1, p2}, Lcom/umeng/analytics/MobclickAgent;->onEvent(Landroid/content/Context;Ljava/lang/String;)V

    .line 135
    invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar;

    move-result-object p1

    .line 136
    new-instance p2, Ljava/lang/StringBuilder;

    invoke-direct {p2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "trans_times_by_day"

    invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {p1, v0}, Ljava/util/Calendar;->get(I)I

    move-result v1

    invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    const/16 v1, 0x2d

    invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;

    const/4 v2, 0x2

    invoke-virtual {p1, v2}, Ljava/util/Calendar;->get(I)I

    move-result v3

    invoke-virtual {p2, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    invoke-virtual {p2, v1}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;

    const/4 v1, 0x5

    invoke-virtual {p1, v1}, Ljava/util/Calendar;->get(I)I

    move-result p1

    invoke-virtual {p2, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    invoke-virtual {p2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p1

    .line 137
    invoke-static {}, Lcom/adesk/polymers/ads/utils/SPUtils;->getInstance()Lcom/adesk/polymers/ads/utils/SPUtils;

    move-result-object p2

    const/4 v1, 0x0

    invoke-virtual {p2, p1, v1}, Lcom/adesk/polymers/ads/utils/SPUtils;->getInt(Ljava/lang/String;I)I

    move-result p1

    if-lt p1, v2, :cond_a5

    .line 139
    sget-object p1, Lcom/planapps/dog/user/UserManager;->INSTANCE:Lcom/planapps/dog/user/UserManager;

    invoke-virtual {p1}, Lcom/planapps/dog/user/UserManager;->getUser()Lcom/planapps/dog/data/UserBean;

    move-result-object p1

    if-eqz p1, :cond_79

    invoke-virtual {p1}, Lcom/planapps/dog/data/UserBean;->getVipBean()Lcom/planapps/dog/data/VipBean;

    move-result-object p1

    if-eqz p1, :cond_79

    invoke-virtual {p1}, Lcom/planapps/dog/data/VipBean;->getVip()I

    move-result p1

    goto :goto_7a

    :cond_79
    const/4 p1, 0x0

    :goto_7a
    if-nez p1, :cond_a5

    .line 140
    sget-object p1, Lcom/planapps/dog/user/UserManager;->INSTANCE:Lcom/planapps/dog/user/UserManager;

    invoke-virtual {p1}, Lcom/planapps/dog/user/UserManager;->getUser()Lcom/planapps/dog/data/UserBean;

    move-result-object p1

    if-eqz p1, :cond_8f

    invoke-virtual {p1}, Lcom/planapps/dog/data/UserBean;->getVipBean()Lcom/planapps/dog/data/VipBean;

    move-result-object p1

    if-eqz p1, :cond_8f

    invoke-virtual {p1}, Lcom/planapps/dog/data/VipBean;->getVipTimes()I

    move-result p1

    goto :goto_90

    :cond_8f
    const/4 p1, 0x0

    :goto_90
    if-gtz p1, :cond_98

    .line 141
    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->this$0:Lcom/planapps/dog/ui/fragment/SuckDogFragment;

    invoke-virtual {p1}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->showPurchaseNotice()V

    return v0

    .line 144
    :cond_98
    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->this$0:Lcom/planapps/dog/ui/fragment/SuckDogFragment;

    invoke-virtual {p1}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->getMvpPresenter()Lcom/cherish/basekit/mvp/presenter/MvpPresenter;

    move-result-object p1

    check-cast p1, Lcom/planapps/dog/ui/presenter/fragment/PresenterDog;

    if-eqz p1, :cond_a5

    invoke-virtual {p1}, Lcom/planapps/dog/ui/presenter/fragment/PresenterDog;->consumeVipTimes()V

    .line 147
    :cond_a5
    invoke-static {}, Lcom/yhd/hdmediaplayer/MediaPlayerHelper;->getInstance()Lcom/yhd/hdmediaplayer/MediaPlayerHelper;

    move-result-object p1

    const-string p2, "MediaPlayerHelper.getInstance()"

    invoke-static {p1, p2}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {p1}, Lcom/yhd/hdmediaplayer/MediaPlayerHelper;->getMediaPlayer()Landroid/media/MediaPlayer;

    move-result-object p1

    const-string p2, "MediaPlayerHelper.getInstance().mediaPlayer"

    invoke-static {p1, p2}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {p1}, Landroid/media/MediaPlayer;->isPlaying()Z

    move-result p1

    if-eqz p1, :cond_cd

    .line 148
    invoke-static {}, Lcom/yhd/hdmediaplayer/MediaPlayerHelper;->getInstance()Lcom/yhd/hdmediaplayer/MediaPlayerHelper;

    move-result-object p1

    const-string p2, "MediaPlayerHelper.getInstance()"

    invoke-static {p1, p2}, Lkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V

    invoke-virtual {p1}, Lcom/yhd/hdmediaplayer/MediaPlayerHelper;->getMediaPlayer()Landroid/media/MediaPlayer;

    move-result-object p1

    invoke-virtual {p1}, Landroid/media/MediaPlayer;->pause()V

    .line 150
    :cond_cd
    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->$rxPermissions:Lcom/tbruyelle/rxpermissions2/RxPermissions;

    const-string p2, "android.permission.WRITE_EXTERNAL_STORAGE"

    invoke-virtual {p1, p2}, Lcom/tbruyelle/rxpermissions2/RxPermissions;->isGranted(Ljava/lang/String;)Z

    move-result p1

    .line 151
    iget-object p2, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->$rxPermissions:Lcom/tbruyelle/rxpermissions2/RxPermissions;

    const-string v3, "android.permission.RECORD_AUDIO"

    invoke-virtual {p2, v3}, Lcom/tbruyelle/rxpermissions2/RxPermissions;->isGranted(Ljava/lang/String;)Z

    move-result p2

    if-eqz p1, :cond_e3

    if-eqz p2, :cond_e3

    const/4 p1, 0x1

    goto :goto_e4

    :cond_e3
    const/4 p1, 0x0

    :goto_e4
    if-ne p1, v0, :cond_f0

    .line 153
    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->this$0:Lcom/planapps/dog/ui/fragment/SuckDogFragment;

    invoke-static {p1}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->access$getMAudioRecoderUtil$p(Lcom/planapps/dog/ui/fragment/SuckDogFragment;)Lcom/planapps/dog/utils/AudioRecorderUtil;

    move-result-object p1

    invoke-virtual {p1}, Lcom/planapps/dog/utils/AudioRecorderUtil;->startRecord()V

    goto :goto_117

    .line 155
    :cond_f0
    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->$rxPermissions:Lcom/tbruyelle/rxpermissions2/RxPermissions;

    new-array p2, v2, [Ljava/lang/String;

    const-string v2, "android.permission.RECORD_AUDIO"

    aput-object v2, p2, v1

    const-string v1, "android.permission.WRITE_EXTERNAL_STORAGE"

    aput-object v1, p2, v0

    invoke-virtual {p1, p2}, Lcom/tbruyelle/rxpermissions2/RxPermissions;->request([Ljava/lang/String;)Lio/reactivex/Observable;

    move-result-object p1

    .line 156
    new-instance p2, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3$1;

    invoke-direct {p2, p0}, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3$1;-><init>(Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;)V

    check-cast p2, Lio/reactivex/functions/Consumer;

    invoke-virtual {p1, p2}, Lio/reactivex/Observable;->subscribe(Lio/reactivex/functions/Consumer;)Lio/reactivex/disposables/Disposable;

    goto :goto_117

    .line 167
    :cond_10b
    invoke-virtual {p2}, Landroid/view/MotionEvent;->getAction()I

    move-result p1

    const/4 p2, 0x3

    if-ne p1, p2, :cond_117

    iget-object p1, p0, Lcom/planapps/dog/ui/fragment/SuckDogFragment$setUpView$3;->this$0:Lcom/planapps/dog/ui/fragment/SuckDogFragment;

    invoke-virtual {p1}, Lcom/planapps/dog/ui/fragment/SuckDogFragment;->stateNormal()V

    :cond_117
    :goto_117
    return v0
.end method
可以看到这段代码调用了getVipBean、vip、getVipTimes等方法。

但是这几个方法一开始我就尝试了,赋值是不行的。通过判断,看到这段代码调转结果很统一。比如

invoke-virtual {p1}, Lcom/planapps/dog/user/UserManager;->getUser()Lcom/planapps/dog/data/UserBean;

    move-result-object p1

    if-eqz p1, :cond_8f

    invoke-virtual {p1}, Lcom/planapps/dog/data/UserBean;->getVipBean()Lcom/planapps/dog/data/VipBean;

    move-result-object p1

    if-eqz p1, :cond_8f

    invoke-virtual {p1}, Lcom/planapps/dog/data/VipBean;->getVipTimes()I

    move-result p1

    goto :goto_90

    :cond_8f
    const/4 p1, 0x0
它获取了vip方法之后调转到结果。也就是const/4 p1, 0x0,并且几个判断全部都是这样。

所以把这个方法所有const/4 p1, 0x0代码都改成const/4 p1, 0x1。

编译测试。



发现并没有提示开通vip,所以这个方法才是真正的vip判断代码。

发现搜索vip方法并不能去除广告,所以写一个去广告教程。

dex++打开第一个dex,字符串搜索广告

找到关键词 广告已被禁用,调转,删除多余代码,只保留以下代码。
    const-string p1, "广告已被禁用"

    .line 79
    invoke-static {p1}, Lcom/adesk/polymers/ads/utils/LogUtils;->e(Ljava/lang/Object;)V

    const/4 p1, 0x0

    return-object p1
保存编译就可以了。

或者直接删除联网权限,修改了收费功能之后点击长按说话按钮并不会联网验证,所以可以直接当单机使用。

到这里破解完成。

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
thepassion + 1 + 1 热心回复!
0x指纹 + 1 + 1 学习到了,十分感谢

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wanln0513 发表于 2019-3-28 16:43
我估计在狗界是不是也分国内狗和国外狗?也许?它们不是用一种语言,还有地方狗和地方狗是不是也有口音?
莫名其妙的想笑,哈哈哈哈
 楼主| schoolyears 发表于 2019-3-20 21:11 来自手机
nasc 发表于 2019-3-20 17:45
真的么?听懂狗狗的语言?

娱乐软件而已,破解方法有点技巧所以写个教程
长歌 发表于 2019-3-20 11:23
cch2929 发表于 2019-3-20 16:30
好像链接都挂了呢?
英伦69 发表于 2019-3-20 17:22
头一次听说还有这种软件呢,国外的狗怎么通用吗
nasc 发表于 2019-3-20 17:45
真的么?听懂狗狗的语言?
 楼主| schoolyears 发表于 2019-3-20 21:10 来自手机
长歌 发表于 2019-3-20 11:23
所以成品呢。。?

补上链接了
zzzlxfe 发表于 2019-3-20 22:22
……我觉得外国狗和中国狗说的八成不是一种语言= =
埖落 发表于 2019-3-21 09:57
来看看 学习下。   分享
kai666 发表于 2019-3-22 21:07
感谢分享。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表