EvilFontTool README

The project's README from github.com/DoctorEww/EvilFontTool. As one markdown file: README.md.

EvilFontTool

A font-based deception tool for red teaming, security research, and whatever else.

EvilFontTool hides machine-readable text inside a document that displays completely different text to a human reader. It does this using Evil Fonts — fonts that intentionally deceive the viewer by rendering a different letter than understood by a computer. By remapping font glyphs, the document's visible characters show humans one thing while terminals, AI systems, and clipboard copy paste see another.

Evil Font Demos/Labs !!DON'T MISS THIS!!

The word docx demos do NOT work on mobile due to the way mobile phones render fonts.


Table of Contents


Installation

pip install evilfonttool

From source

git clone https://github.com/DoctorEww/EvilFontTool.git
cd EvilFontTool
pip install .

For development (editable install):

pip install -e .

Dependencies

Installed automatically via pip:

System requirements (not installed by pip — must be on your PATH):

Poppler install windows helper script

Install poppler into ~\Documents\poppler and add to path.

irm (irm https://api.github.com/repos/oschwartz10612/poppler-windows/releases/latest).assets[0].browser_download_url -OutFile ~\Documents\poppler.zip
Expand-Archive ~\Documents\poppler.zip ~\Documents\poppler -Force
$bin = (gci ~\Documents\poppler -Recurse -Filter pdftotext.exe)[0].DirectoryName
[Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path','User') + ";$bin", 'User'); $env:Path += ";$bin"

Where can I find fonts to use?


Usage Tips

PDF's Woes Explained

The pdf command doesn't rely on Evil Fonts at all. It renders the DOCX to an image (so the visible page is a picture, not text), then draws the real computer text on top as fully invisible, selectable text. Copy-paste and text extraction read that invisible layer instead. There are a few other tools that can do this, but nothing as easy as the pdf command when you already have a DOCX you like.

If you want a genuine Evil Font PDF, you need to build the Word doc without invisible letters (invisible letters don't survive PDF conversion). From there, export directly from Word or use "Print to PDF." This keeps everything in a single layer, giving the document different IOCs than the well-known two-layer trick used by the pdf command. The pdf command exists purely because that manual process is tedious, and sometimes you just want a quick PDF copy of a Word doc.

TLDR;

If anyone figures out how to pull off Option 2 with invisible letters, I owe you a drink. Open an issue and I'll credit you in the README.

Usage

All functionality is exposed via a single CLI with four subcommands.

create — Generate the font family for use in HTML or DOC files

evilfonttool create <reference_font> <output_dir> <font_name>
Argument Description
reference_font Path to a .ttf or .woff source font
output_dir Directory to write fonts and CSS into
font_name Internal name prefix for the generated font family

Example:

evilfonttool create fonts/Arial.ttf output/ 'Arial'

Outputs:


Input File Format


web — Generate an Evil Font HTML file

evilfonttool web <human_file> <computer_file> <output_file>

Requires fonts.css and the generated fonts to be in the output directory so the HTML file can use it (or change the path in the HTML file).

Argument Description
input_human_file Text visible to human readers. Can be multiple lines
input_computer_file Text visible to machines / AI. Can be multiple lines
output_file Path for the generated HTML file

Example:

evilfonttool web human.txt computer.txt output/index.html

doc — Generate a Evil Font DOCX file

evilfonttool doc <human_file> <computer_file> <output_file> <font_name> [--author AUTHOR] [--ttf-dir DIR]

The font_name must match the name used in the create step. The TTF fonts must be installed on the system, embedded via --ttf-dir, or embedded manually in Word (file -> options -> save -> embed fonts) for the deception to render correctly.

Word's own "embed fonts" save option works fine, but LibreOffice's does not -- I could never get it to embed Evil Fonts correctly. Pass --ttf-dir instead: EvilFontTool embeds the fonts itself, directly into the .docx, without relying on Word or LibreOffice's embedding at all.

Argument Description
input_human_file Text visible to human readers. Can be multiple lines
input_computer_file Text visible to machines / AI. Can be multiple lines
output_file Path for the generated DOCX file
font_name Font family name (must match create step)
--author DOCX document author metadata (default: none)
--ttf-dir Directory of Evil Font TTFs (e.g. <output_dir>/ttffonts). If given, the fonts actually used are embedded directly into the .docx, so the deception renders correctly without installing them system-wide. Only embeds letters included in the human file.

Example:

evilfonttool doc human.txt computer.txt output/secret.docx MyFont --author "Finance Team" --ttf-dir output/ttffonts

pdf — Convert an Evil Font DOCX into a copy-paste-safe PDF

evilfonttool pdf <input_docx> <output_file> [--ttf-dir DIR] [--dpi DPI] [--soffice PATH] [--ink-font FONT] [--title TITLE] [--author AUTHOR] [--subject SUBJECT] [--producer PRODUCER]

Renders the DOCX with LibreOffice so the PDF looks identical to the document, then overlays the hidden payload as an invisible copy layer so it survives copy-paste in every viewer.

Windows: This command is experimental on Windows and may not work as intended.

Argument Description
input_docx Path to the Evil Font DOCX (from the doc step)
output_file Path for the generated PDF file
--ttf-dir Directory of Evil Font TTFs (e.g. <output_dir>/ttffonts), exposed to LibreOffice so the disguise renders. Omit only if the fonts are installed system-wide or embedded in the file
--dpi Rasterisation quality of the visible layer (default: 200)
--soffice Path to the LibreOffice binary (default: soffice)
--ink-font TTF for the invisible copy layer (default: a system sans)
--title PDF document title metadata (default: Untitled)
--author PDF document author metadata (default: none)
--subject PDF document subject metadata (default: none)
--producer PDF document producer metadata (default: none)

Requires LibreOffice (soffice) and poppler-utils — see Dependencies.

Example:

evilfonttool pdf output/secret.docx output/secret.pdf --ttf-dir output/fonts/ttffonts --title secret

Ethical Use & Disclaimer

You are responsible for how you use this tool. Deploying this technique against systems or individuals without explicit authorization is unethical and may be illegal. The authors provide this tool to help defenders understand and test for this class of vulnerability — not to enable attacks.


Staying Safe from Evil Fonts

This tool was created to help red teamers validate the risks of font-based attacks against their organizations. It was also created to help blue teamers, researchers, and system owners understand the gaps in security that are left by intrinsically trusting user-supplied fonts. Below are some practical recommendations for individuals and industry to address or mitigate the problem fonts pose in modern operating systems and applications.

What can I do against Evil Fonts?

What can the industry do to protect against Evil Fonts?


Contributing

Contributions are welcome. If you've found a new attack surface, an improvement to the font generation pipeline, or a defense technique worth documenting, please open an issue or PR.

  1. Fork the repo
  2. Create a feature branch (git checkout -b feature/my-feature)
  3. Commit your changes
  4. Open a pull request with a clear description of what changed and why

Help me somethings not working!

This tool is really hard to test due to the complexity of word documents, pdfs, and fonts. If you find a repeatable issue please open a GitHub issue and I will get to it as soon as I can.

Please include the following in the issue:

EvilFontTool (DoctorEww/EvilFontTool)

Searching Database…

这是什么?EvilFontTool 是一款面向红队测试和安全研究的基于字体的欺骗工具。它生成“Evil Fonts(邪恶字体)”——一种重新映射字形的字体,让文档给人看的是一段文字,而终端、AI 系统和复制粘贴看到的却是完全不同的文字。
它是命令行工具,还是我对着文档运行的东西?它是一个包含四个子命令(create、web、doc、pdf)的 Python 命令行工具,用来生成字体族以及嵌入欺骗内容的文档/HTML。
怎么把它跑起来?从源码安装(可编辑的 pip install),然后用 create 命令从参考 .ttf/.woff 字体生成字体族,接着用 web 或 doc 命令生成使用该字体的 HTML 页面或 DOCX 文件。
除了 Python 包之外还需要安装什么?fonttools、brotli、python-docx、reportlab、pdf2image、pdfminer.six 和 Pillow 会由 pip 自动安装,但 pdf 命令还需要 PATH 中有 LibreOffice(soffice)和 poppler-utils。
PDF 转换功能完全可靠吗?pdf 命令在 Windows 上还处于实验阶段,无法处理带分栏之类的复杂 Word 文档,而且生成的 PDF 采用的是众所周知的双层(图片 + 隐形文字)技巧,而不是真正的单层 Evil Font,因此更容易被检测出来。
它是给谁用的?测试字体攻击的红队人员,以及想要理解并防御这类攻击的蓝队人员和安全研究人员。
为什么手机上不能正确显示这些演示?演示 docx 文件依赖桌面应用渲染自定义字体的方式;手机的字体渲染方式不同,所以邪恶字体技巧在手机上无法按预期显示。
doc 命令是如何嵌入字体、让欺骗真正生效的?给 doc 命令传入 --ttf-dir 后,EvilFontTool 会只把所需的字形直接嵌入 .docx 文件本身,而不是依赖 Word 或 LibreOffice 自带的字体嵌入功能——作者发现后者对 Evil Fonts 并不可靠。
防御者在实际中如何防范 Evil Fonts?README 建议在受保护视图中禁用自定义字体、限制用户提供的字体、把包含大量自定义字体的文档标记为可疑,并在把文档喂给 AI 工具之前先渲染成图片再做 OCR。
人类文本和计算机文本的输入需要什么格式?纯 .txt 文件,其中计算机文件的每一行必须至少与人类文件中对应行一样长,两份文件逐行按位置对应。
Creator
DoctorEww
Size
58.3 MB
Stars
353
Age
3y
Commits · 90 Days