|
|
发表于
2024-11-12 22:25:00
来自手机
|
显示全部楼层
| 阅读模式
来自 四川
本帖最后由 Steve2280 于 2024-11-17 02:17 编辑
本次求助帖来源:https://bbs.binmt.cc/thread-141817-1-1.html
在逛论坛的时候发现了这个求助帖,于是下下来进行分析
打开Apk一看,好家伙,dc,io文件夹,然后又看了一下assets文件夹,可以确定了,是js化的App,或者说是web化的App
之前我也解决过一些同类App,于是直接打开app_service.js,想着"会赢的"
js化的app里的汉字部分全部是unicode编码,不过没关系,使用MT的格式化可以在格式化代码的同时将unicode转回汉字
在格式化后我搜索了App里的"未解锁",结果发现找不到
怎么回事呢?往下翻代码的时候才发现居然有一部分代码因为变成了json格式所以其中的unicode没有被格式化!
然后我使用了unicode转化的网站
https://m.bejson.com/convert/unicode_chinese/
直接将未解锁转为了对应的unicode代码,并进行搜索
好消息:有结果
坏消息:找不到谁调用了它
即使搜索musicFail得到的结果也是2个一模一样的json
我想起了之前破解的以观书法App,于是打算直接打个alert在这个json所在的function里,打算通过这种方式查看它的调用堆栈
结果
App白屏了,很明显,软件炸了,也许这个App并不支持alert方法
这下我楞住了
我尝试使用一些可能的关键词,例如lock和unlock,找到了几个可能的方法,但是在尝试后发现没用
到这里我陷入了困境
难不成这次破解要变成"对不起一炷香大人,没让你使出全力"了?
不甘心的我再次打开App反复观看,突然想到了一个切入点:颜色
没错,整个App只有"未解锁"这三个字是红色的!
于是我使用了一个很久都没有使用到的MT功能-屏幕取色
开启取色功能后我移动吸管到文本中心,得到了这么一个颜色hex:#DD524D
接下来我回到Apk,进入assets文件夹,点击搜索并勾选高级搜索,内容为#DD524D
得到了一个搜索结果:
照例使用格式化
进入文件后搜索#DD524D
根据代码里的一些信息,这其实是一个vue或者类似vue构建的App
我们搜索"fail"
在其中一个结果里发现了可疑调用
并且在其上下文发现了更加可疑的musicFail,在搜索musicFail后发现它没啥用
那么就关注一下这个调用的附近的代码
最后发现了nowMusic这种东西
- }, [e._v(e._s(e.t("choose.musicSuccess")))])])] : [e.isIos() ? n("view", [1 == e.vip || e.imageAdHave(t.url) ? n("view", {
- staticClass: ["item"],
- class: [A == e.nowMusic ? "active" : "nactive"]
- }, [n("u-text", {
- staticClass: ["name"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(t.name))]), n("u-text", {
- staticClass: ["success"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(e.t("choose.musicSuccess")))])]) : n("view", {
- staticClass: ["item"],
- class: [A == e.nowMusic ? "active" : "nactive"],
- attrs: {
- mode: "aspectFit"
- }
- }, [n("u-text", {
- staticClass: ["name"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(t.name))]), n("u-text", {
- staticClass: ["fail"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(e.t("choose.musicFail")))])])]) : n("view", [e.imageAdHave(t.url) ? n("view", {
- staticClass: ["item"],
- class: [A == e.nowMusic ? "active" : "nactive"]
- }, [n("u-text", {
- staticClass: ["name"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(t.name))]), n("u-text", {
- staticClass: ["success"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(e.t("choose.musicSuccess")))])]) : n("view", {
- staticClass: ["item"],
- class: [A == e.nowMusic ? "active" : "nactive"],
- attrs: {
- mode: "aspectFit"
- }
- }, [n("u-text", {
- staticClass: ["name"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(t.name))]), n("u-text", {
- staticClass: ["fail"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(e.t("choose.musicFail")))])])])])])
- })), 0), n("view", {
- staticClass: ["title"]
- }, [e.isIos() ? n("u-text", {
- staticClass: ["text"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(e.t("choose.unlock1")) + e._s(e.t("choose.smoke")))]) : n("u-text", {
- staticClass: ["text"],
- appendAsTree: !0,
- attrs: {
- append: "tree"
- }
- }, [e._v(e._s(e.t("choose.unlock2")) + e._s(e.t("choose.smoke")))])]), n("view", {
- staticClass: ["choose-smoke"]
- }, e._l(e.flys, (function(t, A) {
- return n("view", {
- staticClass: ["smoke"],
- on: {
- click: function(t) {
- e.choose(A, 2)
- }
- }
- }, [0 == A ? n("view", [n("u-image", {
- staticClass: ["img"],
- class: [A == e.nowSmoke ? "active" : "nactive"],
- attrs: {
- mode: "aspectFit",
- src: t
- }
复制代码
既然有nowMusic,那么假设当我点击音乐并更改成功后肯定这个nowMusic会发生变动
再结合切换完成后的提示:"更换成功"
结合后可以定位到这个方法
接下来我们搜索以下这个change方法有谁在调用
找到了这个方法
- choose: function(e, t) {
- var n;
- switch (t) {
- case 1:
- if (this.nowMusic = e, n = this.musics[this.nowMusic], 0 != e && !(this.imageAdHave(n.url) || this.vip && this.isIos())) return void this.chooseMenu(t);
- break;
- case 2:
- if (this.nowSmoke = e, n = this.flys[this.nowSmoke], 0 != e && !(this.imageAdHave(n) || this.vip && this.isIos())) return void this.chooseMenu(t)
- }
- this.change(t)
- },
复制代码
很明显,当t的值为1和2并且满足一定条件时才会执行我们的change方法,因为对应的条件分析复杂,所以我们直接删除这个switch,仅保留this.change(t)
此时App的功能已经可用,就是显示的不可用
接下来让我们搞一下这个布局部分
在assets文件夹里找了一番,发现问号图标是0.png
我们搜索一下0.png
虽然很复杂,但这个其实类似a==b?xxx:xxxx
所以我们直接把
0 == A
改为
0==0
不直接赋值A是怕会损坏选择逻辑
Music同理
编译打包安装,破解成功
(我顺便改了一些字)
至此,教程结束
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +7
金币 +6
|