当前位置: 首页 > news >正文

Linux 内核获取函数size

方式一:通过objdump -t直接从目标文件中获取函数size

#objdump -t file_unread.o | grep hook
0000000000000030 l     F .text  000000000000012f hook_vfs_read

0000000000000030 l F .text 000000000000012f hook_vfs_read各个字段说明

  • 0000000000000030:符号的地址或值,这里是一个相对地址,表示该符号在.text节中的偏移量。
  • l:符号的绑定属性,这里是小写字母l,表示该符号是一个局部符号,只在当前目标文件中可见。
  • F:符号所在的节(section)的类型,这里是大写字母F,表示该符号所在的节是一个函数节(function section)。
  • .text:符号所在的节的名称,这里是.text,表示该符号所在的节是代码节。
  • 000000000000012f:符号的大小,以字节为单位,这里是0x12f,表示该函数的大小为303字节。
  • hook_vfs_read:符号的名称,这里是hook_vfs_read,表示该符号是一个名为hook_vfs_read的函数。

vfs_read+0xe6/0x2c0 表示什么意思呢?

其中vfs_read 是函数名,+0xe6/0x2c0 是函数在代码中的偏移量。具体来说,+0xe6 表示函数内部代码的偏移量,/ 后面的 0x2c0 表示函数的总大小(以字节为单位)。

hook_vfs_read+0xe4/0x130 [fi_file]为动态打印进程调用栈信息。

方式二:通过objdump -D反汇编后计算函数size

objdump对目标文件进行反汇编,从汇编代码中计算hook_vfs_read的函数size

0000000000000030 <hook_vfs_read>:30:   e8 00 00 00 00          callq  35 <hook_vfs_read+0x5>35:   41 57                   push   %r1537:   41 56                   push   %r1439:   31 c0                   xor    %eax,%eax......14f:   eb c3                   jmp    114 <hook_vfs_read+0xe4>151:   48 c7 c7 00 00 00 00    mov    $0x0,%rdi158:   e8 00 00 00 00          callq  15d <hook_vfs_read+0x12d>15d:   eb a3                   jmp    102 <hook_vfs_read+0xd2>15f:   90                      nop

hook_vfs_read_size = 0x15f - 0x30 = 0x12f + 1,从计算的结果来看,加上偏移与调用栈打印的函数size是一致的。

-t, --syms               Display the contents of the symbol table(s)
-D, --disassemble-all    Display assembler contents of all sections

方式三:通过内核函数动态获取函数size

/*** sprint_symbol - Look up a kernel symbol and return it in a text buffer* @buffer: buffer to be stored* @address: address to lookup** This function looks up a kernel symbol with @address and stores its name,* offset, size and module name to @buffer if possible. If no symbol was found,* just saves its @address as is.** This function returns the number of bytes stored in @buffer.*/
int sprint_symbol(char *buffer, unsigned long address)
{return __sprint_symbol(buffer, address, 0, 1);
}
EXPORT_SYMBOL_GPL(sprint_symbol);

路径1:

获取到的字符串信息示例为hook_vfs_read+0x0/0x130 [fi_file],这种方式需要从数组str中解析出函数大小0x130

解析字符串中的函数size,还是要骚操作获取,在内核中没有看到直接获取函数size的函数。

#include <linux/string.h>static int __init my_init(void)
{const char *str = "hook_vfs_read+0x0/0x130 [fi_file]";const char *prefix = "/0x";const char *suffix = " [";char *start, *end;unsigned long value;// 查找前缀字符串start = strstr(str, prefix);if (!start) {printk(KERN_ERR "Failed to find prefix string\n");return -EINVAL;}start += strlen(prefix);// 查找后缀字符串end = strstr(start, suffix);if (!end) {printk(KERN_ERR "Failed to find suffix string\n");return -EINVAL;}// 截取字符串*end = '\0';value = simple_strtoul(start, NULL, 16);printk(KERN_INFO "Value: 0x%lx\n", value);return 0;
}

路径二:

内核代码v4.18.20sprint_symbol最终调用kallsyms_lookup获取函数size,因此也可以直接调用该函数获取函数size,免去上述复杂的字符串解析过程。

/** Lookup an address* - modname is set to NULL if it's in the kernel.* - We guarantee that the returned name is valid until we reschedule even if.*   It resides in a module.* - We also guarantee that modname will be valid until rescheduled.*/
const char *kallsyms_lookup(unsigned long addr,unsigned long *symbolsize,unsigned long *offset,char **modname, char *namebuf)
{const char *ret;namebuf[KSYM_NAME_LEN - 1] = 0;namebuf[0] = 0;if (is_ksym_addr(addr)) {unsigned long pos;pos = get_symbol_pos(addr, symbolsize, offset);/* Grab name */kallsyms_expand_symbol(get_symbol_offset(pos),namebuf, KSYM_NAME_LEN);if (modname)*modname = NULL;return namebuf;}/* See if it's in a module or a BPF JITed image. */ret = module_address_lookup(addr, symbolsize, offset,modname, namebuf);if (!ret)ret = bpf_address_lookup(addr, symbolsize,offset, modname, namebuf);if (!ret)ret = ftrace_mod_address_lookup(addr, symbolsize,offset, modname, namebuf);return ret;
}

