Flask + YARA-Python*实现文件扫描功能

以下是一个 完整的 Web API 示例,使用 Flask + YARA-Python 实现文件扫描功能,支持上传文件并返回 YARA 规则匹配结果。


✅ 功能说明

  • 提供一个 /scan 接口,支持文件上传
  • 使用预加载的 YARA 规则进行扫描
  • 返回 JSON 格式的匹配结果
  • 支持多规则、可扩展

📦 项目结构

yara-flask-api/
├── app.py                  # Flask 主程序
├── rules/                  # YARA 规则目录
│   ├── hello.yar
│   └── suspicious_pe.yar
├── uploads/                # 临时存储上传文件(可选)
└── requirements.txt

1. 安装依赖

创建 requirements.txt

flask
yara-python

安装:

pip install -r requirements.txt

确保系统已安装 YARA 开发库:

  • Ubuntu: sudo apt-get install yara libyara-dev
  • macOS: brew install yara

2. 编写 YARA 规则

rules/hello.yar

rule ContainsHello
{strings:$hello = "Hello" ascii nocasecondition:$hello
}

rules/suspicious_pe.yar

import "pe"rule SuspiciousPEScan
{meta:description = "Detects common suspicious PE imports"strings:$create_remote_thread = "CreateRemoteThread" fullword ascii$write_process_memory = "WriteProcessMemory" fullword asciicondition:pe.is_pe andany of them
}

3. Flask Web API 主程序 (app.py)

import os
import yara
from flask import Flask, request, jsonify
from werkzeug.utils import secure_filename# 初始化 Flask 应用
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024  # 10MB 限制# 确保目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
os.makedirs('rules', exist_ok=True)# 编译所有 .yar 规则
def load_yara_rules():try:rule_files = {}for filename in os.listdir('rules'):if filename.endswith('.yar'):filepath = os.path.join('rules', filename)rule_files[f"rule_{filename}"] = filepathrules = yara.compile(filepaths=rule_files)print(f"[+] 成功加载 {len(rule_files)} 条 YARA 规则")return rulesexcept yara.Error as e:print(f"[-] YARA 规则编译失败: {e}")return None# 全局加载规则
yara_rules = load_yara_rules()if not yara_rules:print("[-] 无法启动:YARA 规则加载失败")exit(1)# 根路径
@app.route('/')
def index():return '''<h3>YARA 扫描 API 服务</h3><p>使用 POST /scan 上传文件进行扫描</p>'''# 扫描接口
@app.route('/scan', methods=['POST'])
def scan_file():if 'file' not in request.files:return jsonify({"error": "未提供文件字段 'file'"}), 400file = request.files['file']if file.filename == '':return jsonify({"error": "未选择文件"}), 400if file:filename = secure_filename(file.filename)filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)file.save(filepath)try:# 执行 YARA 扫描matches = yara_rules.match(filepath)result = {"filename": filename,"matches": []}for match in matches:indicators = []for string in match.strings:indicators.append({"offset": f"0x{string[0]:X}","identifier": string[1],"data": string[2].decode('utf-8', errors='replace')})result["matches"].append({"rule": match.rule,"tags": match.tags,"indicators": indicators})os.remove(filepath)  # 扫描后删除文件(可选)return jsonify(result), 200except Exception as e:os.remove(filepath)return jsonify({"error": f"扫描出错: {str(e)}"}), 500return jsonify({"error": "未知错误"}), 500# 启动服务
if __name__ == '__main__':print("🚀 启动 YARA 扫描服务 http://127.0.0.1:5000")app.run(host='0.0.0.0', port=5000, debug=False)

4. 启动服务

python app.py

服务将运行在:http://127.0.0.1:5000


5. 测试 API(使用 curl)

测试文本文件

echo "Hello, this is a test." > test.txt
curl -X POST -F "file=@test.txt" http://127.0.0.1:5000/scan

✅ 预期输出(匹配 ContainsHello):

{"filename": "test.txt","matches": [{"rule": "ContainsHello","tags": [],"indicators": [{"offset": "0x0","identifier": "$hello","data": "Hello"}]}]
}

测试 PE 文件(如 exe)

