一直在寻找一个可用的搜题接口

之前刷网课搜题一直用的 “帅搜”,写了个 py 的脚本,平常用起来很方便。
后来也不知道什么原因,人家把接口给关闭了。

import win32clipboard as win
import win32con
from requests_html import HTMLSession,sys
from urllib import parse
import timedef getText():win.OpenClipboard()text = win.GetClipboardData(win32con.CF_TEXT)win.CloseClipboard()return textlast = ''
while True:try:temp = str(getText(), 'gbk')pre = tempif last != pre:print('问题:' + pre)html = HTMLSession().get('http://chati.xuanxiu365.com/index.php?q=' + parse.quote(pre)).htmlprint('\n' + '未查询到您需要的答案...' + '\n' + '\n' if '未查询到' in html.html or '禁止' in html.html else '\n' + html.find('body > form > div.weui-panel > div.weui-panel__bd > div > div', first=True).text + '\n' + '\n')last = preexcept:last = ''time.sleep(1)

后来就只能去微信公众号上搜题,但总感觉效率慢很多。
当时还把上面的代码基于 wxpy 改了一下:

import win32clipboard as win
import win32con
# from requests_html import HTMLSession,sys
# from urllib import parse
from wxpy import *
import timedef gettext():win.OpenClipboard()text = win.GetClipboardData(win32con.CF_TEXT)win.CloseClipboard()return textdef initial(bot, chat_obj ,timeout):msg_received = Falsemsg = ''@bot.register(chat_obj)def getMsg(in_msg):nonlocal msg, msg_receivedmsg = in_msgmsg_received = Truedef main_fun(question):nonlocal msg, msg_receivedlocal_time = time.time()msg = ''chat_obj.send_msg(question)while msg_received != True:time.sleep(0.5)if time.time() - local_time > timeout:return '超时未返回'msg_received = Falsereturn  msg.textreturn main_fundef getbot():bot = Bot(cache_path=True)char_obj = bot.mps(update=True)# .search('呆小呆搜题')return bot,char_objbot, chat_obj = getbot()
getan = initial(bot, chat_obj, 10)
last = ''
while True:try:temp = str(gettext(), 'gbk')pre = tempif last != pre:print('问题:' + pre)# html = HTMLSession().get('http://chati.xuanxiu365.com/index.php?q=' + parse.quote(pre)).html# print('\n' + '未查询到您需要的答案...' + '\n' + '\n' if '未查询到' in html.html or '禁止' in html.html else '\n' + html.find('body > form > div.weui-panel > div.weui-panel__bd > div > div', first=True).text + '\n' + '\n')print(getan(pre))last = preexcept:last = ''time.sleep(1)

但是我的微信号不提供 web wx 服务,每次搜题还得找同学,也不方便。

偶然发现了一个可以搜题的网站

进入正题:
有一个同学,他可能网课比我多,就总是抱怨搜题的效率低下,很难受。
今天中午跟他在外边恰饭,期间他在知乎上找到了一个搜题的网站。
当即抓了下包看了看。

有一个 token字段,感觉有些不妙。

回家之后开始分析:

刚打开就来了个反调试,疯狂断点。

通过Blackbox script (脚本黑箱化) 解决:

现在可以调试了,先抓个包:

除 token 外的两个字段都好说。
type 是前端一个选项决定的。question 就是问题关键字,莫得问题。
现在主要就是这个 token 字段了。

获取 token 字段

这里不要混淆了,此 token 非彼 token,这里的 token 仅仅用于它后端的验证。
首先看一下查询按钮的回调:

点进去:
发现是直接注册在 Dom 结构上的

全局搜一下:
发现是请求页面里的函数

看一下函数体:

可以看到 token 是通过挂载在 window 下的 jjm 得到的。
接下来就是找这个 jjm。

全局搜一下,结果没搜到。于是关一下黑箱,下断点单步跟跟一下调用看看:

跟进去就来到了一个叫 jm.js 的 js 文件:
可以看到,这个文件的代码被混淆过。
框起来的就是被挂载在 window 下的方法,jjm 这个方法名应该是通过 _0x58fb('0x57','rl4#') 返回的。


通过 chrom 自带的 pretty code 可以格式化代码:

所有代码复制一下放在 vscode 中,提取这个主加密算法 jjm 在单独文件中,并导入先前的代码。

观察到仅红框位置涉及外部调用。
绿框处的 md5 加密算法需要额外导入。
接下来我们什么也不调,直接运行一下。
迟迟没有反应,而我本不富裕的内存也雪上加霜,过了一会,堆崩了。
这时猜测 jm.js 中被调用的混淆算法检测了环境,然后通过不断地 new 或者循环的方式把堆给搞崩掉了。
我们下断点单步跟一下看看。

发现代码永远死在了这个 for 里面。
不过没关系,我发现这个函数没有名字,是自调用的,而且与其他函数完全没有耦合,可以放心删掉。
不过在我删掉后,发现接下来又来了一波看不懂的判断,直接就给我抛了异常。
中间也有着耦合的函数调用,于是我决定放弃这条路,直接渐进式地从主加密算法向外添加函数。

我们把导入 jm.js 语句删掉,然后抽出唯一的外部调用进来。
这个函数贼长,但是我发现他与外部关联的调用仅此一个,于是我们把它从外边复制进来。

导入 md5 ,然后直接调这个 jjm 来试一下:
离胜利不远了。

