Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

不解密题目,改判题逻辑和小学生保护题库解决办法 #10

Open
ulua3809 opened this issue Oct 11, 2024 · 12 comments
Open

Comments

@ulua3809
Copy link

ulua3809 commented Oct 11, 2024

注意:此方法练习无效,因为练习不是webview页面,只对pk有用,想冲榜的可以看看之前的老方法

有人反馈在3.93.3版本方法无效,见这里,实测在3.93.2版本还有效,截至10/13 10:03,不行的话可以降级试试,还不行的话大概是热更新修了

示例视频

视频剪辑了一下,压缩一下大小,PK部分4x速,剪的有点意识流,见谅

studio_video_1728699248331.mp4

url是
https://leo.fbcontent.cn/bh5/leo-web-oral-pk/exercise_*.js
其中*为一串16进制的值
找到响应中isRight后面的函数,本例为
cs(t)
把js中的所有cs(t)替换成cs(t)||true

不要直接照抄,本例中是cs(t),脚本会混淆,认准isRight后面的函数!!!

替换前

Za.value && o().prototype.$addFrog("/time/oral/onRecognize", {
                duration: Date.now() - $a.value,
                keypointId: null === (r = Ka.value) || void 0 === r ? void 0 : r.keypointId,
                ruleType: null === (n = Ka.value) || void 0 === n ? void 0 : n.ruleType,
                isOralPk: !0,
                recognizeResult: t,
                answers: null === (i = Ka.value) || void 0 === i ? void 0 : i.answers,
                isRight: cs(t) || "false",
                stokeCount: e
            });
            cs(t) ? is(t, e) : (window.clearTimeout(Xa.value),
            Xa.value = setTimeout((function() {
                Ya.value.length === e && is(t, e)
            }
            ), 700))
        }
          , is = function(t, e) {
            var r, n, i, a = {
                recognizeResult: t,
                pathPoints: Ya.value,
                answer: cs(t) ? 1 : 0,
                showReductionFraction: !cs(t) && as(t) ? 1 : 0
            };
            (ts.value(a),
            Za.value) && (o().prototype.$addFrog("/time/oral/singleQuestion", {
                duration: Date.now() - $a.value,
                keypointId: null === (r = Ka.value) || void 0 === r ? void 0 : r.keypointId,
                ruleType: null === (n = Ka.value) || void 0 === n ? void 0 : n.ruleType,
                isOralPk: !0,
                stokeCount: e,
                result: t,
                answer: null === (i = Ka.value) || void 0 === i ? void 0 : i.answers,
                isRight: cs(t) || "false"
            }),
            Za.value = !1);
            ls()
        }

替换后

Za.value && o().prototype.$addFrog("/time/oral/onRecognize", {
                duration: Date.now() - $a.value,
                keypointId: null === (r = Ka.value) || void 0 === r ? void 0 : r.keypointId,
                ruleType: null === (n = Ka.value) || void 0 === n ? void 0 : n.ruleType,
                isOralPk: !0,
                recognizeResult: t,
                answers: null === (i = Ka.value) || void 0 === i ? void 0 : i.answers,
                isRight: cs(t)||true || "false",
                stokeCount: e
            });
            cs(t)||true ? is(t, e) : (window.clearTimeout(Xa.value),
            Xa.value = setTimeout((function() {
                Ya.value.length === e && is(t, e)
            }
            ), 700))
        }
          , is = function(t, e) {
            var r, n, i, a = {
                recognizeResult: t,
                pathPoints: Ya.value,
                answer: cs(t)||true ? 1 : 0,
                showReductionFraction: !cs(t)||true && as(t) ? 1 : 0
            };
            (ts.value(a),
            Za.value) && (o().prototype.$addFrog("/time/oral/singleQuestion", {
                duration: Date.now() - $a.value,
                keypointId: null === (r = Ka.value) || void 0 === r ? void 0 : r.keypointId,
                ruleType: null === (n = Ka.value) || void 0 === n ? void 0 : n.ruleType,
                isOralPk: !0,
                stokeCount: e,
                result: t,
                answer: null === (i = Ka.value) || void 0 === i ? void 0 : i.answers,
                isRight: cs(t)||true || "false"
            }),
            Za.value = !1);
            ls()
        }

注意,js经过混淆,函数名字可能会不同
任意答案都判对,但是会提示注意约分
小学生验证题库也在这个js里,目前只有几道题,(应该是临时编的)

image

10/11 20:55 更新

js貌似是按时轮换的,固定的替换没有什么用
另外最好配合webviewpp模块和电脑上的chrome inspect使用
选择这个页面
image
勾上这个
image
ctrl+r强制刷新,不然有缓存抓包抓不到,找个工具重写响应就ok了

实现流程

没有在Python上验证过,可能有问题,但思路应该是对的

# 1. 正则匹配,拿到函数名

