18_猿人学第7题 动态字体 随风漂移

Date
Jun 8, 2023
Created
Mar 2, 2024 03:01 PM
Tags
JS逆向实战

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

网站

https://match.yuanrenxue.cn/match/7

网站分析

要求:
notion image
我们话不多B 直接抓包看看
notion image
我们可以看到 这个value的值是加密的,大概率就是我们所要解密的数据了。 与此同时 还看见了有个值是woff。 说到woff,我之前也发过一篇博客https://www.cnblogs.com/zichliang/p/17408064.html 也是讲woff 动态字体的爬的是某点中文网。有兴趣的朋友可以看看。 说道这个value 一般的这种解密都有对应关系的。 比如:
notion image
''' &#xb134 &#xb742 &#xb618 &#xb134 2 3 4 2 '''
也就代表着 &#xb134代表着2 &#xb742代表着3。这样就能搞出个映射关系,然后给他解密出来了。 那我们刷新一下看看这个 &#xb134是否还代表着2
notion image
很好 完全不一样。说明每次发起了一个请求就有一个编码的格式。上文说到请求还返回给我们了一个woff。 woff的值好像有点像base64编码的。 一般来说网站都会附带一个woff的请求,我们找一下看看能不能找得到。
notion image
notion image
类似于这种的就是woff的请求,只不过这个请求经过了base64编码。而这个base64链接就是上文传给我们的woff的值。 而这个网页的value的编码也是一直在变的。也就代表每次都要去解析这个编码。才能完成解密。 我们首先下载下来这个woff 其次用
FontCreator
去解析下这个woff。看看在
FontCreator
中的映射关系。 【fontCreator官网:
点击免费下载 下载即可 有免费试用权限】
notion image
解析出来是这样的,再看看浏览器接口返回给我们的数据
notion image
发现这个
3236 ==== &#xb673 &#xc427 &#xb673 &#xb982
notion image
可以发现 虽然前面不一样,但是后面这个abcdefg... + 数字编号是一样的。而本题的要求是
notion image
所以我们还需要查找下召唤师名和胜点是如何对应的。我们打上断点。
notion image
可以看到 如下代码就是获取召唤师姓名的逻辑。 我们可以通过js 或者是python改写去获得。
let name = ['极镀ギ紬荕', '爷灬霸气傀儡', '梦战苍穹', '傲世哥', 'мaη肆風聲', '一刀メ隔世', '横刀メ绝杀', 'Q不死你R死你', '魔帝殤邪', '封刀不再战', '倾城孤狼', '戎马江湖', '狂得像风', '影之哀伤', '謸氕づ独尊', '傲视狂杀', '追风之梦', '枭雄在世', '傲视之巅', '黑夜刺客', '占你心为王', '爷来取你狗命', '御风踏血', '凫矢暮城', '孤影メ残刀', '野区霸王', '噬血啸月', '风逝无迹', '帅的睡不着', '血色杀戮者', '冷视天下', '帅出新高度', '風狆瑬蒗', '灵魂禁锢', 'ヤ地狱篮枫ゞ', '溅血メ破天', '剑尊メ杀戮', '塞外う飛龍', '哥‘K纯帅', '逆風祈雨', '恣意踏江山', '望断、天涯路', '地獄惡灵', '疯狂メ孽杀', '寂月灭影', '骚年霸称帝王', '狂杀メ无赦', '死灵的哀伤', '撩妹界扛把子', '霸刀☆藐视天下', '潇洒又能打', '狂卩龙灬巅丷峰', '羁旅天涯.', '南宫沐风', '风恋绝尘', '剑下孤魂', '一蓑烟雨', '领域★倾战', '威龙丶断魂神狙', '辉煌战绩', '屎来运赚', '伱、Bu够档次', '九音引魂箫', '骨子里的傲气', '霸海断长空', '没枪也很狂', '死魂★之灵']; $.each(data, function(index, val) { let ppo = mad; for (let imgnum = 1; imgnum <= 5; imgnum++) { ppo = ppo.replace('img_number', yyq * window.page + imgnum_arr[imgnum]) } html += ppo.replace('九不想乖', name[yyq + (window.page - 1) * 10]).replace('win_number', imgnum_arr[yyq] * level_arr[window.page] * 88 + '场').replace(/win_rank/g, imgnum_arr[yyq] + 60 + level_arr[window.page] + '%').replace('random_level', imgnum_arr[yyq] * level_arr[window.page] + 100 * level_arr[window.page]).replace('img_number', yyq * window.page).replace('random_rank_number', val.value.replace(/ /g, '') + 'LP'); yyq += 1; img_num += 1 });

