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

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

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 = f.read(sec_header_size)
note_len = hex(read_number(sec_header[32:40]))
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(sections[-1])

data_start = ((elf_header_len + sec_header_num * sec_header_size + int(note_len,16)) + 4095) // 4096

base = int('0xfffffc0000000000', 16)
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)
            return addr - base + data_start

    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))

while True:
    import sys
    import re
    import os
    sys.stdin.flush()
    msg = input("输入:").strip()
    try:
        path, type = msg.split(':')
        offsets = []
        bound = path.find('(')
        while bound != -1:
            offsets.append(int(path[:bound].strip()))
            path = path[bound+1: path.rfind(')')]
            bound = path.find('(')
        offsets.reverse()
        start_addr = path.strip()

        if start_addr.startswith('0x'):
            start_addr = int(start_addr, 16)
        elif re.search(r'[a-z,A-Z]+', start_addr) is None:
            start_addr = int(start_addr)
        else: # is var
            ret = os.popen("cat /proc/kallsyms | grep \"" + start_addr + "\" | awk '{print $1,$3}'").read().strip()
            if ret == '':
                print("no symbol " + start_addr + " found, please load module first")
                continue
            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"find {len(ret)} candidates: ")
                    for it in ret:
                        print(f"  {it[1]}")
                    continue
        start_offset = addr_to_offset(start_addr)
        for off in offsets:
            start_addr = read_offset_value(start_offset, 'u64')
            start_offset = addr_to_offset(start_addr) + off
        print(read_offset_value(start_offset, type))
    except Exception as e:
        print(e)

使用效果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一练:奇怪的TTL字段(python实现图片操作实战)

打开图片&#xff0c;只有四种数字&#xff1a;127&#xff0c;191&#xff0c;63&#xff0c;255 最大数字为255&#xff0c;想到进制转换 将其均转换为二进制&#xff1a; 发现只有前2位不一样 想着把每个数的前俩位提取出来&#xff0c;组成新的二进制&#xff0c;然后每…

c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

AI绘画Midijourney操作技巧及变现渠道喂饭式教程!

前言 盘点Midijourney&#xff08;AIGF&#xff09;热门赚米方法&#xff0c;总有一种适合你之AI绘画操作技巧及变现渠道剖析 【表情包制作】 首先我们对表情包制作进行详细的讲解&#xff1a; 当使用 Midjourney&#xff08;AIGF&#xff09; 绘画来制作表情包时&#xff…

ensp防火墙综合实验作业+实验报告

实验目的要求及拓扑图&#xff1a; 我的拓扑&#xff1a; 更改防火墙和交换机&#xff1a; [USG6000V1-GigabitEthernet0/0/0]ip address 192.168.110.5 24 [USG6000V1-GigabitEthernet0/0/0]service-manage all permit [Huawei]vlan batch 10 20 [Huawei]int g0/0/2 [Huawei-…

218.贪心算法:分发糖果(力扣)

核心思想 初始化每个学生的糖果数为1&#xff1a; 确保每个学生至少有一颗糖果。从左到右遍历&#xff1a; 如果当前学生的评分高于前一个学生&#xff0c;则当前学生的糖果数应比前一个学生多一颗。从右到左遍历&#xff1a; 如果当前学生的评分高于后一个学生&#xff0c;则…

排序【选择排序和快速排序】

1.选择排序 1.1基本思想 每次选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在数组的起始位置&#xff0c;直到所有元素都排完。 1.2直接插入排序&#xff1a; 在数组arr[i]到arr[n-1]中选出最大&#xff08;小&#xff09;的元素。若该元素不是数组的…

前端的页面代码

根据老师教的前端页面的知识&#xff0c;加上我也是借鉴了老师上课所说的代码&#xff0c;马马虎虎的写出了页面。如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

小型 FPGA 瞄准 4K 视频接口,MiSTer FPGA 现已支持 Sinden 光枪-FPGA新闻速览

