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

news2024/10/7 11:31:34

参考论文

基于二进制文件的 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)

 

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

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

相关文章

mac版本Phpstudy本地环境安装Discuz教程【2024】

此方法适用于m1版本的mac版本Phpstudy本地环境安装Discuz&#xff0c;当然同样使用更高版本的mac端。网上各种安装教程参差不齐&#xff0c;根本解决不了小白的入门需求&#xff0c;以下是最新且直接明了的安装教程。 Phpstudy本地环境安装Discuz教程&#xff1a; 1、安装Phps…

1075: 求最小生成树(Prim算法)

解法&#xff1a; 总结起来&#xff0c;Prim算法的核心思想是从一个顶点开始&#xff0c;一步一步地选择与当前最小生成树相邻的且权值最小的边&#xff0c;直到覆盖所有的顶点&#xff0c;形成一个最小生成树。 #include<iostream> #include<vector> using names…

【管理篇 / 升级】❀ 14. FortiOS 7.4固件升级新规后的7.4.4版本的升级 ❀ FortiGate 防火墙

【简介】相信看过上一篇文章的都已经知道了&#xff0c;FortiOS 7.4版本的固件升级和降级都增加了条件&#xff0c;那就是需要设备在服务期内&#xff0c;但是小版本的升级是允许的&#xff0c;例如7.4.0升级到7.4.1、7.4.2&#xff0c;现在最新版本7.4.4来了。 获得FortiOS 7.…

【C++】牛客——OR64 求和

✨题目链接&#xff1a; OR64 求和 ✨题目描述 输入两个整数 n 和 m&#xff0c;从数列1&#xff0c;2&#xff0c;3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 ✨输入描述: 每个测试输入包含2个整数,n和m ✨输出描述: 按每个组合的字典序排列…

【系统架构师】-案例篇(十五)SOA、微服务与数据库

1、可复用构件应具备哪些属性 可用性&#xff1a;构件必须易于理解和使用。 质量&#xff1a;构件及其变形必须能正确工作。 适应性&#xff1a;构件应该易于通过参数化等方式在不同语境中进行配置。 可移植性&#xff1a;构件应能在不同的硬件运行平台和软件环境中工作。 可变…

数组-区间合并

一、题目描述 二、题目思路 这里提供满足基本要求的解题思路&#xff1a; 1.先对列表内按照start大小升序排序&#xff0c;这里创建Comparator接口的实现类&#xff0c;重写compare方法。 2.遍历intervals&#xff0c;设置laststart、lastend两个变量与当前区间相比较&#…

LVGL显示中文字体及其它语言文字详细笔记教程

在前面几篇博客文章中&#xff0c;已经对LVGL的移植和使用进行了较为详细的介绍&#xff0c;在本文中将讲解如何在LVGL的控件中显示中文字体及其它语言字体。 LVGL在VScode中安装模拟器运行配置笔记教程_vscode lvgl-CSDN博客 LVGL移植到STM32 MCU平台详细经验笔记教程-CSDN博…

Day36 代码随想录打卡|二叉树篇---翻转二叉树

题目&#xff08;leecode T226&#xff09;&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 方法&#xff1a; 迭代法 翻转二叉树&#xff0c;即从根节点开始&#xff0c;一一交换每个节点的左右孩子节点&#xff0c;然后…

【Linux】-Zookeeper安装部署[17]

简介 apache ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 除了为Hadoop和H…

程序员做推广?我劝你别干

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这是卢松松会员专区&#xff0c;一位会员朋友的咨询&#xff0c;如果你也有自研产品&#xff0c;但不知道如何推广&#xff0c;一定要阅读本文!强烈建议收藏关注&#xff0c;因为你关注的人&#xff0c;决定你看到的…

【spring】@ControllerAdvice注解学习

ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解&#xff0c;用于定义一个全局的异常处理类或者说是控制器增强类&#xff08;controller advice class&#xff09;。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为&#xff0c;比…

VeraCrypt设置步骤操作说明

一、VeraCrypt软件说明 VeraCrypt是一个开源的磁盘加密软件&#xff0c;是TrueCrypt的继承者和改进版。它提供了强大的数据加密功能&#xff0c;可以对整个磁盘、操作系统分区或移动存储设备进行加密。 二、VeraCrypt软件操作步骤 01&#xff09;首先在电脑中创建一个新的空…

【论文笔记】| 微调LLM晶体生成

【论文笔记】| 微调LLM晶体生成 Fine-Tuned Language Models Generate Stable Inorganic Materials as Text NYU, ICLR 2024 Theme&#xff1a;Material Generation Main work&#xff1a; 微调大型语言模型以生成稳定的材料 可靠性&#xff1a;在样本结构中&#xff0c;90% …

Python | Leetcode Python题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; class Solution:def isInterleave(self, s1: str, s2: str, s3: str) -> bool:n1 len(s1)n2 len(s2)if len(s3) ! n1 n2: return Falsedp [[False] * (n2 1) for _ in range(n1 1)] # dp[i][j]表示s1[0:i)和s2[0:j)是否能够构成s…

设计模式5——抽象工厂模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 抽象工厂模式&#xff08;Abst…

2024年贵州特岗教师招聘报名流程,速速查收哦!

2024年贵州特岗教师招聘报名流程&#xff0c;速速查收哦&#xff01;

DolphinDB 携手九鞅科技,助力固收投研效能飞跃

随着金融市场开放的广度与深度不断拓宽&#xff0c;金融产品呈现出多样化的发展态势&#xff0c;其中债券投资组合凭借其低风险性、高流动性与稳健的收益表现&#xff0c;逐渐成为投资理财领域备受瞩目的焦点。投资经理不仅需要了解哪些债券值得投资&#xff0c;更要对债券投资…

MySQL日常联系---20万数据的存储过程(一)。

一、创建DDL和DML CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATE NOT NULL,userName VARCHAR(255) NOT NULL,phone VARCHAR(15),age INT,sex CHAR(1), -- 假设M代表男&#xff0c;F代表女introduce TEXT );INSERT INTO student (createDate, user…

二叉树创建与销毁操作详解

目录 一、通过前序遍历的数组构建二叉树 1.1 递归思路 1.2 递归分支图 1.3 递归栈帧图 1.4 C语言实现 二、二叉树的销毁 2.1 递归思路 2.2 递归分支图 2.3 递归栈帧图 2.4 C语言实现 一、通过前序遍历的数组构建二叉树 牛客网链接&#xff1a;二叉树遍历_牛客题霸_牛…

2024年618购物狂欢节即将来袭!精选五款超值入手数码好物!

618购物狂欢盛宴即将落幕&#xff0c;是时候展现我们的购物智慧了&#xff01;在追求价格优惠的同时&#xff0c;我们更应看重商品的品质与实用性。面对琳琅满目的选择&#xff0c;如何筛选出真正值得拥有的好物呢&#xff1f;为了让大家的购物之旅更加轻松愉快&#xff0c;以下…