结论:

一个woff对应一个页面,对应一个解析规则。

步骤分析

既然我们知道了 如何去做,其实就很简单了 首先分一下步骤
  1. 请求接口 提取出woff的值
  1. 转换woff 转换成可视化的样式 并且使用fontTools转换成XML
  1. 提取刚刚请求的接口的value的值。
  1. 清洗刚刚提取出来的value 只保留后面的数字。(删除&#x)
  1. 使用库来解析woff文件转换为XML 再找到对应关系,映射起一张对应表。
  1. 按照对应表 与接口值映射从而获取真实数据。
以下提供两种找出映射关系的方法:

根据解析TTGlyph下的on标签 找出映射关系,然后手动写出映射关系。

通过解析两次不同的woff文件。可以发现 在TTGlyph下的on标签不变。如下图:
notion image
同事分析1这个数字所对应的字体码 分别是
b953
b295
然后我们去xml文件中找相对应的 TTGlyph 下面的标签
notion image
可以看出 on标签是一直不会变的,也就意外这 on标签所对应的数字也是不会变的,所以我们可以得到下面这段映射关系。
map_number = { '10100100100101010010010010': '0', '1001101111': '1', '100110101001010101011110101000': '2', '10101100101000111100010101011010100101010100': '3', '111111111111111': '4', '1110101001001010110101010100101011111': '5', '10101010100001010111010101101010010101000': '6', '1111111': '7', '101010101101010001010101101010101010010010010101001000010': '8', '10010101001110101011010101010101000100100': '9', }
然后再通过解析 name 和这个 on值再做一组映射表就可以拿到真正的映射关系表
notion image
最后再通过计算胜点最多那一组 找出召唤师 即可完成题目。
notion image

通过转换woff 为图片 然后使用ocr去识别

这种方法 是不被允许的,而且感觉有些太简单了,一般题目有要求不准如此。 这里就简单说一下。

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

网站

https://match.yuanrenxue.cn/match/8

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

网站

https://match.yuanrenxue.cn/match/7

网站分析

要求:
notion image
我们话不多B 直接抓包看看
notion image
我们可以看到 这个value的值是加密的,大概率就是我们所要解密的数据了。 与此同时 还看见了有个值是woff。 说到woff,我之前也发过一篇博客https://www.cnblogs.com/zichliang/p/17408064.html 也是讲woff 动态字体的爬的是某点中文网。有兴趣的朋友可以看看。 说道这个value 一般的这种解密都有对应关系的。 比如:
notion image
''' &#xb134 &#xb742 &#xb618 &#xb134 2 3 4 2 '''
也就代表着 &#xb134代表着2 &#xb742代表着3。这样就能搞出个映射关系,然后给他解密出来了。 那我们刷新一下看看这个 &#xb134是否还代表着2
notion image
很好 完全不一样。说明每次发起了一个请求就有一个编码的格式。上文说到请求还返回给我们了一个woff。 woff的值好像有点像base64编码的。 一般来说网站都会附带一个woff的请求,我们找一下看看能不能找得到。
notion image
notion image
类似于这种的就是woff的请求,只不过这个请求经过了base64编码。而这个base64链接就是上文传给我们的woff的值。 而这个网页的value的编码也是一直在变的。也就代表每次都要去解析这个编码。才能完成解密。 我们首先下载下来这个woff 其次用
FontCreator
去解析下这个woff。看看在
FontCreator
中的映射关系。 【fontCreator官网:
点击免费下载 下载即可 有免费试用权限】
notion image
解析出来是这样的,再看看浏览器接口返回给我们的数据
notion image
发现这个
3236 ==== &#xb673 &#xc427 &#xb673 &#xb982
notion image
可以发现 虽然前面不一样,但是后面这个abcdefg... + 数字编号是一样的。而本题的要求是
notion image
所以我们还需要查找下召唤师名和胜点是如何对应的。我们打上断点。
notion image
可以看到 如下代码就是获取召唤师姓名的逻辑。 我们可以通过js 或者是python改写去获得。
let name = ['极镀ギ紬荕', '爷灬霸气傀儡', '梦战苍穹', '傲世哥', 'мaη肆風聲', '一刀メ隔世', '横刀メ绝杀', 'Q不死你R死你', '魔帝殤邪', '封刀不再战', '倾城孤狼', '戎马江湖', '狂得像风', '影之哀伤', '謸氕づ独尊', '傲视狂杀', '追风之梦', '枭雄在世', '傲视之巅', '黑夜刺客', '占你心为王', '爷来取你狗命', '御风踏血', '凫矢暮城', '孤影メ残刀', '野区霸王', '噬血啸月', '风逝无迹', '帅的睡不着', '血色杀戮者', '冷视天下', '帅出新高度', '風狆瑬蒗', '灵魂禁锢', 'ヤ地狱篮枫ゞ', '溅血メ破天', '剑尊メ杀戮', '塞外う飛龍', '哥‘K纯帅', '逆風祈雨', '恣意踏江山', '望断、天涯路', '地獄惡灵', '疯狂メ孽杀', '寂月灭影', '骚年霸称帝王', '狂杀メ无赦', '死灵的哀伤', '撩妹界扛把子', '霸刀☆藐视天下', '潇洒又能打', '狂卩龙灬巅丷峰', '羁旅天涯.', '南宫沐风', '风恋绝尘', '剑下孤魂', '一蓑烟雨', '领域★倾战', '威龙丶断魂神狙', '辉煌战绩', '屎来运赚', '伱、Bu够档次', '九音引魂箫', '骨子里的傲气', '霸海断长空', '没枪也很狂', '死魂★之灵']; $.each(data, function(index, val) { let ppo = mad; for (let imgnum = 1; imgnum <= 5; imgnum++) { ppo = ppo.replace('img_number', yyq * window.page + imgnum_arr[imgnum]) } html += ppo.replace('九不想乖', name[yyq + (window.page - 1) * 10]).replace('win_number', imgnum_arr[yyq] * level_arr[window.page] * 88 + '场').replace(/win_rank/g, imgnum_arr[yyq] + 60 + level_arr[window.page] + '%').replace('random_level', imgnum_arr[yyq] * level_arr[window.page] + 100 * level_arr[window.page]).replace('img_number', yyq * window.page).replace('random_rank_number', val.value.replace(/ /g, '') + 'LP'); yyq += 1; img_num += 1 });

结论:

一个woff对应一个页面,对应一个解析规则。

步骤分析

既然我们知道了 如何去做,其实就很简单了 首先分一下步骤
  1. 请求接口 提取出woff的值
  1. 转换woff 转换成可视化的样式 并且使用fontTools转换成XML
  1. 提取刚刚请求的接口的value的值。
  1. 清洗刚刚提取出来的value 只保留后面的数字。(删除&#x)
  1. 使用库来解析woff文件转换为XML 再找到对应关系,映射起一张对应表。
  1. 按照对应表 与接口值映射从而获取真实数据。
以下提供两种找出映射关系的方法:

根据解析TTGlyph下的on标签 找出映射关系,然后手动写出映射关系。

通过解析两次不同的woff文件。可以发现 在TTGlyph下的on标签不变。如下图:
notion image
同事分析1这个数字所对应的字体码 分别是
b953
b295
然后我们去xml文件中找相对应的 TTGlyph 下面的标签
notion image
可以看出 on标签是一直不会变的,也就意外这 on标签所对应的数字也是不会变的,所以我们可以得到下面这段映射关系。
map_number = { '10100100100101010010010010': '0', '1001101111': '1', '100110101001010101011110101000': '2', '10101100101000111100010101011010100101010100': '3', '111111111111111': '4', '1110101001001010110101010100101011111': '5', '10101010100001010111010101101010010101000': '6', '1111111': '7', '101010101101010001010101101010101010010010010101001000010': '8', '10010101001110101011010101010101000100100': '9', }
然后再通过解析 name 和这个 on值再做一组映射表就可以拿到真正的映射关系表
notion image
最后再通过计算胜点最多那一组 找出召唤师 即可完成题目。
notion image

通过转换woff 为图片 然后使用ocr去识别

这种方法 是不被允许的,而且感觉有些太简单了,一般题目有要求不准如此。 这里就简单说一下。

网站分析

首先进去
notion image
就看到是如此复杂的文字验证码。 我们首先刷新网站 用浏览器自带的抓包软件抓抓看
notion image
可以看到网站中的验证码照片中的文字都在这个请求中, 继续往下看
notion image
还有个base64的图片

代码分析

所以我们直接请求下 看看能不能请求得到
notion image
发现可以 当然光这样是不行的,我们还需要吧这个base64的字符串 转换成图片
def base64toJPG(base64_data,pic_name): data = base64.b64decode(base64_data) with open(pic_name, 'wb') as f: f.write(data)
notion image
这里我们点击网站看看发送成功的包是什么样的
notion image
会发现这里返回给我们的是一堆莫名其妙的数字,有点像坐标的定值。
notion image
但是经过分析可知。这里返回给我们的数字,是这些div的索引值, 如果你点击第一个 第二个 第三个div 返回给我们的则是 0,1,2
那这样的话,我们只需要把这些坐标的中心点 写好定值即可。
coordinate_map = { 1: 124, 2: 135, 3: 146, 4: 425, 5: 468, 6: 475, 7: 725, 8: 735, 9: 775 }
那现在我们找到了中心点坐标,也找到了对应的字 那下一步就是如何从图片中提取出这些文字和坐标了

图像处理

由于这个图片的背景颜色很深,而且还有很多横杠,非常影响ocr识别。基本不可能成功。 这里选择用cv2 2值化处理 由于本人确实没怎么学过这个2值化处理。所以只能借用别人写好的直接用了。

影像识别库 和 打码平台 识别

这里可以选择两种方式 第一种就是影像识别库 例如
  • ddddocr
pip install ddddocr -i <https://pypi.tuna.tsinghua.edu.cn/simple>
  • pytesseract tesseract(需要配合安装在本地的tesseract-ocr.exe文件一起使用)
pip install pytesseract
  • PaddleOCR(需要配合安装在本地的tesseract-ocr.exe文件一起使用)
pip install paddlepaddle pip install shapely pip install paddleocr
  • easyocr(支持80多种语言的识别,识别精度超高)
pip install easyocr
  • muggle_ocr(轻量级的ocr识别库,文字提取效果稍差) pip install muggle_ocr
  • cnocr(Python 开源识别工具)
pip install cnocr
这里我选择的是easyocr 因为对中文的支持很好 这里简单说下识别的流程
  1. 得到上文2值化的图片2进制
  1. 将图片切割成9份,一个字一个字的识别 这样识别效率高
  1. 传入OCR识别
  1. 将9个文字和得到的4个字进行匹配,然后返回相应的坐标值。

总结

即使这样识别率依然很低,所以这里提供两个方案
  1. 手动识别(最笨 ,但是最有用)
  1. 做好优化,每当识别不全字。就重新发起请求,然后重新执行。
notion image
本次请求选择了手动输入。 最后把所有数据合成一个列表调用一下这个方法,拿到重复出现频率最高的数字
def find_repeat_data(_list): repeat_list = [] for i in set(_list): ret = _list.count(i) # 查找该数据在原列表中的个数 if ret > 1: item = dict() item[i] = ret repeat_list.append(item) return repeat_list