使用B2M 算法批量将可执行文件转为灰度图像

参考论文

基于二进制文件的 C 语言编译器特征提取及识别

本实验使用 B2M 算法将可执行文件转为灰度图像,可执行文件转为灰度图的流程如图 4-3 所示。将 可执行文件每 8 位读取为一个无符号的的整型常量,一个可执行文件得到一个一维向量, 之后按照固定的宽和高将一维向量转成一个二维向量。该二维向量中每个元素的取值范围都在 0-255 ,正好对应灰度图像的一个像素点,将该二维数组可视化为一张灰度图像, 其中 0 表示黑色, 255 表示白色。

这个使用B2M 算法将可执行文件转为灰度图像的步骤主要视为了进行之后提取 GLCM 特征和 LBP 特征。

其中,生成图像的宽度会因不同文件的大小有最优宽度

 示例:

我的exe文件大小事135kb所以宽度就设置成384了。

import numpy as np
import matplotlib.pyplot as plt

# 读取二进制文件
def read_binary_file(filename):
    with open(filename, 'rb') as f:
        data = f.read()
    return data

# 将数据转换为无符号整型数组
def binary_to_uint8_array(data):
    return np.frombuffer(data, dtype=np.uint8)

# 将一维数组转换为二维矩阵
def array_to_2d_matrix(array, width):
    # 计算高度
    height = int(np.ceil(len(array) / width))
    # 如果数组长度不是宽度的整数倍,填充数组
    padded_length = height * width
    padded_array = np.pad(array, (0, padded_length - len(array)), 'constant', constant_values=0)
    # 转换为二维矩阵
    matrix = padded_array.reshape((height, width))
    return matrix

# 保存灰度图像
def save_gray_image(matrix, save_path):
    plt.imshow(matrix, cmap='gray', vmin=0, vmax=255)
    plt.title("Gray Image")
    plt.axis('off')  # 隐藏坐标轴
    plt.savefig(save_path, bbox_inches='tight', pad_inches=0)
    plt.close()
    print(f"Image saved at {save_path}")

# 主函数
def binary_to_image(filename, save_path, width):
    data = read_binary_file(filename)
    uint8_array = binary_to_uint8_array(data)
    matrix = array_to_2d_matrix(uint8_array, width)
    save_gray_image(matrix, save_path)

# 调用主函数并传入二进制文件名、保存路径和宽度
binary_to_image('math1111.exe', 'test2.png', width=384)

生成的图像:

5.21

本来的程序是处理单张图片,现在需要处理比较多,所以把程序拓展到了处理整个文件夹中的exe文件,并把处理后的图片以原exe文件+ 特殊备注(看个人需求)放到同一文件夹。同时根据原来exe文件的大小设置图片的宽度。

 

import os
import numpy as np
import matplotlib.pyplot as plt

# 读取二进制文件
def read_binary_file(filename):
    with open(filename, 'rb') as f:
        data = f.read()
    return data

# 将数据转换为无符号整型数组
def binary_to_uint8_array(data):
    return np.frombuffer(data, dtype=np.uint8)

# 将一维数组转换为二维矩阵
def array_to_2d_matrix(array, width):
    # 计算高度
    height = int(np.ceil(len(array) / width))
    # 如果数组长度不是宽度的整数倍,填充数组
    padded_length = height * width
    padded_array = np.pad(array, (0, padded_length - len(array)), 'constant', constant_values=0)
    # 转换为二维矩阵
    matrix = padded_array.reshape((height, width))
    return matrix

# 保存灰度图像
def save_gray_image(matrix, save_path):
    plt.imshow(matrix, cmap='gray', vmin=0, vmax=255)
    plt.title("Gray Image")
    plt.axis('off')  # 隐藏坐标轴
    plt.savefig(save_path, bbox_inches='tight', pad_inches=0)
    plt.close()
    print(f"Image saved at {save_path}")

# 处理单个文件并保存图像
def binary_to_image(filename, save_path, width):
    data = read_binary_file(filename)
    uint8_array = binary_to_uint8_array(data)
    matrix = array_to_2d_matrix(uint8_array, width)
    save_gray_image(matrix, save_path)

# 根据文件大小确定图像宽度
def determine_width(file_size):
    if file_size < 10 * 1024:
        return 32
    elif file_size < 30 * 1024:
        return 64
    elif file_size < 60 * 1024:
        return 128
    elif file_size < 100 * 1024:
        return 256
    elif file_size < 200 * 1024:
        return 384
    elif file_size < 500 * 1024:
        return 512
    elif file_size < 1000 * 1024:
        return 768
    else:
        return 1024

# 处理文件夹中的所有文件
def process_folder(folder_path, save_dir):
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if os.path.isfile(file_path):  # 只处理文件,忽略子目录
            file_size = os.path.getsize(file_path)
            width = determine_width(file_size)
            base_name = os.path.splitext(os.path.basename(file_path))[0]
            new_name = f"{base_name}_10.3.0.png"
            save_path = os.path.join(save_dir, new_name)
            binary_to_image(file_path, save_path, width)

# 文件夹路径
folder_path = r'C:\Users\19427\Desktop\5.1.0'
save_directory = r'C:\Users\19427\Desktop\5.1.0\output_images'

# 调用函数处理文件夹
process_folder(folder_path, save_directory)

 

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

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

相关文章

2.go环境配置与开发工具选择

