《封号码罗》关于js逆向猿人学第七题动态字体的解决办法(二十八)

猿人学web端爬虫攻防大赛赛题解析_第七题:动态字体,随风漂移 动态字体,随风漂移一、前言二、分析过程 一、前言 上一道字体反扒的css加密题还是第四题,不过那道题主要还只是做了个数字的坐标偏移,逻辑分析起来不算难,这道动态字体的题算是真正的字体反扒题,做了一下感觉挺长见识的,对于了解同类型字体加密有不小帮助,闲言少叙,开搞! 二、分析过程 题目的要求是采集胜点列的数据,找出胜点最高的召唤师,那加密的数据肯定就是胜点数据了,核心应该是解析出胜点值,其次就是将这个值与对应的召唤师匹配,最后比较五十个玩家的胜点,找出胜点最高那一个。 这里仔细观察一下,可以发现胜点数字的字形 阅读详情

首先需要获取动态字体,第七题的字体文件在接口返回值里面

import base64
from io import BytesIO
from bs4 import BeautifulSoup
import requests
from fontTools.ttLib import TTFont  # pip install fonttools

headers = {
    'User-Agent': 'yuanrenxue.project'
}

res = requests.get(f'http://match.yuanrenxue.com/api/match/7?page=1', headers=headers)
data = res.json()
data_list = data["data"]
# print(data_list)
woff = data["woff"]
with open("7.woff", "wb") as f:
    f.write(base64.b64decode(woff))

font = TTFont("7.woff")
font.saveXML("7x.xml")

打开字体xml文件,多次测试之后发现,这个字体文件也是动态的,但是glyf对应的一直是0-9之间的数字,注意:对应顺序是动态的在这里插入图片描述
但是on对应的这一列一直是不变的
在这里插入图片描述

glyf = font.getGlyphSet()
glyf_name = font.getGlyphNames()
on_dict = {}
for index, name in enumerate(glyf_name[1:]):
    # 读取 glyf 表, 获取各字形对应的 on 值
    on_data = font['glyf'][name].flags
    # 字符串拼接
    on_key = "".join([str(n) for n in on_data])
    # 组合字典
    on_dict[on_key] = name
print(on_dict)

可以得到如下对应关系:
在这里插入图片描述
整理之后:

old_map = {'10100100100101010010010010': 'unia146',
           '111111111111111': 'unia396',
           '10010101001110101011010101010101000100100': 'unia426',
           '101010101101010001010101101010101010010010010101001000010': 'unia618',
           '100110101001010101011110101000': 'unia928',
           '1111111': 'unib387',
           '10101100101000111100010101011010100101010100': 'unib542',
           '1110101001001010110101010100101011111': 'unic368',
           '1001101111': 'unic472',
           '10101010100001010111010101101010010101000': 'unic832'
           }

这里注意的是,key不变,变的是value,但value代表的数字是不变的,如

'1111111': 'unib387'
'1111111': 'unib173'

实际上都是数字7:

'1111111': 7
'1111111': 7

可以使用: 字体处理工具,查看字体文件里面的对应关系
在这里插入图片描述
完整代码:

import base64
from io import BytesIO
from bs4 import BeautifulSoup
import requests
from fontTools.ttLib import TTFont  # pip install fonttools

headers = {
    'User-Agent': 'yuanrenxue.project'
}

new_map = {
    '111': '',
    '10100100100101010010010010': '0',
    '1001101111': '1',
    '100110101001010101011110101000': '2',
    '10101100101000111100010101011010100101010100': '3',
    '111111111111111': '4',
    '1110101001001010110101010100101011111': '5',
    '10101010100001010111010101101010010101000': '6',
    '1111111': '7',
    '101010101101010001010101101010101010010010010101001000010': '8',
    '10010101001110101011010101010101000100100': '9'
}

