日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 提取ko文件,Linux获取so/ko文件版本号教程

發布時間:2024/9/30 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 提取ko文件,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中

importosimportreimportplatformclassReadLibVersion: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" insystem:

self.path_split= "\"

else:

self.path_split= "/"self.so_file_pattern= ".so$"self.ko_file_pattern= ".ko$"

#遍歷要掃描的目錄,尋找出目錄下的所有so/ko文件

deftraversal_dir(self,dir):

dir_contains=os.listdir(dir)for tmp indir_contains:

tmp_path= f"{dir}{self.path_split}{tmp}"

ifos.path.isfile(tmp_path):#如果是so文件,則調用so版本號獲取函數獲取版本號

if re.search(self.so_file_pattern,tmp_path) is notNone:#首先從文件名獲取版本號

so_version =self.read_so_version_by_name(tmp_path)if so_version != "-":

self.so_version_file_obj.writelines(f"{tmp_path}{so_version}")else:#如果從文件名獲取不到版本號,那么就通過readelf讀SONAME獲取主版本號

so_version =self.read_so_version_by_readelf(tmp_path)

self.so_version_file_obj.writelines(f"{tmp_path}{so_version}")#如果是ko文件,則通過modinfo讀取version變量獲取版本號

elif re.search(self.ko_file_pattern,tmp_path) is notNone:

ko_version=self.read_ko_version_by_modinfo(tmp_path)

self.ko_version_file_obj.writelines(f"{tmp_path}{ko_version}")elifos.path.isdir(tmp_path):

sub_dir=tmp_path

self.traversal_dir(sub_dir)#從文件名獲取so文件版本號

defread_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= "-"

returnso_versionpass

#使用readelf讀SONAME獲取so文件主版本號

defread_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]returnso_versionpass

#使用modinfo讀取version變量獲取ko文件版本號

defread_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]returnko_versionpass

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 提取ko文件,Linux获取so/ko文件版本号教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。