快速读出linux 内核中全局变量

news2024/9/24 17:17:55

查问题时发现全局变量能读出来会提高效率,于是考虑从怎么读出内核态的全局变量,脚本如下

f = open("/proc/kcore", 'rb')
f.seek(4) # skip magic
assert f.read(1) == b'\x02' # 64 位

def read_number(bytes):
    return int.from_bytes(bytes, 'little', signed=False)

elf_header_len = 64
f.seek(elf_header_len - 10)
sec_header_size = read_number(f.read(2))
sec_header_num = read_number(f.read(2))

f.seek(elf_header_len + sec_header_size) # ignore note section
sections = []
for i in range(1, sec_header_num):
    sec_header = f.read(sec_header_size)
    sections.append({
        'offset': hex(read_number(sec_header[8:16])),
        'vaddr': hex(read_number(sec_header[16:24])),
        'size': hex(read_number(sec_header[32:40])),
    })
    print(f"section {i}: " + str(sections[-1]))

def addr_to_offset(addr):
    for sec in sections:
        vaddr = int(sec['vaddr'], 16)
        size = int(sec['size'], 16)
        if addr >= vaddr and addr < vaddr + size:
            return int(sec['offset'], 16) + (addr - vaddr)
    raise Exception("ilegel_addr: " + hex(addr))


def read_offset_value(offset, type):
    support_types = ['u8', 'u16', 'u32', 'u64', 's8', 's16', 's32', 's64', 'string','x8','x16','x32','x64']
    if type not in support_types:
        raise Exception("type should be in " + str())
    f.seek(offset)

    if type == 'string':
        ret = b''
        ch = f.read(1)
        while ch != b'\x00':
            ret += ch
            ch = f.read(1)
        return ret
    elif type.startswith('s'):
        return int.from_bytes(f.read(int(type[1:]) // 8), 'little', signed=True)
    elif type.startswith('u'):
        return int.from_bytes(f.read(int(type[1:]) // 8), 'little', signed=False)
    else: # 'x'
        return hex(int.from_bytes(f.read(int(type[1:]) // 8), 'little', signed=False))


def split_to_three_part(path):
    path = path.strip()
    prefixes = []
    suffixes = []
    prefix_bound = path.find('(')
    suffix_bound = path.rfind(')')
    while prefix_bound != -1:
        prefix = eval(path[:prefix_bound])
        prefixes.append(prefix)
        if suffix_bound == -1:
            raise Exception(f"unmatch backet for {path}")
        suffix = path[suffix_bound+1:]
        suffix = eval(suffix) if suffix else 0
        suffixes.append(suffix)
        path = path[prefix_bound+1:suffix_bound].strip()
        prefix_bound = path.find('(')
        suffix_bound = path.rfind(')')
    plus_start = path.find('+')
    if plus_start == -1:
        plus_start = len(path)
    minus_start = path.find('-')
    if minus_start == -1:
        minus_start = len(path)
    middle = path[:min(plus_start, minus_start)].strip()
    middle_part2 = path[len(middle):]
    middle_part2 = eval(middle_part2) if middle_part2 else 0
    prefixes.reverse()
    suffixes.reverse()
    return prefixes, middle, middle_part2, suffixes
        

while True:
    import sys
    import re
    import os
    sys.stdin.flush()
    msg = input("输入:").strip()
    try:
        path, type = msg.split(':')
        prefixes, middle, middle_part2, suffixes = split_to_three_part(path)

        if middle.startswith('0x') or re.search(r'[a-z,A-Z]+', middle) is None:
            start_addr = eval(middle)
        else: # is variable name
            ret = os.popen("cat /proc/kallsyms | grep \"" + middle + "\" | awk '{print $1,$3}'").read().strip()
            if ret == '':
                raise Exception("no symbol " + middle + " found, please load module first")
            ret = [i.split(' ') for i in ret.split('\n')]
            if len(ret) == 1:
                start_addr = int(ret[0][0], 16)
            else:
                find_exact = False
                for it in ret:
                    if it[1] == start_addr:
                        start_addr = int(it[0], 16)
                        find_exact = True
                        break
                if not find_exact:
                    print(f"maybe you means:")
                    for it in ret:
                        print(f"  {it[1]}")
                    print(f"find {len(ret)} candidates.")
                    continue

        start_offset = addr_to_offset(start_addr + middle_part2)
        for pre, suf in zip(prefixes, suffixes):
            start_addr = read_offset_value(start_offset, 'u64')
            start_offset = pre + addr_to_offset(start_addr) + suf
        print(read_offset_value(start_offset, type))
    except Exception as e:
        print(e)


输入的格式与 kprobe 的格式类似:+/-偏移(地址)+/-偏移:输出类型
输出类型有:‘u8’, ‘u16’, ‘u32’, ‘u64’, ‘s8’, ‘s16’, ‘s32’, ‘s64’, ‘string’,‘x8’,‘x16’,‘x32’,‘x64’
使用效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1924391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度解读李彦宏的“不要卷模型,要卷应用”

深度解读李彦宏的“不要卷模型&#xff0c;要卷应用” —— AI技术的应用之道 引言 在2024世界人工智能大会的舞台上&#xff0c;李彦宏的“不要卷模型&#xff0c;要卷应用”言论犹如一石激起千层浪&#xff0c;引发了业界对AI技术发展路径的深思。本文将深入探讨这一观点&a…

修改vscode的字体为等宽字符

在文件——首选项——设置 中 搜索 Editor: Font Family 将内容改为下面的 Consolas, Courier New, monospace 之后重启Vscode就行了

vs2017/2019串口Qt Serial Port/modbus使用报错

vs2017/2019 Qt Serial Port/modbus配置 /* * 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QModbusTcpClient::QModbusTcpClient(class QObject *)" (__imp_??…

【代码随想录】【算法训练营】【第66天】 [卡码95]城市间货物运输II [卡码96]城市间货物运输III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 66&#xff0c;周五&#xff0c;ding ding~ [卡码95] 城市间货物运输II 题目描述 卡码95 城市间货物运输II 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 …

智慧养殖的智慧网络:构建高效、可扩展的养殖生态

智慧养殖&#xff0c;在国家政策的大力扶持和农业数字化浪潮的推动下&#xff0c;正迅速发展。然而&#xff0c;许多人对它的价值仍持怀疑态度&#xff1a;认为智慧养殖只是昂贵的技术堆砌&#xff0c;短期内看不到经济回报&#xff0c;甚至怀疑其实用性。本文将挑战这些观点&a…

百川工作手机监控企业员工微信行为

在数字化转型的浪潮中&#xff0c;企业沟通方式正经历着前所未有的变革。微信&#xff0c;作为日常交流不可或缺的工具&#xff0c;已成为企业内外协作的重要桥梁。然而&#xff0c;随着业务量的激增&#xff0c;如何有效监控与管理员工在微信上的行为&#xff0c;确保信息安全…

LLM推理优化笔记1:KV cache、Grouped-query attention等

KV cache 对于decoder-only 模型比如现在如火如荼的大模型&#xff0c;其在生成内容的过程中&#xff0c;为了避免冗余计算&#xff0c;会将Transformer里的self-attention的K和V矩阵给缓存起来&#xff0c;这个过程即为KV cache。 decoder-only模型的生成过程是自回归的&…

让人工智能为你的旋律填词,开启音乐新章

在音乐的世界里&#xff0c;旋律如同灵动的精灵&#xff0c;飞舞在我们的心间。但有时&#xff0c;为这美妙的旋律找到最贴切、最动人的歌词&#xff0c;却成为了创作者们的难题。如今&#xff0c;随着科技的进步&#xff0c;人工智能正逐渐成为我们在音乐创作道路上的得力助手…

【香橙派 Orange pi AIpro】| 开发板深入使用体验

目录 一. &#x1f981; 写在前面二. &#x1f981; 愉快的安装流程2.1 安装前准备2.2 流程准备2.2.1 烧录镜像2.2.2 开机2.2.3 连网2.2.4 SSH远程连接开发板 2.3 体验 AI 应用样例 三. &#x1f981; 写在最后 一. &#x1f981; 写在前面 大家好&#xff0c;我是狮子呀&…

Windows下vscode配置C++环境

一、vscode下载及安装 vscode官网 选安装位置。 勾选这几项。 1.vscode界面中文配置 &#xff08;1&#xff09;点击扩展小图标&#xff0c;搜索插件&#xff0c;找到插件Chinese (Simplified) (简体中文) Language Pack&#xff0c;点击install。 &#xff08;2&#xf…

3dmax-vray5大常用材质设置方法

3dmax云渲染平台——渲染100 以高性价比著称&#xff0c;是预算有限的小伙伴首选。 15分钟0.2,60分钟内0.8;注册填邀请码【7788】可领30元礼包和免费渲染券 提供了多种机器配置选择(可以自行匹配环境)最高256G大内存机器&#xff0c;满足不同用户需求。 木纹材质 肌理调整&…

红酒的艺术之旅:品味、鉴赏与生活的整合

在繁忙的都市生活中&#xff0c;红酒如同一道不同的风景线&#xff0c;将品味、鉴赏与日常生活巧妙地整合在一起。它不仅仅是一种饮品&#xff0c;更是一种艺术&#xff0c;一种生活的态度。今天&#xff0c;就让我们一起踏上这趟红酒的艺术之旅&#xff0c;探寻雷盛红酒如何以…

json-server服务使用教程

目录标题 安装 json-server启动 json-server 本地服务 安装 json-server npm install -g json-server0.17.4json-server -v报错请参考&#xff1a;执行json-server -v报错 因为在此系统上禁止运行脚本。 启动 json-server 本地服务 查看本机IP&#xff1a;ipconfig Shift右…

【简历】安徽某二本学院:Java简历指导,简历通过率接近为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份二本独立院校的Java简历&#xff0c;那么一般来说&#xff0c;我们的独立院校包括专升本&#xff0c;在目前的it的投递中&#x…

NI VST 毫米波测试仪器创新

目录 概览​从UHF至V频段的频率覆盖范围&#xff1a;54 GHz远程测量模块​PXIe-5842&#xff1a;VST架构的扩展54 GHz扩频PXIe-5842功能​​宽频覆盖范围​IF和毫米波测试端口可满足多频带需求​高达2 GHz瞬时带宽误差矢量幅度测量性能相位相干同步基于PXI平台集成多种仪器 互补…

在centos7.9下静默安装Oracle19c详细流程

文章目录 下载安装包1.下载Oracle19c的安装包2.下载Oracle19c的预安装包3.拖到Linux中 一、安装依赖二、创建用户和组三、修改Linux相关内核参数四、修改用户限制五、关闭防火墙和SELinux六、创建安装目录并解压安装包七、设置环境变量八、安装Oracle数据库九、创建实例十、配置…

智慧校园毕业管理:全面解读毕业批次功能

在智慧校园的毕业管理系统中&#xff0c;毕业批次模块通过其精心设计的毕业批次功能&#xff0c;为即将离校的学子们提供了一个高效、便捷的过渡平台。这一特色功能聚焦于特定时间段内的毕业生群体&#xff0c;巧妙融合数字技术&#xff0c;从信息核实到最终的离校程序&#xf…

Leetcode3200. 三角形的最大高度

Every day a Leetcode 题目来源&#xff1a;3200. 三角形的最大高度 解法1&#xff1a;模拟 枚举第一行是红色还是蓝色&#xff0c;再按题意模拟即可。 代码&#xff1a; /** lc appleetcode.cn id3200 langcpp** [3200] 三角形的最大高度*/// lc codestart class Solutio…

5.1 软件工程基础知识-软件工程概述

软件工程诞生原因 软件工程基本原理&#xff08;容易被考到&#xff09; 软件生存周期 能力成熟度模型 - CMM 能力成熟度模型 - CMMI 真题

Neo4j:图数据库的革命性力量

Neo4j 首席技术官 prathle 撰写了一篇出色的博文&#xff0c;总结最近围绕 GraphRAG 的热议、我们从一年来帮助用户使用知识图谱 LLM 构建系统中学到的东西&#xff0c;以及我们认为该领域的发展方向。Neo4j一时间又大火起来&#xff0c;本文将带你快速入门这神奇的数据库。 前…