binfmt_misc
一:binfmt_misc是什么
binfmt_misc是内核中的一个功能,它能将非本机的二进制文件与特定的解析器自动匹配起来,进行二进制解析。
例如,在x86上解析arm64架构的二进制。
通过binfmt_misc可以注册解析器来处理指定二进制文件格式的请求。这些解析器可以是本地可执行文件,也可以是跨平台(ARM、MIPS)可执行文件。
二:怎么使用binfmt_misc
2.1.注册解析器
注册解析器的目的是为了让Linux在执行特定格式的二进制时,能够识别并自动选择相应的解析器来处理。
1.挂载
首先需要挂载 binfmt_misc,并使用`mount`命令将`binfmt_misc`文件挂载到/proc/sys/fs/binfmt_misc/。
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
2.创建解析器配置文件
在 /proc/sys/fs/binfmt_misc/ 目录下,可以创建一个配置文件,命名为 register,其中 register是要注册的二进制文件格式的标识符。
3.注册
在解释器配置文件中,可以使用 echo 命令将相应的配置信息写入。这些配置信息指定了二进制文件格式的特征、解释器的路径以及其他相关参数。例如,对于 Windows 可执行文件的解释器配置,可以指定其魔术数字、解释器的路径等。
使用`echo`命令向`/proc/sys/fs/binfmt_misc/ `目录中的特定文件写入配置信息,以注册特定的二进制文件格式和解释器。
注册格式::name:type:offset:magic:mask:interpreter:flags
#/usr/bin/qemu-arm64为解析器程序的路径
#magic为\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
#mask为\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm64-static:' > register
以下是这些字段的含义:
name:是一个标识符字符串。指定解析器的名称或标识。在这个例子中,解析器的名称为"arm";
type:是识别类型。给予M魔法和E扩展。
offset:是文件中 magic/mask 的偏移量,以字节计算。默认为 0:name:type::magic...。使用文件扩展名匹配时忽略。
magic:是 binfmt_misc 匹配的字节序列。魔术字符串可能包含十六进制编码的字符,
mask:是一个(可选,默认为所有 0xff)掩码。
interpreter:是应该使用二进制文件作为第一个参数调用的程序(指定完整路径)
flags:这些标志控制解析器的行为和操作方式。下面是一些常见的 flags 标志及其作用:- O:覆盖(Override)标志。当多个解析器的匹配规则冲突时,使用具有此标志的解析器进行匹配和执行。
- E:可执行文件标志。指定解析器用于执行可执行文件的功能。
- F:开启自动刷新标志。当启用此标志时,每次访问 register 文件时都会重新加载解析器配置。
- C:关闭自动刷新标志。当关闭此标志时,解析器配置只在系统启动时加载一次,之后不会自动刷新。
- B:启用解析器的特权执行。这将允许使用具有特权的解析器执行文件。
- M:启用魔数验证标志。指定解析器在匹配时必须验证魔数。
- 注意事项:offset+size(magic) 必须小于 128,解释器字符串不得超过 127 个字符
2.2.解析器是如何自动匹配
在Linux中,内核通过魔术数字(Magic Nmuber)来识别特定的二进制文件格式。
具体的识别过程如下:
内核读取二进制文件的开头部分的字节序列,通常是文件的前几个字节。
内核将读取到的字节序列与已注册解释器的魔术数字进行比对。
如果找到与魔术数字匹配的解释器,则选择该解释器来处理该二进制文件。
如果没有找到匹配的解释器,内核将无法执行该二进制文件,并可能会返回错误。
2.3.怎么获取二进制的魔法数字
在 Linux 终端中,可以使用 hexdump -C <binary_file>或xxd <binary_file>等命令行工具来查看二进制文件的内容。这些工具会显示文件的十六进制表示,并可以帮助你找到文件开头部分的魔数。
案例如下:

2.4.子网掩码的作用
除了magic还有一个mask这个怎么理解?
mask的作用是屏蔽或过滤魔数中的某些位,将魔数与掩码进行与运算,如果不想匹配魔数某些位,则再mask中将对应位设置为0即可。
掩码的主要目的是允许对魔数进行更灵活的匹配。有时候,二进制文件的魔数中的某些位是可变的或不重要的,但其他位则必须匹配。通过定义一个掩码来屏蔽那些不重要的位,可以提高匹配的灵活性。
2.5.魔数和掩码的与运算
与运算规则如下:
- 如果魔数和掩码的对应位都为1,结果位为1。
- 如果魔数和掩码的对应位有一个为0,结果位为0。
如果你想要通过按位与运算得到0表示不匹配,可以将掩码中需要匹配的位设置为1,不需要匹配的位设置为0。这样,在按位与运算时,如果魔数的对应位与掩码的对应位都为1,结果位为1,否则为0。如果按位与运算的结果为0,表示魔数与掩码不匹配。
示例1:最终的按位与运算结果与原始的魔数值相同,即没有发生变化。

示例2:最终的按位与运算结果后6位全部为0,则后6位不进行比较

2.6.与运算结果与注册表中魔数对比
1.取注册表魔数
使用 cat 命令读取 /proc/sys/fs/binfmt_misc/ 目录下的相关文件。每个注册表都以文件的形式存在该目录中,文件名代表了对应的架构。例如,/proc/sys/fs/binfmt_misc/arm_64,表示 ARM 架构的注册表。

