Linux获取so/ko文件版本号教程
一、需要获取版本号的原因
从使用角度而言,有时只有特定版本的库才支持某些功能,所以我们需要确定库文件版本号。
从安全加固角度而言,有些版本存在漏洞有些版本不存在漏洞,所以我们需要获取版本号以确定当前使用版本是否需要处理。
不过就实际来看,针对库文件(尤其是ko文件)来发布的漏洞是比较少的,另一方面so和ko文件并没有强制要求实现版本号所以他们并不一定有版本号。
二、手动获取版本号方法
2.1 so文件手动获取版本号方法
2.1.1 从文件名获取版本号
很多so文件都直接将so号写到文件名中,".so"前面或后面的数字串即是其版本号,如下所示

2.1.2 使用readelf读取SONAME获取主版本号
如果文件名中没有版本号,那么退而求其次,通过readelf读取so的SONAME字段获取其主版本号。

2.2 ko文件手动获取版本号方法
2.2.1 使用modinfo获取版本号
ko文件一般不会将版本号放在文件名中,也没有类似SONAME的字段。在少数的ko文件中会设置version变量可用modinfo读取,如果没有那ko文件也就没有版本号了。
modinfo后可直接接ko文件路径,但也可以是加载到内核的模块名,已加载到内核的模块名可以用lsmod查看。