然后代码又死在了这个 for 里。

还是太麻烦了,我们回头分析一下主加密算法:
md5 调用的参数使用到了这个高亮的 JSON 对象。可以看到这个对象有两个成员,一个是 iWtcL,另一个是iTvRA,分别对应两个方法。
而这个外部的调用可以看出来是高亮对象的一个字段。那么这个位置不是iWtcL,就是iTvRA。我们直接替换为iTvRA试一下

直接输出了类似 token 的值,我们用 postman 试一下

结果人家后端说 token 错误。


检察一下参数。
刷新一下页面,发现这里的常量变了,看来这个页面是后端渲染的。

这下我们用这个字符串加密试一下。


然后直接拿到了结果:
Unicode 字符,JSON.parse()即可。

至此就结束了

后面就是,先封装一下加密算法。然后为了解决跨域的问题,自己写个后端包装一下,让别人调。

我是完成之后来写博客的,所以后端已经完成了。
据说挺 6 --> 带佬的博客

【Web】记一次破解 JS 加密相关推荐

  1. 爬虫破解js加密破解(二) 有道词典js加密参数 sign破解

    在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术. 常见的反爬虫技术有封ip,user_agent,字体库,js加密, ...

  2. Python爬虫:爬取instagram,破解js加密参数

    Python爬虫:爬取instagram,破解js加密参数 instagram 是国外非常流行的一款社交网站,类似的还有像facebook.twitter,这些社交网站对于掌握时事热点.电商数据来源和 ...

  3. 破解js加密反爬综述

    破解js加密反爬综述 微信公众号:在敲代码啦 闲谈 上周发懒,没有更贴.结果一个小伙伴居然私我希望我周更帖,这个消息对我来说是莫大的鼓励.总是胡说八道的我居然得到了小伙伴的认可,这足以让我嘚瑟一整子. ...

  4. 使用python对在线网易有道翻译接口进行分析及破解js加密

    文章目录 项目目标 温馨提示 项目分析 分析完毕,进行代码模拟加密过程,代码演示 项目目标 对网易有道翻译接口关键参数进行分析,并且进行js加密破解,实质上就是找出网易有道翻译接口对关键参数的加密的详 ...

  5. 反爬虫 破解js加密-有道翻译

    js 加密 有的反爬虫策略采用js对需要传输的数据进行加密处理(通常是取md5值) 经过加密,传输的就是密文,但是加密函数或者过程一定是在浏览器完成,也就是一定会把代码(js代码)暴露给使用者 通过阅 ...

  6. 爬虫入门经典(二十) | 破解JS加密之有道翻译

      大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  7. python爬虫--破解js加密:kankan登录破解

    这一系列文章旨在解决python 爬虫过程中遇到的各种反爬,从简单到复制,是个进阶的过程.如果对你有帮助,欢迎关注. 今天要破解的网站是天天看看(http://www.kankan.com/)的登录, ...

  8. 记一次破解前端加密详细过程

    应工作需要爬过各种各样的航空公司网站,大到B2B平台,小到东南亚某某航空官网,从最初使用webdriver+selenium爬虫到现在利用http请求解析html,经历过各种各样的问题,webdriv ...

  9. python爬虫处理js混淆加密_Python爬虫—破解JS加密的Cookie

    專 欄 ❈Jerry,Python中文社区专栏作者. blog:https://my.oschina.net/jhao104/blog github:https://github.com/jhao10 ...

最新文章

  1. java 二叉树中和为某一值的路径_25. 二叉树中和为某一值的路径
  2. 【从零开始的ROS四轴机械臂控制】(五)- 构建运动控制服务
  3. Django博客系统(写博客页面展示)
  4. 【论文解读】深度学习网络架构新视角:通过相关图表达理解神经网络(何恺明团队新作)...
  5. 菜鸟教程python3 mysql_MySQL 教程
  6. 【请教】服务器上出现的两个问题!
  7. 实验一 命令解释程序的编写
  8. MySQL 基础 —— DQL(数据查询)
  9. 在ECSHOP模板商品列表页 显示商品的评论等级和评论数量
  10. Windows8中pid为4的system进程占用80端口的解决办法
  11. 数论 day 2 试题解析
  12. 推荐16个超棒的国外免费PSD资源素材网站
  13. 串行口终端乱码的解决.
  14. php页面劫持网站,网站被劫持了怎么修复
  15. js:nodejs简单的Http服务器搭建
  16. 我的csdn博客所有的留言和评论我都不太想回复了
  17. redis桌面管理工具 redis-desktop-manager使用指南
  18. 工信部的小伙伴,还没过上年
  19. 协方差矩阵和相关矩阵的关系
  20. 外贸新人最全面的领英Linkedin开发客户方法(建议收藏)

热门文章

  1. node.js毕业设计安卓移动LYQ电子商城APP(程序+APP+LW)
  2. Zcash中的keys和addresses
  3. 古道西风,我是那绝望的断肠人
  4. 2. ROS安装(官网教程/简单好用)
  5. java中string类型如何接收_java中的string类型全面解析
  6. Canvas可以画出任何你想要的效果
  7. Android进阶(二十八)上下文菜单ContextMenu使用案例
  8. NUMERIC(10,4) 和DECIMAL(10, 4) 的区别和用法?
  9. pytorch 若干小坑
  10. 《操作系统-真象还原》11. 用户进程