一、需要获取版本号的原因
从使用角度而言,有时只有特定版本的库才支持某些功能,所以我们需要确定库文件版本号。
从安全加固角度而言,有些版本存在漏洞有些版本不存在漏洞,所以我们需要获取版本号以确定当前使用版本是否需要处理。
不过就实际来看,针对库文件(尤其是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内核驱动将多个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 目录结构及文件基本操作
Linux 目录结构及文件基本操作 实验介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux ...
随机推荐
-
php 数组 添加元素、删除元素
拆分数组 PHP数组添加一个元素的方式: push(), arr[], Php代码 $arr = array(); array_push($arr, el1, el2 ... eln); 但其实有一种 ...
-
值不能为 null 或为空。参数名: linkText
“/”应用程序中的服务器错误. 值不能为 null 或为空.参数名: linkText 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的 ...
-
java基础-排序
冒泡排序 选择排序 生成数组,数组元素值为1-1000
-
Android手机出现";已安装了存在签名冲突的同名数据包";的原因及解决办法
http://blog.csdn.net/dyllove98/article/details/8830264 如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步 ...
-
Java语言基础(五) Java原始数据类型的分类以及数据范围
Java原始数据类型的分类以及数据范围 1.基本数据类型分为:整型(byte, short, int, long),浮点型(float, double),字符型(char),布尔型(boolean) ...
-
分布式监控系统Zabbix3.2对数据库的连接数预警
在前篇分布式监控系统Zabbix3.2监控数据库的连接数 中已经对数据库的端口3306进行了监控,可以看到数据库的连接数历史变化有高有低,那如果达到了数据库连接数的阀值是不是主动通知给运维人员去检查问 ...
-
关于swing的一些问题
-问题1 :Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 & ...
-
软件测试-chapter2-homework2
程序一 1.the fault:for循环中i>0应改为i>=0 for (int i=x.length-1; i >= 0; i--) 2. (Reachability可达性,是f ...
-
react暴露webpack配置文件
在react中安装create-react-app脚手架新建项目,但是新建的项目中没有配置文件. webpack的配置文件webpack.base.conf.js隐藏在了node_modules文件夹 ...
-
高性能JavaScript(加载和执行)
当浏览器遇到 <script> 标签时,它是没办法知道 JavaScript 是否会向DOM中添加内容或引入其他元素,甚至关闭某一个标签.因此这个时候浏览器就会停止处理页面,先执行Java ...