吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6316|回复: 68
收起左侧

[Web逆向] 记一次潇湘书院静态字体反爬

  [复制链接]
wangguang 发表于 2022-8-1 19:50
本帖最后由 wangguang 于 2022-8-1 19:51 编辑

网站链接:https://www.xxsy.net/chapter/3660424.html
思路:找到加密字体—>找到加密字体与字体文件的关系—>构建加密字体与原字体的关系—>把网站上加密的字体的数据替换成原数据
当我删除了网站<link href="//images.xxsy.net/css/pc/website/pagestatic.css?v=20210712" rel="stylesheet">这一行之后字体变了,说明字体反爬关键处在这个文件里

图一

图一

输入https://www.xxsy.net/Content/css/xxsyfont/xxsyfont.css便可直达css文件里面,可以看到里面的代码都是与字体有关的。那便取敌人首级,直接去拿字体文件。

图二

图二

抓包直接就能拿到字体文件

图三

图三

文件有了那么我们可以拿这个字体文件去解析字体的对应关系
图四.png
接下来就是敲代码了
说下代码思路吧,先下载字体文件对其解析成我们所能理解的文件
然后获取字体的映射关系并且写字体字典
最重要的就是构建加密字体与字体字典的关系。网站源代码加密字体是这样子的—>的,字典文件里面的对应关系却是uniE800—>的
于是乎,把源代码的&#x替换成uni并把其他字符大写化
把被替换后的源代码里的uniE***替换成字典里面的uniE***—>*(*是所对应的字符的意思)
代码如下:
import re
import requests
from fontTools.ttLib import TTFont
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
#下载字体二进制文件—>微笑面对生活—^^—
font=requests.get("https://www.xxsy.net/Content/css/xxsyfont/yahei/font.ttf",headers=headers)
with open("font.ttf",mode="wb")as f:
    f.write(font.content)
#转换字体文件为我们能看得懂的文件—>微笑面对生活—^^—
fo = TTFont("font.ttf")
fo.saveXML('font.xml')
#获取字体的映射关系—>微笑面对生活—^^—
font_map = fo['cmap'].getBestCmap()
#替换字典
zd = {'uniE800':'的',
      'uniE801':'一',
      'uniE802':'是',
      'uniE803':'了',
      'uniE804': '我',
      'uniE805': '不',
      'uniE806': '人',
      'uniE807': '在',
      'uniE808': '他',
      'uniE809': '有',
      'uniE80A': '这',
      'uniE80B': '个',
      'uniE80C': '上',
      'uniE80D': '们',
      'uniE80E': '来',
      'uniE80F': '到',
      'uniE810': '时',
      'uniE811': '大',
      'uniE812': '地',
      'uniE813': '为',
      'uniE814': '子',
      'uniE815': '中',
      'uniE816': '你',
      'uniE817': '说',
      'uniE818': '生',
      'uniE819': '国',
      'uniE81A': '年',
      'uniE81B': '着',
      'uniE81C': '就',
      'uniE81D': '那',
      'uniE81E': '和',
      'uniE81F': '要',
      'uniE820': '她',
      'uniE821': '出',
      'uniE822': '也',
      'uniE823': '得',
      'uniE824': '里',
      'uniE825': '后',
      'uniE826': '自',
      'uniE827': '以',
      'uniE828': '会',
      'uniE829': '家',
      'uniE82A': '可',
      'uniE82B': '下',
      'uniE82C': '而',
      'uniE82D': '过',
      'uniE82E': '天',
      'uniE82F': '去',
      'uniE830': '能',
      'uniE831': '对',
      'uniE832': '小',
      'uniE833': '多',
      'uniE834': '然',
      'uniE835': '于',
      'uniE836': '心',
      'uniE837': '学',
      'uniE838': '么',
      'uniE839': '之',
      'uniE83A': '都',
      'uniE83B': '好',
      'uniE83C': '看',
      'uniE83D': '起',
      'uniE83E': '发',
      'uniE83F': '当',
      'uniE840': '没',
      'uniE841': '成',
      'uniE842': '只',
      'uniE843': '如',
      'uniE844': '事',
      'uniE845': '把',
      'uniE846': '还',
      'uniE847': '用',
      'uniE848': '第',
      'uniE849': '样',
      'uniE84A': '道',
      'uniE84B': '想',
      'uniE84C': '作',
      'uniE84D': '种',
      'uniE84E': '开',
      'uniE84F': '美',
      'uniE850': '总',
      'uniE851': '从',
      'uniE852': '无',
      'uniE853': '情',
      'uniE854': '已',
      'uniE855': '面',
      'uniE856': '最',
      'uniE857': '女',
      'uniE858': '但',
      'uniE859': '现',
      'uniE85A': '前',
      'uniE85B': '些',
      'uniE85C': '所',
      'uniE85D': '同',
      'uniE85E': '日',
      'uniE85F': '手',
      'uniE860': '又',
      'uniE861': '行',
      'uniE862': '意',
      'uniE863': '动'
      }