相关文章:

Linux 内核获取函数size

方式一&#xff1a;通过objdump -t直接从目标文件中获取函数size #objdump -t file_unread.o | grep hook 0000000000000030 l F .text 000000000000012f hook_vfs_read0000000000000030 l F .text 000000000000012f hook_vfs_read各个字段说明 0000000000000030&#x…...

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系多标签实体和实体去重数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集,OpenKG(Open Knowledge Graph),可供研究人员使用研究。 数据整理导入 impor…...

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…...

【Python】约瑟夫环问题

任务描述 据说著名历史学家 Josephus有过以下的故事&#xff1a;Josephus及他的朋友共41人围成一个圆圈&#xff0c;由第1个人开始报数&#xff0c;每数到3该人就必须出去&#xff0c;然后再由下一个人重新报数&#xff0c;直到圆圈上少于3人为止。Josephus 将朋友与自己安排在…...

Python成功解决AttributeError: ‘Series‘ object has no attribute ‘set_value‘

Python成功解决AttributeError: ‘Series‘ object has no attribute ‘set_value‘ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…...

基于springboot+vue的医院药品管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

Python爬虫——Urllib库-1

这几天都在为了蓝桥杯做准备&#xff0c;一直在刷算法题&#xff0c;确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来&#xff0c;那么Python的爬虫就这样开始学习了。 注&#xff1a;文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…...

瑞_Redis_短信登录(一)

文章目录 项目介绍1 项目准备1.1 导入SQL1.2 导入后端项目1.2 导入前端项目 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的项目准备小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识&#xff0c;所以本系列专栏主要是针对该…...

《剑指 Offer》专项突破版 - 面试题 70 : 排序数组中只出现一次的数字(C++ 实现)

题目链接&#xff1a;LCR 070. 有序数组中的单一元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在一个排序的数组中&#xff0c;除一个数字只出现一次之外&#xff0c;其他数字都出现了两次&#xff0c;请找出这个唯一只出现一次的数字。例如&#xff0c;在…...

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…...

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…...

【服务器数据恢复】昆腾存储中raid5磁盘阵列数据恢复案例

服务器数据恢复环境&故障&#xff1a; 10个磁盘柜&#xff0c;每个磁盘柜配24块硬盘。9个磁盘柜用于存储数据&#xff0c;1个磁盘柜用于存储元数据。 元数据存储中24块硬盘&#xff0c;组建了9组RAID1阵列1组RAID10阵列&#xff0c;4个全局热备硬盘。 数据存储中&#xff0…...

企业微信变更主体怎么改?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…...

常用生理眼电信号整理合集 (EOG)

目录 Sleep-EDF Sleep-EDF expanded Sleep-EDF 这些信号是从白人男性和女性&#xff08;21-35 岁&#xff09;中获得的&#xff0c;没有任何药物治疗&#xff1b;它们包含水平 EOG、FpzCz 和 PzOz EEG&#xff0c;每个采样频率为 100 Hz。 sc* 记录还包含颏下肌电图包络、口鼻…...

【场景题】让你设计一个订单号生成服务,该怎么做?

方案 当设计订单号生成服务时&#xff0c;我们需要考虑唯一性、数据量、可读性、基因法、可扩展性、高性能和高可用性等多个方面。根据这些考虑&#xff0c;一个简单的订单号生成服务设计方案可以采取以下措施&#xff1a; 使用Snowflake算法或第三方分布式ID生成器&#xff…...

使用GraphView实现简单的绘图工具

ShapeItem代码&#xff1a; ShapeItem::ShapeItem(ShapeType type) {m_type type;m_lt QPointF(0, 0);m_rb QPointF(0, 0);m_deleteEnable false;m_bll BllData::getInstance();connect(m_bll, &BllData::deleteShapeEnableSignal, this, &ShapeItem::deleteShap…...

javaWebssh教师荣誉库管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…...

Android minigbm框架普法

Android minigbm框架普法 引言 假设存在这么一个场景&#xff0c;我的GPU的上层实现走的不是标准的Mesa接口&#xff0c;且GPU也没有提专门配套的gralloc和hwcompoer实现。那么我们的Android要怎么使用到EGL和GLES库呢&#xff0c;并且此GPU驱动是支持drm实现的&#xff0c;也有…...

