狗语翻译器破解教程+成品
本帖最后由 schoolyears 于 2019-3-20 21:07 编辑新人贴,听说这儿管得严,先发个教程避免删除ID。
有一段时间已经不破解了,所以拿之前帮人破解的软件来举例,先奉上软件链接吧。
未修改版本请百度。
破解版地址:https://www.lanzouj.com/i3fvb2h
破解说明:去除广告以及每天2次限制转换功能。如图。
VIP界面。
https://ws3.sinaimg.cn/large/005BYqpgly1g11js9cak0j30u01qgjv2.jpg
收费界面+广告
https://ws3.sinaimg.cn/large/005BYqpgly1g11jt28r3ij30u01qgh1g.jpg
下面开始破解教程。
第一步:打开mt管理器,选择第一个dex,用dex++打开,选择常量,搜索VIP,滑到最下面,看到VIP到期时间这几个字,如图。
https://ws3.sinaimg.cn/large/005BYqpgly1g11jz4qxisj30u01qgtcs.jpg
https://ws3.sinaimg.cn/large/005BYqpgly1g11jznk504j30u01qgdix.jpg
因为之前界面提示需要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,但是依旧要收费。如图
https://ws3.sinaimg.cn/large/005BYqpgly1g11ka3tkbtj30u01qg427.jpg
通过调转调用这个方法的几个方法名我也都测试了,全部不对,太麻烦就不截图了。
通过继续分析,我们发现了这个代码。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。
编译测试。
https://ws3.sinaimg.cn/large/005BYqpgly1g11kqjtv5sj30u01qghdt.jpg
发现并没有提示开通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
保存编译就可以了。
或者直接删除联网权限,修改了收费功能之后点击长按说话按钮并不会联网验证,所以可以直接当单机使用。
到这里破解完成。
我估计在狗界是不是也分国内狗和国外狗?也许?它们不是用一种语言,还有地方狗和地方狗是不是也有口音?
莫名其妙的想笑,哈哈哈哈 nasc 发表于 2019-3-20 17:45
真的么?听懂狗狗的语言?
娱乐软件而已,破解方法有点技巧所以写个教程 所以成品呢。。? 好像链接都挂了呢? 头一次听说还有这种软件呢,国外的狗怎么通用吗
? 真的么?听懂狗狗的语言?{:1_904:} 长歌 发表于 2019-3-20 11:23
所以成品呢。。?
补上链接了 ……我觉得外国狗和中国狗说的八成不是一种语言= = 来看看 学习下。 分享 感谢分享。。。