【OCR识别】使用OCR技术还原加密字体文字

文章目录

  • 1. 写在前面
  • 2. 页面分析
  • 3. 字符知识
  • 4. 加密分析

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  目前市面上有不少的网站使用了字体加密技术,像一些重要的数字内容使用字体加密很常见!从早期的静态固定字体文件随着不断的对抗演进到目前的动态字体文件,从PC端的应用到目前APP页面的普及使用

本期文字将以红色小番茄为例,咱们使用OCR识别技术来攻克一下字体加密

2. 页面分析

我们打开首先网站分析一下,可以看到响应的HTML内容中网页显示的本文内容,均是看起来晦涩难懂的字符,这就是字体加密。如下所示:

在这里插入图片描述

对于Web端的字体加密,我们可能都知道会有相应的woff类型的文件,存储着自定义的字体,它的作用则是让网站能够使用这些自定义的字体来显示加密的文本内容,如下所示:

在这里插入图片描述

3. 字符知识

在真正的内容分析开始之前,我们需要了解的一些知识点。这里不知道的朋友认真学,所有的中文汉字它都自己对应的一串数字码,也叫做Unicode码点,这是一种国际化的字符编码标准!为世界上几乎所有的字符集提供了一个唯一的标识

它们是一个非负整数,如下作者随机打印了几个示例:

在这里插入图片描述

同理我们使用Python的内置函数ord可以查看字符的码点,chr函数则将码点转换为字符

4. 加密分析

接下来,这里将网页中加密的文本拿一小段下来简单的进行一个测试。使用ord打印一下所有字符的码点,可以看到一个特征!就是每一个被加密的字体对应的码点都是58…这样的,如下所示:

在这里插入图片描述

这个时候我们则需要将上面提到的woff文件下载下来,并使用fontTools库来加载字体并解析其结构,代码如下:

from fontTools.ttLib import TTFont

url = 'https://lf6-awef.bytetos.com/obj/awesome-font/c/dc027189e0ba4cd-700.woff2'

response = requests.get(url).content
with TTFont(BytesIO(response)) as font_parse:
    u_d = font_parse.getBestCmap())

将会得到一个码点与字体编码对应的字典,如下所示:

{58344: 'gid58344', 58345: 'gid58345', 58346: 'gid58346', 58347: 'gid58347', 58348: 'gid58348', 58349: 'gid58349', 58350: 'gid58350', 58351: 'gid58351', 58352: 'gid58352'}

接下来,我们需要将gid编码对应的文字信息拿到,并建立字典。方便我们后续在对文本内容进行还原的时候调用,加密字体编码如何对应明文数据,代码实现如下:

unicode_reuslt = []
for key, _ in u_d.items():
    unicode_reuslt.append(key)
char_list = [chr(ch_unicode) for ch_unicode in unicode_reuslt]
normal_dict, error_dict = font_to_img(char_list, ttf_name)
new_dict = {ord(key): value for key, value in normal_dict.items()}
print(new_dict)

在这里将使用到OCR识别技术,去还原加密字体的文字,这也是当前比较主流的一种方案,代码实现如下所示:

