记一次某书院静态字体反爬
2022-8-3 00:4:22 Author: web安全工具库(查看原文) 阅读量:17 收藏

网站链接: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文件里面,可以看到里面的代码都是与字体有关的。那便取敌人首级,直接去拿字体文件。


抓包直接就能拿到字体文件
文件有了那么我们可以拿这个字体文件去解析字体的对应关系

接下来就是敲代码了
说下代码思路吧,先下载字体文件对其解析成我们所能理解的文件
然后获取字体的映射关系并且写字体字典
最重要的就是构建加密字体与字体字典的关系。网站源代码加密字体是这样子的—>的,字典文件里面的对应关系却是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)

该内容转载自网络,更多内容请点击“阅读原文”


文章来源: http://mp.weixin.qq.com/s?__biz=MzI4MDQ5MjY1Mg==&mid=2247502802&idx=2&sn=296974822e941ea545435875c710f080&chksm=ebb524d1dcc2adc7cacf17118a0ca80e9a2b2f04fde575c6741abe1eb607a7e76f700c961a1b#rd
如有侵权请联系:admin#unsafe.sh