Python实现字体混淆

本文介绍了Python实现字体混淆的技术,通过自定义字体文件来混淆网页文本,使得审查元素时显示为乱码。详细讲解了代码实现过程,包括处理输入数据、检查字体存在性以及替换字体编码等步骤。并提供了试验环境和GitHub源码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现某网站页面显示是正常的, 但是审查元素的时候, 却发现都是乱码, 觉得挺有意思的, 然后研究了一下, 网站实际上采用了字体混淆.

字体加密网站样本

背景介绍

字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的。实际上在计算机显示的字体, 都是由他们的编码决定的, 因此如果我们修改字体的映射, 网页直接显示Unicode编码, 这样的话, 就会同上图所示, 页面显示是正常的, 但是审查元素的时候是乱码. 在本文中, 我们不讨论如何还原字体, 我们来自己实现以下这种混淆方式.

代码实现

下面我们用Python来写一个可以生成混淆字体的脚本, 最终代码我会放到Github上.

试验环境

  • Python3.6
  • emoji==0.5.4
  • fonttools==4.2.0
  • Brotli==1.0.7

具体代码

首先, 我们先来写一个处理输入数据的函数, 基本作用是去掉重复的字, 然后去掉空白字符, 我们不处理emoji表情, 因此检测一下, 如果有的话, 也直接去掉.

def _pre_deal_obfuscator_input_str(s: str) -> str:
    """
    Pre Deal Input Strings, to deduplicate string & remove all whitespace & remove emoji.
    @param s:
    @return:
    """
    s = "".join(OrderedDict.fromkeys(s))
    s = emoji.demojize(s)
    pattern = re.compile(r'\s+')
    return re.sub(pattern, '', s)

在来写一个辅助函数, 检测字体是否存在这个字, 否则的话, 这个字是不能正常显示的.

def _check_cmap_include_all_text(cmap: dict, s: str) -> bool:
    for character in s:
        if ord(character) not in cmap:
            raise Exception(f'{character} Not in Font Lib!')
    return True

接下来, 就是代码的重点了, 先简单介绍一下代码的原理, 就是获取到字体的cmap, 然后做对应的替换, 替换成为混淆之后的代码, 这样就可以了, 原理比较简单, 直接来看代码吧.

def obfuscator(flag=0x0001, plain_text='', shadow_text='', source_font='', output_flag=0x0003, output_file_name='obfuscated_font', output_path='output', name_strings: FontNameTable = None):
    """
    Main Function for Font Obfuscator.
    @param flag: Notice performance issues if you input too many plain text.
        0x0001 Auto Obfuscate Font, You Should Only Input Plain Text.
        0x0002 You should set shadow_text.

        0x0100 This flag will shuffle plain text, you should to notice we if you input shadow text and set this flag, words without correspondence.

        0x1000 Add all numbers to plaintext.
        0x2000 Add all lower letters to plaintext.
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值