2.对比
案例1:如下图,因为与运算结果与注册表魔数相同,则可以调用到对应注册表中interpreter对应的解析器文件。

案例2:如下图,与运算结果的非0位与注册表魔数结果相同, 则可以调用到对应注册表中interpreter对应的解析器文件。

binfmt_misc的更多相关文章
- Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置
一.RAID的原理基础 在 讲解RAID的原理基础之前,我们首先来了解一下传统磁盘的劣势.我们知道一台PC机种都会包含CPU.内存.主板.硬盘.网卡等硬件,影响计算机性能的 组建包括:CPU.主板总线 ...
- Linux下数据恢复软件extundelete
extundelete软件专门解决意外删除事件的,有时候不小心 rm -rf * 就可能毁掉有用的数据.因此就出现了这个恢复工具,但这个工具也不是万能的,删除数据后一定要停止所以的写操作.以免Inod ...
- linux du和df
df.du和fdisk这三个常用命令:df用于检查文件系统磁盘占用情况,du检查磁盘空间占用情况,而fdisk用于磁盘分区. du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,d ...
- parted LVM划分4T磁盘,在线扩展1.5T
磁盘分区: parted /dev/emcpowera (parted) print Model: Unknown (unknown) Disk /dev/emcpowera: 4398GB Se ...
- 分区表/etc/fstab格式
$ more /etc/fstabUUID=94e4e384-0ace-437f-bc96-057dd64f42ee / ext4 defaults,barrier=0 1 1tmpfs ...
- linux perf - 性能测试和优化工具
Perf简介 Perf是Linux kernel自带的系统性能优化工具.虽然它的版本还只是0.0.2,Perf已经显现出它强大的实力,足以与目前Linux流行的OProfile相媲美了. Perf 的 ...
- GNU/Linux下LVM配置管理以及快照卷、物理卷、卷组、逻辑卷的创建和删除
LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性.最大的优点是在不损伤数据的前提下调整存储空间的大小. 本篇主要讲述L ...
- Linux /dev目录详解和Linux系统各个目录的作用
Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...
- Linux文件搜索命令
文件搜索命令:locate locate 文件名 在后台数据库中按文件名搜索,搜索速度很快(比find命令要快得多) locate命令所搜索的后台数据库的位置:/var/bin/mlocate 支持模 ...
- /proc 【虚拟文件系统】
在安装新硬件到 Linux 系统之前,你会想要知道当前系统的资源配置状况. Linux 将这类信息全集中在 /proc 文件系统下./proc 目录下的文件都是 Linux 内核虚拟出来的,当你读取它 ...
随机推荐
- 一文详解扩散模型:DDPM
作者:京东零售 刘岩 扩散模型讲解 前沿 人工智能生成内容(AI Generated Content,AIGC)近年来成为了非常前沿的一个研究方向,生成模型目前有四个流派,分别是生成对抗网络(Gene ...
- rocketmq-spring : 实战与源码解析一网打尽
RocketMQ 是大家耳熟能详的消息队列,开源项目 rocketmq-spring 可以帮助开发者在 Spring Boot 项目中快速整合 RocketMQ. 这篇文章会介绍 Spring Boo ...
- Let's Encrypt 泛域名证书申请
泛域名 泛域名证书又名通配符证书是SSL证书中的其中一种形式,一般会以通配符的形式(如:*.domain.com)来指定证书所要保护的域名. OV证书和DV证书都会有通配符的域名形式提供,而EV证书一 ...
- Docker容器中使用GPU
背景 容器封装了应用程序的依赖项,以提供可重复和可靠的应用程序和服务执行,而无需整个虚拟机的开销.如果您曾经花了一天的时间为一个科学或 深度学习 应用程序提供一个包含大量软件包的服务器,或者已经花费数 ...
- flask-sqlalchemy入门
Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展.它致力于简化在 Flask 中 SQLAlchemy 的使用.SQLAlchemy 是目前pytho ...
- RDIFramework.NET Web版报表管理-助力企业高效智能图表
功能描述 在RDIFramework.NET Web版本中全新的报表管理功能模块,非常实用的功能,重量级推荐.主要用于对日常常用的报表做定制展示.可以自动发布到模块(就可授权给指定资源访问),在报表定 ...
- AspNetCore 成长杂记(一):JWT授权鉴权之生成JWT(其一)
引子 最近不知怎么的,自从学了WebAPI(为什么是这个,而不是MVC,还不是因为MVC的Razor语法比较难学,生态不如现有的Vue等框架,webapi很好的结合了前端生态)以后,使用别人的组件一帆 ...
- PostgreSQL插件那么多,怎样管理最高效?
摘要:华为云RDS for PostgreSQL通过插件管理功能,很好地解决了PostgreSQL版本与插件耦合的问题,帮助用户更直观.更快速地安装管理数据库插件. 本文分享自华为云社区<Pos ...
- 深入理解python虚拟机:调试器实现原理与源码分析
深入理解python虚拟机:调试器实现原理与源码分析 调试器是一个编程语言非常重要的部分,调试器是一种用于诊断和修复代码错误(或称为 bug)的工具,它允许开发者在程序执行时逐步查看和分析代码的状态和 ...
- ts中报错信息收集
1. 错误代码 参考:https://www.mmbyte.com/article/92849.html 1 state.localuserInfo = JSON.parse(localStorage ...