JS逆向实战17——猿人学第七题 动态字体 随风漂移
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
网站
网站分析
要求:
我们话不多B 直接抓包看看
我们可以看到 这个value的值是加密的,大概率就是我们所要解密的数据了。
与此同时 还看见了有个值是woff。
说到woff,我之前也发过一篇博客https://www.cnblogs.com/zichliang/p/17408064.html
也是讲woff 动态字体的爬的是某点中文网。有兴趣的朋友可以看看。
说道这个value
一般的这种解密都有对应关系的。
比如:
''' 넴 띂 똘 넴 2 3 4 2 '''
也就代表着 넴代表着2 띂代表着3。这样就能搞出个映射关系,然后给他解密出来了。
那我们刷新一下看看这个 넴是否还代表着2
很好 完全不一样。说明每次发起了一个请求就有一个编码的格式。
上文说到请求还返回给我们了一个woff。
woff的值好像有点像base64编码的。
一般来说网站都会附带一个woff的请求,我们找一下看看能不能找得到。
类似于这种的就是woff的请求,只不过这个请求经过了base64编码。而这个base64链接就是上文传给我们的woff的值。
而这个网页的value的编码也是一直在变的。也就代表每次都要去解析这个编码。才能完成解密。
我们首先下载下来这个woff 其次用FontCreator
去解析下这个woff。看看在 FontCreator
中的映射关系。
【fontCreator官网: https://fontcreator.com.cn/ 点击免费下载 下载即可 有免费试用权限】
解析出来是这样的,再看看浏览器接口返回给我们的数据
发现这个
3236 ==== 뙳 쐧 뙳 릂
可以发现 虽然前面不一样,但是后面这个abcdefg... + 数字编号是一样的。
而本题的要求是
所以我们还需要查找下召唤师名和胜点是如何对应的。我们打上断点。
可以看到 如下代码就是获取召唤师姓名的逻辑。 我们可以通过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对应一个页面,对应一个解析规则。
步骤分析
既然我们知道了 如何去做,其实就很简单了
首先分一下步骤
- 请求接口 提取出woff的值
- 转换woff 转换成可视化的样式 并且使用fontTools转换成XML
- 提取刚刚请求的接口的value的值。
- 清洗刚刚提取出来的value 只保留后面的数字。(删除&#x)
- 使用库来解析woff文件转换为XML 再找到对应关系,映射起一张对应表。
- 按照对应表 与接口值映射从而获取真实数据。
以下提供两种找出映射关系的方法:
根据解析TTGlyph下的on标签 找出映射关系,然后手动写出映射关系。
通过解析两次不同的woff文件。可以发现 在TTGlyph下的on标签不变。如下图:
同事分析1这个数字所对应的字体码 分别是 b953
和 b295
然后我们去xml文件中找相对应的 TTGlyph 下面的标签
可以看出 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值再做一组映射表就可以拿到真正的映射关系表
最后再通过计算胜点最多那一组 找出召唤师 即可完成题目。
通过转换woff 为图片 然后使用ocr去识别
这种方法 是不被允许的,而且感觉有些太简单了,一般题目有要求不准如此。
这里就简单说一下。
作者博客:https://www.cnblogs.com/zichliang
本文地址:https://www.cnblogs.com/zichliang/p/17452648.html
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器