curl -X POST -F "file=@malware.exe" http://127.0.0.1:5000/scan

如果该 PE 文件调用了 CreateRemoteThread,会触发 SuspiciousPEScan 规则。

总结

这个 Flask + YARA 的 Web API 示例可以:

  • 快速集成到 SOC、EDR、文件网关等系统
  • 用于自动化恶意软件检测流水线
  • 作为威胁情报分析的后端引擎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinForm之NumericUpDown控件

NumericUpDown&#xff08;数字上下控件&#xff09;是 WinForm 中专门用于输入和调整数值的控件&#xff0c;它结合了文本框和上下按钮&#xff0c;用户可通过点击按钮或直接输入来设置数值&#xff0c;且能严格限制数值范围&#xff08;最小值、最大值&#xff09;和步长&…

一文读懂K8S kubectl 命令,运维小白必看!

一、Kubectl 是什么? Kubectl 是 Kubernetes(简称 K8S)集群的命令行工具,它就像是一把万能钥匙,让我们可以与 K8S 集群进行交互,轻松管理集群中的各种资源,像是 Pod、Service、Deployment 等等。通过向 K8S API 发送 REST 请求,kubectl 实现了对集群资源的增删改查等操…

髋臼方向的定义与测量-I

近期看到关于髋臼方向不同应用场景下的不同定义&#xff0c;觉得特别有意思&#xff0c;但是&#xff0c;原文是影印本&#xff0c;不太方便实用屏幕取词翻译&#xff0c;且一些专业术语也不太好理解。 因此&#xff0c;我将原文和翻译整理了一些&#xff0c;不对的地方&#x…

Python爬虫实战:研究mahotas库,构建图像获取及处理系统

一、引言 (一)研究背景 在信息爆炸的时代,图像作为一种直观、丰富的信息载体,其数量在互联网上呈现指数级增长。这些图像数据涵盖了自然景观、动植物、工业产品等多个领域,为模式识别、机器学习等研究提供了宝贵的数据源。特别是在植物学研究领域,叶片图像包含了丰富的…

【04】海康相机C#开发——VS 在编译时,提示“Files的值“+乱码情况解决办法’ ,C#项目打开编译时报错:Files 的值“IGEF‘,

文章目录C#项目打开&#xff0c;用VS 在编译时编译时报错&#xff1a;Files 的值“乱码&#xff1b; 有的编译器会显示&#xff1a;Files的值“IGEF 以上报错都为同一种错误&#xff0c;.net中的配置文件乱码导致的&#xff1a; 找到项目目录下的“..\obj\Debug\”的文件夹中…

MySQL隐式转换陷阱:从错误查询案例解析索引失效与数据类型匹配

开始之前&#xff0c;先问个问题问题&#xff1a;mysql 数据类型是date &#xff0c;怎么写查询条件索引有效&#xff1f; ——下面带着疑问看下去。 一、mysql-8.隐式转换导致索引失效或查出不符合where条件结果 今天在执行一条sql语句时候&#xff0c;where条件写错了&#x…

【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化

目录sklearn数据集玩具数据集现实世界数据集加载玩具数据集获取现实世界数据集本地csv数据创建csv文件pandas加载csv数据集划分特征工程步骤特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入门(docker桌面版)(提示wsl版本太低解决办法)

参考文章&#xff1a;Docker Desktop Engine Stopped原因分析&#xff08;docker桌面停止&#xff09;WSL没装或没更新 文章目录Docker Desktop入门指南1. Docker Desktop简介2. 安装Docker Desktop2.1 系统要求2.2 下载和安装3. 配置Docker Desktop修改默认存储路径4. 运行你的…

《n8n基础教学》第三节:模拟一个自动化场景

1、模拟场景Nathan &#x1f64b;是 ABCorp 的分析经理&#xff0c;他的工作是支持 ABCorp 团队的报告和分析。作为一个真正的多面手&#xff0c;他还负责处理一些杂项任务。Nathan 做的一些事情是重复且枯燥的。他希望自动化其中一些任务&#xff0c;以避免精疲力竭。作为一名…

CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(三)