name_list = ['极镀ギ紬荕', '爷灬霸气傀儡', '梦战苍穹', '傲世哥', 'мaη肆風聲', '一刀メ隔世', '横刀メ绝杀', 'Q不死你R死你',
             '魔帝殤邪', '封刀不再战', '倾城孤狼', '戎马江湖',
             '狂得像风', '影之哀伤', '謸氕づ独尊', '傲视狂杀',
             '追风之梦', '枭雄在世', '傲视之巅', '黑夜刺客', '占你心为王', '爷来取你狗命', '御风踏血', '凫矢暮城',
             '孤影メ残刀', '野区霸王', '噬血啸月', '风逝无迹', '帅的睡不着', '血色杀戮者', '冷视天下', '帅出新高度',
             '風狆瑬蒗', '灵魂禁锢', 'ヤ地狱篮枫ゞ', '溅血メ破天', '剑尊メ杀戮', '塞外う飛龍', '哥‘K纯帅',
             '逆風祈雨',
             '恣意踏江山', '望断、天涯路', '地獄惡灵', '疯狂メ孽杀', '寂月灭影', '骚年霸称帝王', '狂杀メ无赦',
             '死灵的哀伤',
             '撩妹界扛把子', '霸刀☆藐视天下', '潇洒又能打', '狂卩龙灬巅丷峰', '羁旅天涯.', '南宫沐风', '风恋绝尘',
             '剑下孤魂', '一蓑烟雨', '领域★倾战', '威龙丶断魂神狙', '辉煌战绩', '屎来运赚', '伱、Bu够档次',
             '九音引魂箫',
             '骨子里的傲气', '霸海断长空', '没枪也很狂', '死魂★之灵']

values = {}
for index in range(1, 6):
    res = requests.get(f'https://match.yuanrenxue.cn/api/match/7?page={index}', headers=headers)
    data = res.json()

    # 用二进制流的方式保存字体文件
    # font_bytes = BytesIO(base64.b64decode((data.get("woff")).encode()))
    # font = TTFont(font_bytes)
    with BytesIO(base64.b64decode((data.get("woff")).encode())) as font_web_bytes:
        font = TTFont(font_web_bytes)
    with BytesIO() as font_local_bytes:
        font.saveXML(font_local_bytes)  # 保存成xml格式的文件到二进制流(内存中)
        # 获取字体文件的二进制数据 font_local_bytes.getvalue()
        ids = BeautifulSoup(font_local_bytes.getvalue(), 'xml').find('glyf').find_all('TTGlyph')

    # 映射数字关系
    gid = {}
    for g in ids:
        gid[g['name']] = new_map[''.join(b['on'] for b in g.find_all('pt'))]

    # {'.notdef': '', 'unia139': '1', 'unia249': '6', 'unib485': '9', 'unib752': '0', 'unib792': '4', 'unib812': '2', 'unib856': '5', 'unib935': '7', 'unic165': '8', 'unic586': '3'}
    for i, d in enumerate(data['data']):
        values[name_list[i + 1 + (index - 1) * 10]] = int(
            ''.join(gid[dd.replace('&#x', 'uni')] for dd in d['value'].strip().split(' ')))
print(max(values, key=lambda v: values[v]))

参考学习链接:
https://blog.youkuaiyun.com/Yy_Rose/article/details/126704652
https://blog.youkuaiyun.com/user_from_future/article/details/130259277

图灵练习平台 码上爬 1-19题加密点 js逆向 图灵靶场 码上爬 1-19题加密点 分析 阅读详情

相关推荐

js逆向第14例:猿人学第7题动态字体,随风漂移

任务7:采集这5页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中此题采集的是胜点列表的数据如下 通过控制台审查元素查看,可以看到是乱码,记得几年前的快手,小红书,抖音也采用了此类反爬措施,html页面显示的是乱码,浏览器能正常显示数据,大概率就是字体加密。 查看数据请求地址返回数据如下: 通过观察返回数据就可以判断出就是字体文件,data就是对应的胜点数据。再找找控制台中是否有字体文件的请求链接,有就直接新标签也打开下载 修改后缀为也可以修改成 通过在线工具,打开查看字体文件内容,展

花臂不花Home 1852

码上爬-第7&8题

靶场地址:7:8:js加密 & js混淆。

随便写写 3247

python爬虫 - js逆向之猿人学第一题源码加密.pdf

python爬虫 - js逆向之猿人学第一题源码加密

【JavaScript 逆向】猿人学 web 第七题:动态字体,随风漂移

猿人学练习平台 web 比赛第七题:动态字体,随风漂移,css 字体反爬,动态文件、动态坐标、动态编码、微变字形

Yy_Rose的博客 3625

图灵码上爬 1-19题源码 python爬虫 js逆向

图灵码上爬 1-19题源码 python爬虫 js逆向

手把手教你用Xilinx SelectIO IP核搞定ADS42LB69高速ADC的DDR数据采集(附仿真调试技巧)

本文详细介绍了如何使用Xilinx SelectIO IP核实现ADS42LB69高速ADC的DDR数据采集,包括IP核配置、仿真验证和硬件调试技巧。通过精准的时序控制和实战调试方法,解决高速数据采集中的时序对齐问题,提升系统稳定性和可靠性。特别适合FPGA工程师和高速ADC接口设计者参考。

weixin_42533622的博客 151