无需矩阵乘法&#xff0c;在 FPGA 上实现低功耗、高性能的 LLM UC Santa Cruz, Soochow University, UC Davis 和 LuxiTech 发表了一篇题为“可扩展的无 MatMul 语言建模”的新技术论文。 “矩阵乘法 (MatMul) 通常占据大型语言模型 (LLM) 总体计算量的主导地位。随着 LLM 扩展…

PLC物联网关在工业自动化领域的应用的意义-天拓四方

随着信息技术的飞速发展&#xff0c;物联网技术正逐步渗透到各个行业领域&#xff0c;其中&#xff0c;工业自动化领域的PLC与物联网的结合&#xff0c;为工业自动化的发展开辟了新的道路。PLC物联网关作为连接PLC与物联网的重要桥梁&#xff0c;其重要性日益凸显。 PLC物联网…

单例模式Singleton

设计模式 23种设计模式 Singleton 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 饿汉式 public class BankTest {public static void main(…

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展&#xff0c;尤其是以生成式AI为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构&#xff0c;提高数据处理效率&#xff0c;降低开发运维成本&#xff0c;促进…

Selenium使用注意事项:

find_element 和 find_elements 的区别 WebDriver和WebElement的区别 问题&#xff1a; 会遇到报错&#xff1a; selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector",&…

STM32智能空气质量监测系统教程

目录 引言环境准备智能空气质量监测系统基础代码实现&#xff1a;实现智能空气质量监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;空气质量监测与优化问题解决方案与优化收尾与总结 1. 引言 智能空…

UCSD和MIT的华人学者最新成果展示:沉浸式远程遥操作机器人

你是否曾想过&#xff0c;自己身处某地&#xff0c;可以控制几千公里以外的「机器人」本体&#xff1f;这个想法&#xff0c;最近被来自UCSD和MIT的华人学者们实现了。UCSD位于加利福尼亚州&#xff0c;MIT位于马萨诸塞州&#xff0c;这两地之差&#xff0c;约3000英里&#xf…

线性回归(梯度下降)

首先说案例&#xff1a; 房子的价格和所占面积有着很大的关系&#xff0c;假如现在有一些关于房子面积和价格的数据&#xff0c;我要如何根据已经有的数据来判断未知的数据呢&#xff1f; 假如x(房屋面积)&#xff0c;y(房屋价格) x[ 56 72 69 88 102 86 76 79 94 74] y[92, …

MySQL 锁分类

MySQL 锁分类 在 MySQL 中&#xff0c;为了保证并发性能和数据安全&#xff0c;有多种锁机制。我们常见的有表级锁和行级锁。让我们一起来学习 MySQL 中各种锁的知识。 表级锁 表级锁是对整张表进行锁定。 表数据锁 1. 读锁 允许多个会话同时读取同一张表的数据&#xff…

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…

HyperSD - 会画草图就能玩AI绘画,AI一键手绘,实时同步 本地一键整合包下载

字节跳动的Lightning团队发布的新图像模型蒸馏算法Hyper-SD&#xff0c;是一项在图像处理和机器学习领域的重要进展。这项技术通过创新的方法提升了模型在不同推理步骤下的性能&#xff0c;同时保持了模型大小的精简。 基于这个算法模型&#xff0c;一个很实用的功能出现了&am…

知识图谱入门笔记

自学参考&#xff1a; 视频&#xff1a;斯坦福CS520 | 知识图谱 最全知识图谱综述 详解知识图谱的构建全流程 知识图谱构建&#xff08;概念&#xff0c;工具&#xff0c;实例调研&#xff09; 一、基本概念 知识图谱&#xff08;Knowledge graph&#xff09;&#xff1a;由结…

本地部署,MODNet 背景去除大模型

目录 摘要 引言 MODNet 架构 关键组件 技术原理 本地部署 运行结果 结论 GitHub - ZHKKKe/MODNet: A Trimap-Free Portrait Matting Solution in Real Time [AAAI 2022]A Trimap-Free Portrait Matting Solution in Real Time [AAAI 2022] - ZHKKKe/MODNethttps://gith…