def font_to_img(code_list, filename, score=0.95):
    normal_dict = {}
    ocr = CnOcr()

    for char_list in code_list:
        char_code = char_list.encode().decode()
        img_size = 1024
        img = Image.new('img', (img_size, img_size), 255)
        draw = ImageDraw.Draw(img)
        font = ImageFont.truetype(filename, int(img_size * 0.7))
        x, y = draw.textsize(char_code, font=font)
        draw.text(((img_size - x) // 2, (img_size - y) // 2), char_code, font=font, fill=0)
        img = img.convert("RGB")
        word = ocr.ocr_for_single_line(np.array(img))
        normal_dict[char_code] = word["text"]
         
    return normal_dict

如上代码,这里简单解读一下!score参数表示OCR对该文本的识别得分,上面代码中没有使用的原因是有较小概率的丢失率!这个问题可以找一些更精准的模型来识别

再说说识别文字的流程与原理,上面使用Image来创建了一个白色的背景图像,然后使用ImageDraw在图像上绘制出字符,字体大小为图像大小的70%

然后将图像转换为RGB格式,最后使用Ocr对图像进行单行识别,获取识别结果以及识别得分,结果如下所示:

在这里插入图片描述

接下来,我门需要做的就是对加密的文本内容进行遍历,对每一个字符进行编码转换,得到对对应的码点!提取码点为58特征的加密字体,然后从上面字典获取对应的文字,如下所示:

在这里插入图片描述

最终我们再通过上述的代码将加密打散还原出来的加密字体文字,拼接成完整的句子。这里的话我们将所有加密特征与非加密文字内容完成组装即可,最终内容还原如下所示:

在这里插入图片描述

以上是加密字体文字内容还原的全部流程,如需要完整的Python代码进行测试或学习,可联系作者获取!

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术,自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat,Centos,OracleLinux 三种。 三者的区别简单说明如下: Red Hat Enterprise Linux (RHEL): RHEL 是由美国…

微信小程序构建npm失败解决方式

安装完所需要的依赖后,在微信开发者工具菜单栏中选择:“工具” -> “构建 npm”,但是失败。 解决方法:修改 project.config.json 开发者工具创建的项目,miniprogramRoot 默认为 miniprogram,package.js…

Vue3自定义文件列表页面(含上传、搜索、复制链接)

文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"container"><h1>文件列表</h1><div class"header-actions"><a-input placeholder"输入关键词搜索" v-model:value"…

element-ui附件上传及在线查看详细总结,后续赋源码

一、附件上传 1、在element-ui上面复制相应代码 a、accept"image/*,.pdf,.docx,.xlsx,.doc,.xls" 是规定上传文件的类型&#xff0c;若是不限制&#xff0c;可以直接将accept‘all即可&#xff1b; b、:action"action" 这个属性就是你的上传附件的地址&am…

spring boot集成Elasticsearch 7.16.3

环境&#xff1a;Elasticsearch 版本 7.16.3 Elasticsearch for windows下载地址 windows 若依 spring boot版本 2.6.0 pom文件添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch<…

细数Android开发者的艰辛历程,android零基础

首先我们来看一下组件化项目和传统项目的区别: 在传统的项目里 我们通常情况下会有一个commonLib的Libary模块和一个app的application模块&#xff0c;业务中的逻辑都写在app中各个功能模块放到不同的包下。这样做有以下几个主要的缺点&#xff1a; 1.无论分包做的再好&…

LLM@本地语言大模型@Gemma的安装与使用@dockerDesktop的安装和启动

文章目录 准备refsollama安装过程2b模型的效果小结&#x1f47a; ollama的进一步使用帮助文档查看ollama安装了哪些模型使用皮肤来使聊天更易用 使用Chatbot UI皮肤安装docker&#x1f47a;启动docker载入和退出dockerchatbot 网页版皮肤 使用命令行聊天小结&#x1f47a; 准备…

探索口袋中的远程控制神器

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

tomcat安装步骤流程

安装tomcat是基于安装java的基础上的 JAVA 举例说明&#xff1a; 关闭防火墙 下载java [rootlocalhost ~]#yum install java -y rootlocalhost ~]#yum install epel-release.noarch -y [rootlocalhost ~]#yum provides */javac [rootlocalhost data]#yum install java-1.8.0-o…

Intel SGX 概述 --潦草笔记

文章目录 前言一、SGX介绍1.1 指令介绍1.2 数据结构 二、内存保护过程2.1 enclave页面缓存&#xff08;EPC&#xff09;2.2 Enclave页面缓存映射&#xff08;EPCM&#xff09; 三、部署SGX参考资料 前言 SGX是Intel开发的新的处理器技术&#xff0c;可以在计算平台上提供一个可…

Leetcode583. 两个字符串的删除操作 -代码随想录

题目&#xff1a; 代码(首刷自解 2024年2月29日&#xff09;&#xff1a; class Solution { public:// 动态规划 好像和找最长公共子序列一样&#xff1f;int minDistance(string word1, string word2) {int sz1 word1.size();int sz2 word2.size();// dp initvector<vec…

form 表单 转换为json-多种(通用/多维数组) 全方案

JSON 在 JavaScript 中重要&#xff0c;因其轻量、通用、易读&#xff0c;适用于数据交换、存储和传输。 为什么写这个文章&#xff0c;废话不多&#xff0c;直接近主题。 一、通用 一般采用jquery编写 var key $(#"cyberwin_form_card_newadd").serialize(); 结…

自动化测试摸索:python+selenium+pytest(持续更新.....)

一、环境搭建 1、python 安装 下载链接&#xff1a;Python Releases for Windows | Python.org 自己选择合适的版本下载 当下载完毕时&#xff0c;找到该安装程序&#xff1a;python-3.12.2-amd64.exe文件&#xff0c;双击启动安装向导。 为了防止C:盘文件因系统故障或者无…

C# 高阶语法 —— Winfrom链接SQL数据库的存储过程

存储过程在应用程序端的使用的优点 1 如果sql语句直接写在客户端&#xff0c;以一个字符串的形式体现的&#xff0c;提示不友好&#xff0c;会导致效率降低 2 sql语句写在客户端&#xff0c;可以利用sql注入进行攻击&#xff0c;为了安全性&#xff0c;可以把sql封装在…

H3C防火墙安全授权导入

一、防火墙授权概述 前面我们已经了解了一些防火墙的基本概念&#xff0c;有讲过防火墙除了一些基本功能&#xff0c;还有一些高级安全防护&#xff0c;但是这些功能需要另外独立授权&#xff0c;不影响基本使用。这里以H3C防火墙为例进行大概了解下。 正常情况下&#xff0c;防…

01-prometheus监控系统-安装部署prometheus

一、准备环境 主机名ip配置prometheus-server3110.0.0.311核1g-20GBprometheus-server3210.0.0.311核1g-20GBprometheus-server3310.0.0.311核1g-20GB 二、下载/上传软件包 1&#xff0c;软件包地址 这里给大家准备了百度云盘的安装包&#xff1b; 链接&#xff1a;https:/…

upload-Labs靶场“1-5”关通关教程

君衍. 一、环境搭建二、第一关 前端JS检测后缀1、源码分析2、禁用浏览器JS上传3、burp抓包修改 三、第二关 MIME头验证1、源码分析2、burp抓包绕过 四、第三关 PHP3绕过1、源码分析2、PHP3绕过 五、第四关 .htaccess重写绕过1、源码分析2、.htaccess复写 六、第五关 黑名单大小…

VPP学习之配置VXLAN隧道

VPP学习之配置VXLAN隧道 一、VXLAN技术 VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN…

互动多媒体内容的魔法:如何让你的网页活起来

互动多媒体内容的魔法&#xff1a;如何让你的网页活起来 前言 在之前的文章中&#xff0c;我们探讨了网页结构中的基础介绍&#xff0c;本文将介绍如何通过简单的交互增强用户体验&#xff0c;包括图像大小的动态切换&#xff0c;以及音视频内容的播放控制来介绍网页多媒体的具…

测试:4核8G服务器并发数,支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…