funname = re.search(r"(?<=isRight:)[^,]*?\(.*?\).*?(?=\|)",responsetext).group()

# 2. 替换响应并返回

responsetext = responsetext.replace(funname,funname +"||true")

# 3. 最后responsetext就是改写好的js响应了

10/12 03:11更新

方案基本定型了,除非官方又整活,之后不更新了,官方整活也不更了

如果发现没有包,多半是缓存没过期,可以到设置 应用详情 清除应用缓存,然后开始重写

proxypin重写js脚本示例

url填https://leo.fbcontent.cn/bh5/leo-web-oral-pk/exercise_*.js

另外发现同path的pk_*.js,结构和上面那个类似,实测只要改exercise_*.js就好了

async function onRequest(context, request) {
   console.log(request.url);
   return request;
}

async function onResponse(context, request, response) {
   var funname = response.body.match(/(?<=isRight:)[^,]*?\(.*?\).*?(?=\|)/);
   console.log("替换函数名为:", funname);
   if (funname) {
      console.log("找到函数,开始替换")
      response.body = response.body.replaceAll(funname, funname + "||true");
   }
   return response;
}
@Harkerbest
Copy link

那我应该可以用mitmproxy正则表达式匹配到这个js的请求,然后再正则表达式修改isright后面的内容,明天尝试一下

@ulua3809
Copy link
Author

那我应该可以用mitmproxy正则表达式匹配到这个js的请求,然后再正则表达式修改isright后面的内容,明天尝试一下

之前讲的不是很准确,方法是先正则匹配isright后面的函数xx(x)再把js中所有的xx(x)替换成xx(x)||true写正则的时候注意一下原来的js是压缩过的,示例是格式化之后的js

@ABC360DEF
Copy link

中国速度太牛了老哥

@xperiavnc
Copy link

安卓端proxypin貌似改了无效果Screenshot_2024-10-12-09-51-25-725_bin.mt.plus.jpg

@ulua3809
Copy link
Author

安卓端proxypin貌似改了无效果Screenshot_2024-10-12-09-51-25-725_bin.mt.plus.jpg

版本3.93.2还有用

视频剪辑了一下,压缩一下大小,PK部分4x速,剪的有点意识流,见谅

studio_video_1728699248331.mp4

@xperiavnc
Copy link

安卓端proxypin貌似改了无效果Screenshot_2024-10-12-09-51-25-725_bin.mt.plus.jpg

版本3.93.2还有用

视频剪辑了一下,压缩一下大小,PK部分4x速,剪的有点意识流,见谅

studio_video_1728699248331.mp4

破案了,我的是3.93.3

@Candy-QAQ
Copy link

能不能发视频中的脚本全部,跟着视频好像不知道弄错了还是,就是没效果版本也是3.9.3.2

@ulua3809
Copy link
Author

ulua3809 commented Oct 12, 2024

能不能发视频中的脚本全部,跟着视频好像不知道弄错了还是,就是没效果版本也是3.9.3.2

视频中的脚本

// 在请求到达服务器之前,调用此函数,您可以在此处修改请求数据
// 例如Add/Update/Remove:Queries、Headers、Body
async function onRequest(context, request) {
  console.log(request.url);
  //URL参数
  //request.queries["name"] = "value";
  //Update or add Header
  //request.headers["X-New-Headers"] = "My-Value";
  
  // Update Body 使用fetch API请求接口,具体文档可网上搜索fetch API
  //request.body = await fetch('https://www.baidu.com/').then(response => response.text());
  return request;
}

// 在将响应数据发送到客户端之前,调用此函数,您可以在此处修改响应数据
async function onResponse(context, request, response) {
   //Update or add Header
  // response.headers["Name"] = "Value";
  // response.statusCode = 200;

  //var body = JSON.parse(response.body);
  //body['key'] = "value";

  var funname=response.body.match(/(?<=isRight:)[^,]*?\(.*?\).*?(?=\|)/);
console.log("替换函数名为:",funname);
if (funname){
console.log("找到函数,开始替换")  
  response.body = response.body.replaceAll(funname,funname+"||true");}
  //response.body = JSON.stringify(body);
  return response;
}

视频里脚本就是注释没有删掉,issue是注释删掉的版本,试过了能用,检查url有没有填对,app缓存有没有清理,proxypin有没有抓到包,justtrustme++有没有配置好,图也没有,抓包记录也没有,我只能给你算一卦

@xperiavnc
Copy link

能不能发视频中的脚本全部,跟着视频好像不知道弄错了还是,就是没效果版本也是3.9.3.2

清理app缓存

@xperiavnc
Copy link

貌似已经和谐了

@shenkunlovecoding
Copy link

疑似被hotfix

@shenkunlovecoding
Copy link

可以把js强制重写成以前的,虽然界面会乱,但是能刷分

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants