一: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)来识别特定的二进制文件格式。

  具体的识别过程如下:

  1. 内核读取二进制文件的开头部分的字节序列,通常是文件的前几个字节。

  2. 内核将读取到的字节序列与已注册解释器的魔术数字进行比对。

  3. 如果找到与魔术数字匹配的解释器,则选择该解释器来处理该二进制文件。

  4. 如果没有找到匹配的解释器,内核将无法执行该二进制文件,并可能会返回错误。

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的更多相关文章

  1. Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置

    一.RAID的原理基础 在 讲解RAID的原理基础之前,我们首先来了解一下传统磁盘的劣势.我们知道一台PC机种都会包含CPU.内存.主板.硬盘.网卡等硬件,影响计算机性能的 组建包括:CPU.主板总线 ...

  2. Linux下数据恢复软件extundelete

    extundelete软件专门解决意外删除事件的,有时候不小心 rm -rf * 就可能毁掉有用的数据.因此就出现了这个恢复工具,但这个工具也不是万能的,删除数据后一定要停止所以的写操作.以免Inod ...

  3. linux du和df

    df.du和fdisk这三个常用命令:df用于检查文件系统磁盘占用情况,du检查磁盘空间占用情况,而fdisk用于磁盘分区. du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,d ...

  4. parted LVM划分4T磁盘,在线扩展1.5T

      磁盘分区: parted /dev/emcpowera (parted) print Model: Unknown (unknown) Disk /dev/emcpowera: 4398GB Se ...

  5. 分区表/etc/fstab格式

    $ more /etc/fstabUUID=94e4e384-0ace-437f-bc96-057dd64f42ee / ext4 defaults,barrier=0 1 1tmpfs        ...

  6. linux perf - 性能测试和优化工具

    Perf简介 Perf是Linux kernel自带的系统性能优化工具.虽然它的版本还只是0.0.2,Perf已经显现出它强大的实力,足以与目前Linux流行的OProfile相媲美了. Perf 的 ...

  7. GNU/Linux下LVM配置管理以及快照卷、物理卷、卷组、逻辑卷的创建和删除

    LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性.最大的优点是在不损伤数据的前提下调整存储空间的大小. 本篇主要讲述L ...

  8. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  9. Linux文件搜索命令

    文件搜索命令:locate locate 文件名 在后台数据库中按文件名搜索,搜索速度很快(比find命令要快得多) locate命令所搜索的后台数据库的位置:/var/bin/mlocate 支持模 ...

  10. /proc 【虚拟文件系统】

    在安装新硬件到 Linux 系统之前,你会想要知道当前系统的资源配置状况. Linux 将这类信息全集中在 /proc 文件系统下./proc 目录下的文件都是 Linux 内核虚拟出来的,当你读取它 ...

随机推荐

  1. DevOps 在未来将如何演进?丨行业观察

    自2007年 DevOps 这一概念推出以来,越来越多企业开始将开发和运维团队结合在一起,以加快部署速度,提高软件开发生命周期的效率和协作.但是,诸多因素都会对 DevOps 是否成功产生影响,例如组 ...

  2. Thread 线程中的 Synchronized block and lock

    Thread Definition of Synchronized Synchronized block in java are marked with the synchronized keywor ...

  3. CentOS8安装Oracle datebase 19C

        我这里安装Oracle数据库是rpm格式的包.需要先得有以下依赖包关系,先依次按此顺序安装. yum install ./compat-libcap1-1.10-7.el7.x86_64.rp ...

  4. python入门教程之二十四Python MySQL - mysql-connector 驱动

    MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读我们的 MySQL 教程. 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql ...

  5. 7.OAuth2

    1.近几天在学习OAuth2协议,实际开发中用的最多的就是授权码模式   2.OAuth2的授权码模式流程:首先是用户去访问资源服务器,服务器会给用户一个授权码:用户根据授权码去访问认证服务器,服务器 ...

  6. java.lang.OutOfMemoryError- unable to create new native thread 问题排查

    问题描述 最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错.且服务所在的物理机只能ping通,但是无法登录.报错信息如下: ERROR 04-12 03:01:43,930 [Default ...

  7. 极简组调度-CGroup如何限制cpu

    1. 说明 1> linux内核关于task调度这块是比较复杂的,流程也比较长,要从源码一一讲清楚很容易看晕,因此需要简化,抓住主要的一个点,抛开无关的部分才能讲清楚核心思想 2> 本篇文 ...

  8. XSS的攻击

    https://blog.csdn.net/m0_55854679/article/details/123028852

  9. 基于RL(Q-Learning)的迷宫寻路算法

    强化学习是一种机器学习方法,旨在通过智能体在与环境交互的过程中不断优化其行动策略来实现特定目标.与其他机器学习方法不同,强化学习涉及到智能体对环境的观测.选择行动并接收奖励或惩罚.因此,强化学习适用于 ...

  10. Java 新的生态型应用开发框架,Solon v2.2.13 发布

    Java 新的生态型应用开发框架,Solon :更快.更小.更简单.从零开始构建,有自己的标准规范与开放生态: 150多个生态插件,可以满足各种场景开发 大量的国产框架适配,可以为应用软件国产化提供更 ...