go 环境配置 下载安装包 官网(https://go.dev/dl/) 下载地址(国内)(https://golang.google.cn/dl/) 根据自己的操作系统选择下载即可 下载后安装 记住地址 比如&#xff1a; D:\work\devtool\go 配置系统环境变量 PATH 指向 go 的安装 bin 目录 比如&#xff1a; D:\work…

面向Prompt编程

Prompt 就像和一个人对话&#xff0c;你说一句&#xff0c;ta 回一句&#xff0c;你再说一句&#xff0c;ta 再回一句…… Prompt 就是你发给大模型的指令&#xff0c;比如「讲个笑话」、「用 Python 编个贪吃蛇游戏」、「给男/女朋友写封情书」等 貌似简单&#xff0c;但意义…

【OpenGL纹理】纹理贴图基础知识(01/4)

文章目录 一、说明二、贴图的初始化处理2.1 贴图中的几种纹理2.2 原始数据处理 - 贴图的规格化 三、纹理对象生成和绑定&#xff08;选中&#xff09;3.1 生成纹理矩阵3.2 glGenTextures 函数明细3.2 glBindTexture函数明细 四、glTexParameteri函数4.1 贴放放法参数确定4.2 放…

字符串的周期:每一期都有那么几位

【题目描述】 如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例 如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。 输入一个长度不超过80的字符串(不含空格),输出其最小周期。 输入第一行表示有T组数据,后续是T行字符串。输出的每组…

【Qt 学习笔记】Qt窗口 | 浮动窗口 | QDockWidget的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 浮动窗口 | QDockWidget的使用及说明 文章编号&#xff1a;Q…

Vue 3 组件基础与模板语法详解

title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: Vue3特性CompositionAPITeleportSuspenseVue3安装组件基础模板语法 Vue 3 简介 1. Vue 3 的新特性 Vue 3引入了许多新的特性&#xff0c;以提高框…

路由引入实验(华为)

思科设备参考&#xff1a;路由引入实验&#xff08;思科&#xff09; 技术简介 路由引入技术在网络通信中起着重要的作用&#xff0c;能够实现不同路由协议之间的路由传递&#xff0c;并在路由引入时部署路由控制&#xff0c;实现路径或策略的控制 实验目的 不同的路由协议之…

【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有的资料&#x…

yolov8seg 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

之前写过yolov8seg部署&#xff0c;但在实际项目中没有真正的用&#xff0c;最近在项目尝试使用yolov8seg&#xff0c;把之前的yolov8目标检测的优化给同步到yolov8seg中。 特别说明&#xff1a;如有侵权告知删除&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在git…

一套车间生产管理和调度执行MES系统源码,采用springboot + vue-element+uniapp+mysql技术开发,适合二次开发项目使用。

MES系统源码&#xff0c;车间生产管理系统源码&#xff0c;商业源码&#xff0c;适合上项目 MES系统是制造企业中用于管理和监控生产过程的关键系统&#xff0c;它的核心功能包括生产调度、数据管理、计划排产管理、库存管理、质量管理、设备管理、采购管理、成本管理、项目看板…

《异常检测——从经典算法到深度学习》28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

TypeScript(持续更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安装nodejs 2&#xff09;安装TypeScript编译器 npm i -g typescript 3.编译ts文件 //注意&#xff1a;需要在ts文件同级目录执行此命令&#xff0c;否则会报找不到…

Go语言(Golang)的开发框架

在Go语言&#xff08;Golang&#xff09;的开发中&#xff0c;有多种开发框架可供选择&#xff0c;它们各自具有不同的特点和优势。以下是一些流行的Go语言开发框架&#xff0c;选择Go语言的开发框架时&#xff0c;需要考虑项目需求、团队熟悉度、社区支持、框架性能和可维护性…

Java时间工具类(Date和LocalDateTime)

Date package com.qiangesoft.utils.date;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具类** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] C…

vue从入门到精通(四):MVVM模型

一,MVVM MVVM&#xff08;Model–view–viewmodel&#xff09;是一种软件架构模式。MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑&#xff08;数据模型&#xff09;的开发分离开来。详见MVVM 二,Vue中的MVVM Vue虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…

2024 电工杯高校数学建模竞赛(B题)| 平衡膳食食谱 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用负载均衡&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

【MySQL数据库】CRUD 增 删 改 查 超详解,有这一篇就够了!

​ ​ &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 目录 ⚗️一.CRUD &#x1f9ea;二.新增&#xff08;Create&#xff09; &#x1f9eb;1.基本操作 &#x1f9ec;2.使用SELECT插入 &#x…

169. Majority Element

文章目录 题目描述(简单难度)解法一解法二 位运算摩尔投票法参考文献 题目描述(简单难度) 给一个数组&#xff0c;存在一个数字超过了半数&#xff0c;找出这个数。 解法一 这种计数问题&#xff0c;直接就会想到 HashMap&#xff0c;遍历过程中统计每个数字出现的个数即可。…

Python入门全系列教程(更新中……)

最近辞职了&#xff0c;有点时间&#xff0c;打算写一套Python入门的全系列教程&#xff0c;需要的人欢迎关注蹲守&#xff01;&#xff01;&#xff01; 【Python基础篇】&#xff1a;入门基础知识—轻松踏上编程巅峰&#xff01;" 【Python基础篇】—基本语句详解 【Py…