CodeRush 是专为 Visual Studio 打造的高效开发插件&#xff0c;通过集成 AI 驱动功能&#xff08;如自然语言生成代码的 AiGen 和智能搜索逻辑的 AiFind&#xff09;、语音交互及深度重构工具&#xff0c;直接在 IDE 内无缝完成代码生成、修改与导航&#xff0c;消除窗口切换与…

如何从头开始搭建属于自己的家用nas实现内网穿透访问

最近我在家部署了群晖NAS923&#xff0c;从而实现内网穿透&#xff0c;下面写一个新手向教程&#xff1a; 一、硬件安装与初始化设置 1. 硬盘安装&#xff08;已完成可跳过&#xff09; 群晖 923 支持 4 块 3.5 英寸硬盘&#xff0c;开箱后取出硬盘架&#xff0c;将硬盘&am…

mysql 之多表

mysql之多表已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09;CREATE table dep…

【Django】-6- 登录用户身份鉴权

一、&#x1f6e1;️ Django 鉴权 & 登录控制 Django 自带的鉴权系统&#xff08;用户身份管理小管家&#xff09;鉴权系统能干啥&#xff1f;Django 自带的鉴权系统&#xff0c;就像一个 “用户身份管家” &#xff0c;帮你管好这些事儿&#xff1a;功能类比加密存储用户密…

winscp 连openwrt 返回127错误码

winscp 连openwrt 24.10返回127错误码。找了许多原因也没搞清为啥&#xff08;客户端加密方式、winscp版本过低等都试过&#xff09;&#xff0c;用SecureFx试了一下&#xff0c;发现是openwrt 24.10固件没有安装Sftp服器&#xff0c;用下列命令安装即可。opkg install openssh…

Python编程基础与实践:Python文件处理入门

Python文件处理实战 学习目标 通过本课程的学习&#xff0c;学员将掌握如何在Python中打开、读取、写入和关闭文件&#xff0c;了解文本文件和二进制文件的区别&#xff0c;以及在文件处理中的一些最佳实践。 相关知识点 Python文件处理 学习内容 1 Python文件处理 1.1 文件的基…

Corrosion2靶机

打开靶机信息收集&#xff1a;kali里使用arp-scan -l或者netdiscover发现主机使用nmap扫描端口nmap -sS -sV -T4 -n -p- 192.168.31.20开启了22、80、8080端口 8080发现开启了tomcat服务扫出了他的ip以及他开放的端口&#xff0c;我们接下来拿浏览器访问一下两个页面都没有什么…

编程与数学 03-002 计算机网络 18_物联网与网络

编程与数学 03-002 计算机网络 18_物联网与网络一、物联网的基本概念&#xff08;一&#xff09;物联网的架构与层次&#xff08;二&#xff09;物联网的关键技术二、物联网网络的构建&#xff08;一&#xff09;物联网网络的通信协议&#xff08;二&#xff09;物联网网络的拓…

【Kubernetes】ConfigMap配置管理:存储配置参数,创建到容器挂载

在Kubernetes中&#xff0c;配置管理是应用部署的重要环节。ConfigMap作为存储非敏感配置数据的资源对象&#xff0c;能帮助我们实现"配置与代码分离"&#xff0c;让应用部署更灵活。一、什么是ConfigMap&#xff1f; ConfigMap是Kubernetes中用于存储非加密配置数据…

Promise和回调地狱

顺序执行 vs. 异步操作&#xff1a; 当我们说“顺序执行”&#xff0c;通常是指 操作按顺序发生。而 异步操作 指的是操作在后台执行&#xff0c;不会阻塞其他操作&#xff0c;通常会使用回调、Promise 或 async/await 来处理结果。 在 Promise 链式调用 的情况下&#xff0c;虽…

LeetCode 65:有效数字

LeetCode 65&#xff1a;有效数字问题本质与挑战 需判断字符串是否为有效数字&#xff0c;规则涉及整数、小数、指数&#xff08;e/E&#xff09;的复杂组合&#xff0c;如&#xff1a; 整数&#xff1a;123、-45、678小数&#xff1a;1.2、.3、4.、5.6指数&#xff1a;1e10、2…