# 获取网页源码—>微笑面对生活—^^—
html = requests.get("https://www.xxsy.net/chapter/3660424.html")
html1 = html.text
# 将网页上的&#x替换成uni,目的是为了后面更好替换字体—>微笑面对生活—^^—
html1 = html1.replace('&#x','uni')
# 正则创建—>微笑面对生活—^^—
re1=re.compile('<d>uni(.*?);</d>',re.I|re.S)
re1=re1.findall(html1)
# 将网页上面的&#x后面的字体大写化—>微笑面对生活—^^—
for i in range(0,1000):
      try:
            html1 = html1.replace(re1, re1.upper(), i)
      except:
            break

# 替换网页上的加密字体—>微笑面对生活—^^—
for x,y in font_map.items():
      try:
            thq = '<d>' + fo['cmap'].getBestCmap()[x] + ';</d>'
            thh = zd[y]
            html1=html1.replace(thq,thh,i)
      except:
            break
# 通过正则找到需要爬取的内容(文章标题与文章内容)—>微笑面对生活—^^—
re3=re.compile('<span class="chapter-section" data-index=".*?">(.*?)</span>',re.I|re.S)
re3=re3.findall(html1)
with open(re3[0] + '.txt', mode="w", encoding='utf-8')as f:
      f.writelines(re3)

注意:文章仅供技术交流使用,如有侵权,联系我删除

免费评分

参与人数 20吾爱币 +23 热心值 +19 收起 理由
timeni + 1 + 1 用心讨论,共获提升!
icodeme + 1 我很赞同!
_达圣 + 1 + 1 用心讨论,共获提升!
RediftmesF + 1 + 1 我很赞同!
DBsan + 1 用心讨论,共获提升!
BMCS26 + 1 热心回复!
李佑辰 + 1 + 1 我很赞同!
hiplease + 1 + 1 谢谢@Thanks!
外酥内嫩 + 1 + 1 谢谢@Thanks!
yuweb + 1 + 1 热心回复!
水木杉 + 1 + 1 厉害厉害
ddddhm + 1 + 1 我很赞同!
WHYXLX + 1 + 1 鼓励转贴优秀软件安全工具和文档!
努力加载中 + 1 + 1 热心回复!
whitehack + 1 我很赞同!
warehouse + 1 + 1 用心讨论,共获提升!
唐小样儿 + 1 + 1 热心回复!
skiss + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
random77 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
涛之雨 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| wangguang 发表于 2022-8-2 09:34
李玉风我爱你 发表于 2022-8-2 09:11
请问那个字体的替换字典是一个个手动生成的吗?

您可以参考一下渔哥那篇文章,用ddddocr去识别。有些大佬是用按键精灵识图去自动识别,而这个网站是静态字体,不会变的,不需要每次都去重新写替换字典。而且我自己也比较菜,就手敲的,您可以直接复制我手敲的字典。

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
李玉风我爱你 + 2 + 1 我很赞同!

查看全部评分

twapj 发表于 2022-8-2 00:12
camyan 发表于 2022-8-2 07:48
Tank2021 发表于 2022-8-2 08:02
楼主高手啊,拜膜!
hbymyzw 发表于 2022-8-2 08:20
这绝对是实用技术!
pizixia 发表于 2022-8-2 08:21
感谢楼主,马上尝试一下
kllt 发表于 2022-8-2 08:30
感谢楼主分享,学到老!
joylau123 发表于 2022-8-2 08:31
多谢楼主分享.学习一下
jone33 发表于 2022-8-2 08:42
这绝对是实用技术!
李玉风我爱你 发表于 2022-8-2 09:11
请问那个字体的替换字典是一个个手动生成的吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 06:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表