三、自动化读取so/ko文件版本python脚本
所谓自动化不过也就是将手动获取版本号的方法代码化。脚本使用python3编写,设置好main中root_dir直接运行,结果会自动保存在so_version.txt和ko_version.txt中
import os
import re
import platform class ReadLibVersion:
def __init__(self):
so_version_file = "so_version.txt"
ko_version_file = "ko_version.txt"
self.so_version_file_obj = open(so_version_file,"w+")
self.ko_version_file_obj = open(ko_version_file,"w+")
system = platform.system()
if "Windows" in system:
self.path_split = "\\"
else:
self.path_split = "/"
self.so_file_pattern = "\.so$"
self.ko_file_pattern = "\.ko$" # 遍历要扫描的目录,寻找出目录下的所有so/ko文件
def traversal_dir(self,dir):
dir_contains = os.listdir(dir)
for tmp in dir_contains:
tmp_path = f"{dir}{self.path_split}{tmp}"
if os.path.isfile(tmp_path):
# 如果是so文件,则调用so版本号获取函数获取版本号
if re.search(self.so_file_pattern,tmp_path) is not None:
# 首先从文件名获取版本号
so_version = self.read_so_version_by_name(tmp_path)
if so_version != "-":
self.so_version_file_obj.writelines(f"{tmp_path}\t\t{so_version}\r\n")
else:
# 如果从文件名获取不到版本号,那么就通过readelf读SONAME获取主版本号
so_version = self.read_so_version_by_readelf(tmp_path)
self.so_version_file_obj.writelines(f"{tmp_path}\t\t{so_version}\r\n")
# 如果是ko文件,则通过modinfo读取version变量获取版本号
elif re.search(self.ko_file_pattern,tmp_path) is not None:
ko_version = self.read_ko_version_by_modinfo(tmp_path)
self.ko_version_file_obj.writelines(f"{tmp_path}\t\t{ko_version}\r\n")
elif os.path.isdir(tmp_path):
sub_dir = tmp_path
self.traversal_dir(sub_dir) # 从文件名获取so文件版本号
def read_so_version_by_name(self,file_path):
file = file_path.split(f"{self.path_split}")[-1]
ver_pattern = "[.|\d]+\d"
so_versions = re.findall(ver_pattern,file)
if len(so_versions) >0:
so_version = so_versions[0]
else:
so_version = "-"
return so_version
pass # 使用readelf读SONAME获取so文件主版本号
def read_so_version_by_readelf(self,file_path):
so_version = "-"
readelf_result = os.popen(f"readelf -d {file_path} |grep SONAME").read().strip()
if readelf_result != "":
so_version = readelf_result.split()[-1]
return so_version
pass # 使用modinfo读取version变量获取ko文件版本号
def read_ko_version_by_modinfo(self,file_path):
ko_version = "-"
modinfo_result = os.popen(f"modinfo {file_path}|grep ^version:").read().strip()
if modinfo_result != "":
ko_version = modinfo_result.split()[-1]
return ko_version
pass def __del__(self):
self.so_version_file_obj.close()
self.ko_version_file_obj.close()
pass if __name__ == "__main__":
# 要扫描的目录
root_dir = "/usr/lib"
read_lib_version_obj = ReadLibVersion()
read_lib_version_obj.traversal_dir(root_dir)
Linux获取so/ko文件版本号教程的更多相关文章
- Linux 驱动程序/内核模块/ko文件
Linux 驱动程序/内核模块/ko文件 一.内核模块加载机制 1.解析 Linux 内核可装载模块的版本检查机制 二.驱动/内核模块 编译 1.The Linux Kernel Module Pro ...
- [ARM-Linux开发] 嵌入式 linux如何生成ko文件
hello.c文件如下 驱动程序: #include <Linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件. #include <asm ...
- linux获取目录下文件
查看当前目录下的文件: find . -type f 查看当前目录下的文件夹: find . -type d 如果文件file1不为空: if [ -s file1 ];then echo ...
- Linux下编写和加载 .ko 文件(驱动模块文件)
一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...
- Linux系列教程(四)——Linux常用命令之文件和目录处理命令
这个系列教程的前面我们讲解了如何安装Linux系统,以及学习Linux系统的一些方法.那么从这篇博客开始,我们就正式进入Linux命令的学习.学习命令,首先要跟大家纠正的一点就是,我们不需要记住每一条 ...
- Linux中生成Core Dump系统异常信息记录文件的教程
Linux中生成Core Dump系统异常信息记录文件的教程 http://www.jb51.net/LINUXjishu/473351.html
- Linux下编写和加载 .ko 文件(编写linux驱动)
一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...
- Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit
以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 採用方法: 第一步.改动C文件 1 ...
- Linux+apache+mono+asp.net安装教程
Linux+apache+mono+asp.net安装教程(CentOS上测试的) 一.准备工作: 1.安装linux系统(CentOS,这个就不多讲了) 2.下载所需软件 http-2.4.4.ta ...
随机推荐
- Linux下安装jieba
Jieba代码对 Python 2/3 均兼容 * 全自动安装:`easy_install jieba` 或者 `pip install jieba` / `pip3 install jieba` * ...
- cocos2d-x Android(SDK,NDK,JDK,ANT)下载地址
搭建Android环境需要用到Android SDK.NDK.Ant和JDK: 下载Android SDK 下载Android NDk 下载Android JDK 下载Ant
- 025-缓存Cache
如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差.而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能.这样无论有多少人访问 ...
- mecacheq的配置
在处理业务逻辑时有可能遇到高并发问题,例如商城秒杀.微博评论等.如果不做任何措施可能在高瞬间造成服务器瘫痪,如何解决这个问题呢?队列是个不错的选择.队列(Queue)又称先进先出(First In F ...
- docker mysql 数据库乱码
创建 mysql 时,需要加上编码,不然会乱码: docker run --name mysql01 -p : -e MYSQL_ROOT_PASSWORD=pwd123 -d mysql:5.5 - ...
- Solr入门介绍
solr入门案例 solr是apache下的一个全文检索引擎系统. 我们需要在服务器上单独去部署solr, 通过它的客户端工具包solrJ, 就是一个 jar包, 集成到我们项目中来调用服务器中 ...
- React高级教程(es6)——(1)JSX语法深入理解
从根本上来说,JSX语法提供了一种创建React元素的语法糖,JSX语句可以编译成: React.createElement(component, props, …children)的形式,比如: & ...
- MySQL中SQL语句2
上一片介绍了一些基本的SQL的增删改查,这一片会介绍一些进阶的SQL语句使用. MySQL中的视图 视图是什么?当我们总是查询几张表的某个字段时,可以创建一张虚拟表,把这几个字段写入这个虚拟的表,这样 ...
- nginx-fastcgi 第九章
CGI全称通用网关接口 Commmon Gateway Interface 用于HTTP服务上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上. 传统CGI接口方式性能较差,由于每次HTT ...
- Java的类继承
知识点1.继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足is a的逻辑关系,才能使用继承.如:苹果 is a水果语法:使用extends 连接子类 ...