01、MongoDB -- 下载、安装、配置文件等配置 及 副本集配置

目录 MongoDB -- 下载、安装、配置 及 副本集配置启动命令启动 mongodb 的服务器&#xff08;单机和副本集&#xff09;启动单机模式的 mongodb 服务器启动副本集的 3 个副本节点&#xff08;mongodb 服务器&#xff09; 启动 mongodb 的客户端 MongoDB 下载MongoDB 安装1、解压…...

uniapp中导入css和scss的区别

在项目中编写了一个基础的公共样式 common.scss文件 想要将其 导入到app.vue文件中 第一次使用的是import url(static/common.scss); 编译直接报错&#xff0c;无法识别这个文件 原因是 使用import url()是CSS中用于导入外部样式表的语法&#xff0c;但它不适用于导入SCS…...

Tonzhon音乐:纯净无干扰的现代音乐播放平台终极指南

Tonzhon音乐&#xff1a;纯净无干扰的现代音乐播放平台终极指南 【免费下载链接】tonzhon-music 铜钟 Tonzhon (tonzhon.whamon.com): 干净纯粹的音乐平台 (铜钟已不再使用 tonzhon.com&#xff0c;现在的 tonzhon.com 不是正版的铜钟) 项目地址: https://gitcode.com/GitHub…...

跨国分布式团队协作实录:时区差不是最大障碍,信任才是

一、跨越时区&#xff1a;测试协作的“隐形战场”在全球化软件交付的浪潮中&#xff0c;跨国分布式测试团队早已成为行业标配。当上海的测试工程师迎着朝阳开始一天的工作时&#xff0c;旧金山的同事正披着夜色结束任务&#xff1b;当柏林团队在梳理测试用例&#xff0c;班加罗…...

CANN/PyPTO hypot函数API文档

pypto.hypot 【免费下载链接】pypto PyPTO&#xff08;发音: pai p-t-o&#xff09;&#xff1a;Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/At…...

认知通量(CT):用语义带宽、时序保真度与概念熵减重构AI训练评估

1. 项目概述&#xff1a;这不是又一个“大模型参数秀”&#xff0c;而是一次对AI认知边界的重新测绘“From 1T Tokens to Total Cognition: The Numbers Behind the New AI Brain…”——这个标题里没有一个生僻词&#xff0c;但组合在一起&#xff0c;却像一把钥匙&#xff0c…...

Unity节点化效率工具:ComfyUI范式赋能中大型项目开发

1. 这不是又一个“UI美化插件”&#xff0c;而是Unity开发者每天要敲十次的底层效率杠杆Efficiency Nodes ComfyUI——光看名字&#xff0c;很多人第一反应是“ComfyUI&#xff1f;那不是Stable Diffusion的可视化工作流工具吗&#xff1f;怎么跑Unity里来了&#xff1f;”这恰…...

基于i.MX8M Plus与5G的高性能AI边缘计算网关设计与实践

1. 项目概述&#xff1a;为什么我们需要一个“会思考”的边缘网关&#xff1f;在工业现场待久了&#xff0c;你一定会对几个场景深有感触&#xff1a;产线上几十台PLC和传感器&#xff0c;协议五花八门&#xff0c;Modbus、Profibus、CANopen&#xff0c;想统一采集数据得接一堆…...

如何快速掌握基因引物设计:Primer3-py 的完整入门指南

如何快速掌握基因引物设计&#xff1a;Primer3-py 的完整入门指南 【免费下载链接】primer3-py Simple oligo analysis and primer design 项目地址: https://gitcode.com/gh_mirrors/pr/primer3-py 在分子生物学研究中&#xff0c;高效准确的引物设计是实验成功的关键。…...

3D格式转换神器:如何用stltostp轻松实现STL到STEP的无缝转换

3D格式转换神器&#xff1a;如何用stltostp轻松实现STL到STEP的无缝转换 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否曾经遇到这样的困境&#xff1f;精心设计的3D打印模型在STL格式下…...

猫抓Cat-Catch终极指南:从浏览器资源嗅探到流媒体下载的完整解决方案

猫抓Cat-Catch终极指南&#xff1a;从浏览器资源嗅探到流媒体下载的完整解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓Cat-Catch是一…...

以 AIGC 贯通设计 — 生产 — 营销:集之互动推动服装电商供应链进入全域协同新阶段

在快时尚主导、高频上新成为标配、流量窗口以周甚至以天计算的今天&#xff0c;服装电商的核心竞争力早已从单一的产品力、营销力&#xff0c;转向全链路供应链效率的竞争。当前行业普遍面临的痛点不再是某一环节的短板&#xff0c;而是全链路割裂&#xff1a;设计端与市场需求…...