JS逆向实战17——猿人学第七题 动态字体 随风漂移

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 网站 https://match.yuanrenxue.cn/match/7 网站分析 要求: 我们话不多B 直接抓包看看 我们可以看到 这个value的值是加密的,大概率就是我们所要解密的数据了。 与此同时 还看见了有...

有什么问题回复不及时,可以私聊我。也可以加我的星球:知识爬行者 792

保姆级教程:在Windows上用VS2019和OpenCV4.6搞定海康MV-EB435i RGBD相机图像采集

本文提供了一份详细的教程,指导如何在Windows环境下使用VS2019和OpenCV4.6配置海康MV-EB435i RGBD相机进行图像采集。从开发环境准备、SDK部署到代码移植和优化,涵盖了深度图与RGB图同步采集的实战技巧,帮助开发者快速上手工业级RGBD相机的应用开发。

weixin_28675557的博客 466

猿人学第七题-动态字体-随风漂移

最后有一点网页里名字的索引是从1开始的,所以point的最大值索引要+1才是名字的索引。通过这两步可以建立初始化的name与num列表。

zhuangjoo的博客 698

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

基于物联网技术智慧园林绿化养护管理信息平台

近几年来,随着经济不断的发展,城市面积不断的扩大,城市管理中的园林绿化工作也在这种趋势下不断的发生着深刻改变。管养企业是否按制定的管养计划严格执行?绿化事件整改是否及时到位?绿地面积是否在稳步增长?管养的效果如何?如何客观评价管养企业的管养工作?这些都是我们各级管理者需要面对的问题。   智慧园林绿化养护管理信息平台的开发思路以“考核”为核心,整个信息平台体现出“新、快、高、全、享”五个特点。   智慧园林绿化养护管理信息平台的整个开发理念为:依托五大技术手段(全球卫星定位系统技术、地理信...

Cesium的博客QQ2252224326 2458

14.Vue网络请求:axios

简介 Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求。 Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。   请求方法的别名 为方便使用,官方为所有支持的请求方法提供了别名,可以直接使用别名来发起请求: axios.request(config) axios.get(url[, config]) axios.delete(url[, config]) axios.head(url[, config]) axios.post(u

高新园养鸡场 556

微信小程序 - 实现Java微信支付退款功能以及退款流程,微信小程序前端+java后端完整示例源码,微信小程序退款功能详解,小程序订单申请退款和退款回调方法、查询退款等(新版微信支付,详细示例代码)

微信小程序开发-微信支付退款功能以及退款回调方法,微信支付退款API详解,微信小程序支付V3(支付、退款)Java实现微信小程序开发 小程序支付开发-小程序退款功能,微信小程序小程序和公众号 退款功能教程(含申请退款和退款回调,退款回调地址在商户后台配置或者代码自定义)最新版微信小程序支付,退款问题,小程序支付和退款功能详解,小程序申请退款,小程序处理退款,微信小程序支付与退款java,微信小程序退款及回调,JAVA实现微信小程序支付退款功能,退款api调用报错,如何解决退款申请无响应,如何用实现小程序订单

🏆 前端领域优质创作者 4157

猿人学web端爬虫攻防平台第七题动态字体

本人呢很喜欢爬虫,但是技术不好,所以呢就一直慢慢的摸索着,也不知道那什么练手进行学习,直到我在偶然的机会接触到了猿人学,发现了 猿人学web端爬虫攻防平台这个网站,久旱逢甘霖,他乡遇故知呀(蹩脚的词语)也让我的爬虫技术有了很大的提升,今天呢我就说一下第七题,字体反爬(其他的题目我也有做,有时间也都会发表一下思路) 爬取的网站 猿人学web端爬虫攻防平台第七题动态字体 查看数据来源和加密方式 这就很方便了,数据和字体文件都在一起, 多次请求观察字体文件,可以看出文字都是一样的,只是顺序不一样,对应的na

shiguanggege的博客 2925

博途PLC如何建立与笔记本电脑端的连接?(新手必会)

对S7-1500PLC下载硬件组态或程序,需要建立PC与PLC的连接。 由于S7-1500CPU都具有PN端口,因此建立PC与S7-1500PLC的连接通常使用工业以太网来实现。 1.使用网线连接PC-PLC 使用网线,一端连接PC的以太网卡端口,另一端连接S7-1500CPU的PN端口。 2.设置本机IP地址 2.1 确认本机要设置的IP地址段 本机IP地址要和PLC程序组态IP地址段前三位保持一致,后一位使用组态中没有用到的IP地址段。如下图所示。 那么看了这个图片应该就知道了,地址应该设置成192.

weixin_42430971的博客 1万+

虚拟化 之三 详解 ARM 平台 jailhouse 的移植适配、构建及使用(飞腾派)

本文将探索学习通过在飞腾官方提供的 Buildroot 构建系统移植适配 openEuler 内核以及 jailhouse 源码 Package 进而直接构建一个适用于飞腾派开发板的带有 jailhouse 的 openEuler 发行版。

技术干货 1000

猿人学题库第七题——请求规律检测——采坑式学习

后会返回 var returnCitySN = {"cip": "ip地址", "timestamp": "1744011432"};值,估计后端 会给 ip 做一个标识 和一个。,就能返回正常数据了。接下来话不多说直接撸代码。3.所以逻辑就是先执行。

weixin_45091564的博客 415

从微服务到 Agent 服务:架构思维的迁移

微服务的概念最早在2014年由Martin Fowler提出,核心是“将单体应用拆分为一组小的服务,每个服务运行在独立的进程中,服务之间采用轻量级的通信机制互相协作,每个服务围绕具体业务构建,并且可以独立部署到生产环境”。单一职责:每个微服务只负责一个业务领域的功能,比如订单服务只处理订单相关的逻辑,用户服务只处理用户相关的逻辑被动响应:微服务是“哑的”,只有收到外部请求的时候才会执行逻辑,本身没有主动决策的能力固定流程:微服务的逻辑是硬编码的,执行流程是提前定义好的,只能按照程序员写的代码处理请求。

AI智能探索者的博客 275

猿人学web端爬虫攻防大赛赛题第7题——动态字体,随风漂移

形式的数据与页面中的数字是一一对应的,直接搞一个字典,获取每个页面的数据然后对照一下就完事了。可惜没那么简单,再访问同一个页面,你会发现对照关系变了。woff 文件是字体文件,实际上就是编码和字符的映射表,如 섴,&#x 是字符前缀,c134 是字符对应的编码。在看数据包的session中没有任何加密字段,请求头中也没有加密的参数。接下来就是获取所有召唤师的名字了,在js代码中进行了处理。所以上面的想法是有问题的,再看响应数据中的。有了映射字典就可以请求并解析到正确的数字了。与第一页的数据一致,没问题。

weixin_45091564的博客 1933

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【码上爬】第 1题解题

第一题的解题思路

qwh12345的博客 411

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

码上爬第七题【协程+对抗格式化检测+数组移位】

本文主要探讨了逆向分析中格式化检测的解决方案。通过抓包分析定位加密参数x和m,并解密响应密文。文章详细介绍了逆向步骤:1)抓包观察参数;2)定位加密位置并规避调试陷阱;3)分析解密代码。重点强调了调试时的作用域污染问题及操作风险,提出了扣代码的实用技巧。通过JS代码示例展示了加密逻辑的实现,为处理类似格式化检测问题提供了可复用的方法论。

