|
|
本帖最后由 Juntianzi 于 2025-12-26 18:15 编辑
ok啊 首先我们 打开软件看一下界面以及vip功能
可以看到目前我们还不是VIP以及无法使用功能
我们点击购买卡密激活跳转到激活页面看看会提示什么
随便输入数字点击激活 返回卡密不存在或者不正确
接下来我们使用mt管理器打开这个app进行分析一下
点击查看进入dex编辑器
然后点击搜索 搜索验证 (刚刚其实点击激活是有应该窗口显示验证中字样)
点击进去进行分析
- .method public final onClick(Landroid/view/View;)V
- .registers 5
- iget p1, p0, Lۦۙۛ/ۦۖۨ;->ۦۖ۫:I
- iget-object v0, p0, Lۦۙۛ/ۦۖۨ;->ۦۖۨ:Lbom/gshy/app/ui/activity/ActivateCardActivity;
- packed-switch p1, :pswitch_data_58
- goto :goto_1c
- :pswitch_8 #0x0
- sget-object p1, Lۦۙۥ/ۦۖ۫;->ۦۖۗ:Lۦۙۥ/ۦۖ۫;
- iget-object p1, p1, Lۦۙۥ/ۦۖ۫;->ۦۖ۠:Ljava/lang/String;
- if-nez p1, :cond_16
- sget p1, Lbom/gshy/app/ui/activity/ActivateCardActivity;->ۦۗۧ:I
- const-string p1, "暂未开启"
- invoke-virtual {v0, p1}, Lۦۙۤ/ۦۖۨ;->ۦۗۤ(Ljava/lang/String;)V
- goto :goto_1b
- :cond_16
- sget v1, Lbom/gshy/app/ui/activity/ActivateCardActivity;->ۦۗۧ:I
- invoke-virtual {v0, p1}, Lۦۙۤ/ۦۖۨ;->ۦۗ۬(Ljava/lang/String;)V
- :goto_1b
- return-void
- :goto_1c
- iget-object p1, v0, Lbom/gshy/app/ui/activity/ActivateCardActivity;->ۦۗۢ:Lbom/gshy/app/databinding/ActivityActivateCardBinding;
- iget-object p1, p1, Lbom/gshy/app/databinding/ActivityActivateCardBinding;->edCard:Landroid/widget/EditText;
- invoke-virtual {p1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
- move-result-object p1
- invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String;
- move-result-object p1
- const-string v1, ""
- invoke-virtual {p1, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
- move-result v1
- if-eqz v1, :cond_36
- const-string p1, "请输入卡密"
- invoke-virtual {v0, p1}, Lۦۙۤ/ۦۖۨ;->ۦۗۤ(Ljava/lang/String;)V
- goto :goto_57
- :cond_36
- new-instance v1, Landroid/app/ProgressDialog;
- invoke-direct {v1, v0}, Landroid/app/ProgressDialog;-><init>(Landroid/content/Context;)V
- const-string v0, "验证中..."
- invoke-virtual {v1, v0}, Landroid/app/ProgressDialog;->setMessage(Ljava/lang/CharSequence;)V
- const/4 v0, 0x0
- invoke-virtual {v1, v0}, Landroid/app/ProgressDialog;->setIndeterminate(Z)V
- const/4 v0, 0x1
- invoke-virtual {v1, v0}, Landroid/app/Dialog;->setCancelable(Z)V
- invoke-virtual {v1}, Landroid/app/Dialog;->show()V
- new-instance v0, Lۦۖۢ/ۦۖ۬;
- const/16 v2, 0x8
- invoke-direct {v0, p0, p1, v1, v2}, Lۦۖۢ/ۦۖ۬;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V
- const-string p1, "cami"
- invoke-static {v0, p1}, Lcom/bumptech/glide/ۦۖۢ;->ۦۙ۬(Lۦۙ۟/ۦۖۥ;Ljava/lang/String;)V
- :goto_57
- return-void
- :pswitch_data_58
- .packed-switch 0x0
- :pswitch_8 #00000000
- .end packed-switch
- .end method
复制代码 可以看到上面代码方法名存在乱码这是被混淆了 我们不用管,接下来讲解这个代码是干什么的
上面这段代码主要获取用户输入的字符串,检查字符串是否等于空字符串 ""
如果为空,弹出提示:"请输入卡密",并结束流程,
如果用户输入了内容,代码会初始化一个 ProgressDialog,
设置显示文字为:"验证中..."。
然后下面新建了一个实例 new-instance v0, Lۦۖۢ/ۦۖ۬;
将当前的点击监听器对象 (p0)、用户输入的卡密字符串 (p1) 以及刚创建的加载弹窗 (v1) 作为参数传入。
最后通过 invoke-static {v0, p1}, ...;->ۦۙ۬ 发起网络请求或异步任务 下面有个cami 这里就是通过刚刚获取的字符串赋值然后从服务器进行请求
知道这段代码做什么的之后我们就已经明确 判断卡密真不真以及激活vip在新建的 new-instance v0, Lۦۖۢ/ۦۖ۬;实例里面
这里我们通过mt找到这个进行跳转
进来之后我们看到非常长的一段代码
- <blockquote>.method public final ۦۖۧ(Lorg/json/JSONObject;)V
复制代码
这段代码是软件的验证逻辑总闸门。它通过 packed-switch 分成了两个验证场景,一个是卡密激活,一个是任务激活
v0指向全局状态类 Lۦۙۥ/ۦۖ۫
v0->ۦۖۢ则是授权开关1为已授权,0为未授权
v1分支判断 8为卡密激活其他的任务激活
p1和v2一个是传入的参数一个则是常量为1
先说卡密激活 (:pswitch_d)
如果代码获取响应 JSON 中的 code 字段,如果 p1 == 1那么则为激活成功,这里退出激活页面
任务答题 (:goto_46)
也是代码获取响应 JSON 中的 code 字段,如果 p1 == 1,则当前进度 ۦۗۧ 加 1,如果进度等于总题数,将 v0->ۦۖۢ 设为 true(解锁),并弹出 “恭喜获得本软件使用权!”
了解怎么校验之后我们进行修改,删除所有的 JSONObject 解析指令(如 getString 和 getInt),并移除了整个 try-catch 异常处理块
直接硬编码指令 iput-boolean v2, v0, Lۦۙۥ/ۦۖ۫;->ۦۖۢ:Z直接硬编码指令 iput-boolean v2, v0, Lۦۙۥ/ۦۖ۫;->ۦۖۢ:Z,因为v0->ۦۖۢ 是该软件的全局授权字段。通过在回调入口处强制写入 True(1)我们就绕过了验证结果
屏蔽了 if-eq p1, v2, :cond_5a 判断以及废弃了原有的自增指令 add-int/2addr v1, v2(进度+1),改为读取数组长度 array-length 并直接赋值给进度字段 ۦۗۧ
如果嫌麻烦可以直接复制下面代码进行替换即可
- .method public final ۦۖۧ(Lorg/json/JSONObject;)V
- .registers 8
-
- sget-object v0, Lۦۙۥ/ۦۖ۫;->ۦۖۗ:Lۦۙۥ/ۦۖ۫;
-
- iget v1, p0, Lۦۖۢ/ۦۖ۬;->ۦۖ۫:I
-
- const/4 v2, 0x1
-
- const-string v3, "code"
-
- iget-object v4, p0, Lۦۖۢ/ۦۖ۬;->ۦۖ۬:Ljava/lang/Object;
- packed-switch v1, :pswitch_data_8c
- goto :goto_task_logic
- :pswitch_d # 0x8
- check-cast v4, Landroid/app/ProgressDialog;
-
- invoke-virtual {v4}, Landroid/app/Dialog;->dismiss()V
- iput-boolean v2, v0, Lۦۙۥ/ۦۖ۫;->ۦۖۢ:Z
- iget-object v1, p0, Lۦۖۢ/ۦۖ۬;->ۦۖۢ:Ljava/lang/Object;
- check-cast v1, Lۦۙۛ/ۦۖۨ;
- iget-object v1, v1, Lۦۙۛ/ۦۖۨ;->ۦۖۨ:Lbom/gshy/app/ui/activity/ActivateCardActivity;
- const-string v4, "破解激活成功!"
- sget v5, Lbom/gshy/app/ui/activity/ActivateCardActivity;->ۦۗۧ:I
- invoke-virtual {v1, v4}, Lۦۙۤ/ۦۖۨ;->ۦۗۤ(Ljava/lang/String;)V
- iget-object p1, p0, Lۦۖۢ/ۦۖ۬;->ۦۖۢ:Ljava/lang/Object;
- check-cast p1, Lۦۙۛ/ۦۖۨ;
- iget-object p1, p1, Lۦۙۛ/ۦۖۨ;->ۦۖۨ:Lbom/gshy/app/ui/activity/ActivateCardActivity;
- invoke-virtual {p1}, Landroid/app/Activity;->finish()V
-
- goto :goto_end
- :goto_task_logic
- iget-object p1, p0, Lۦۖۢ/ۦۖ۬;->ۦۖۢ:Ljava/lang/Object;
- check-cast p1, Lۦۙۛ/ۦۗ۬;
- iget-object p1, p1, Lۦۙۛ/ۦۗ۬;->ۦۖ۫:Lbom/gshy/app/ui/activity/TaskActivity;
- iget v1, p1, Lbom/gshy/app/ui/activity/TaskActivity;->ۦۗۧ:I
- add-int/2addr v1, v2
- iput v1, p1, Lbom/gshy/app/ui/activity/TaskActivity;->ۦۗۧ:I
- iget-object v3, p1, Lbom/gshy/app/ui/activity/TaskActivity;->ۦۗۥ:[I
- array-length v3, v3
- if-ne v1, v3, :cond_7b
- iput-boolean v2, v0, Lۦۙۥ/ۦۖ۫;->ۦۖۢ:Z
- const-string v0, "恭喜获得本软件使用权!"
- invoke-virtual {p1, v0}, Lۦۙۤ/ۦۖۨ;->ۦۗۤ(Ljava/lang/String;)V
- iget-object p1, p0, Lۦۖۢ/ۦۖ۬;->ۦۖۢ:Ljava/lang/Object;
- check-cast p1, Lۦۙۛ/ۦۗ۬;
- iget-object p1, p1, Lۦۙۛ/ۦۗ۬;->ۦۖ۫:Lbom/gshy/app/ui/activity/TaskActivity;
- invoke-virtual {p1}, Landroid/app/Activity;->finish()V
- goto :goto_85
- :cond_7b
- const-string v0, "本项任务完成,请继续!"
- invoke-virtual {p1, v0}, Lۦۙۤ/ۦۖۨ;->ۦۗۤ(Ljava/lang/String;)V
-
- new-instance v0, Landroidx/activity/ۦۖۥ;
- const/16 v1, 0xe
- invoke-direct {v0, v1, p0}, Landroidx/activity/ۦۖۥ;-><init>(ILjava/lang/Object;)V
- invoke-virtual {p1, v0}, Landroid/app/Activity;->runOnUiThread(Ljava/lang/Runnable;)V
- :goto_85
- check-cast v4, Landroid/app/AlertDialog;
- invoke-virtual {v4}, Landroid/app/Dialog;->dismiss()V
- return-void
-
- :goto_end
- return-void
- :pswitch_data_8c
- .packed-switch 0x8
- :pswitch_d #00000008
- .end packed-switch
- .end method
复制代码 修改完之后我们返回对软件重新打包以及签名进行安装
打开app进入我的可以看到还没有显示是vip
我们点击购买永久卡密进去激活看看
随便输入数字点击激活可以看到返回我的页面并且vip也已经显示出来了
我们点击旁边功能看看功能是否可以使用
可以看到都是可以使用的,也算是成功了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:金币 +2
|