去码头整点薯条 471

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

码上爬(7-9题中等题)

这三题属于一些网站加密的基本手段和情况了,遇见了一些学校官网,或者登录的网址的加密都可以直接扣下来,或者自己补环境了😊😊😊。

m0_74288368的博客 909

图灵平台第七题

爬虫图灵联系练习平台第七题,小白能看懂的爬虫代码,小白能学到的爬虫思路

2501_90454436的博客 822

码上爬(4-6简单难度)

从这里开始面对加密就开始要斗智斗勇了,有些加密是明显的摆在眼前的,例如上面的所有加密,都不用自己重新的补充,有些细节部分还是需要自己解决的,例如返现返回的是int数据,排查后才发现要的是string,自己经过str转化就可以啦😀😀😀。

m0_74288368的博客 628

【码上爬】第 4 题解题

码上爬第4题解题参考

其实我们一开始就不同路,只是我太想跟你走了 962

码上爬第七题

所以加密是W['uSzcs'](encodeURIComponent, dd['a'][yp(0x231, '3@lG')](W[yp(0x197, '@Q0o')](O, W['KjfHo'])))发现在函数开始的位置就有,因为作用域的问题,我们最好在最开始位置打上断点,然后释放本次请求,点击翻页再次触发。发现就是md5,所以M参数解决了,ts参数是M传递,M是时间戳,所以请求头加密全部解决,接下来就是请求体加密。发现在Y里面,而Y是上面生成的,在生成位置打上断点观察。

2201_76106654的博客 748
上一篇: 《封号码罗》关于js逆向猿人学第六题m和q值的获取[纯扣算法](二十七)
下一篇: 关于npm install md5报错the command again as root/Administrator的解决办法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值