find_sys_call_table和kallsysms_lookup_name的区别
find_sys_call_table 和 kallsyms_lookup_name 都可以用于查找内核符号,但它们的具体作用和使用场景有所不同。以下是两者的详细对比:
1. find_sys_call_table
作用
find_sys_call_table 是一种通过遍历内核内存或者其他方式来手动查找系统调用表地址的技术。这种方法通常在某些情况下使用,比如系统没有启用 kallsyms_lookup_name 或者内核版本不支持直接符号查找。
使用场景
- 内核版本不支持
kallsyms_lookup_name:在某些老版本内核中,kallsyms_lookup_name可能不可用或者被禁用。 - 无符号信息的内核:某些内核可能没有编译符号信息,这时无法通过符号名直接查找地址。
- 调试和分析工具:在某些情况下,调试工具可能需要手动查找系统调用表。
实现方法
find_sys_call_table 通常通过扫描内存中的特定模式来找到系统调用表。以下是一个简化的示例,展示了如何通过遍历内存来找到 sys_call_table:
unsigned long **find_sys_call_table(void) {
unsigned long offset;
unsigned long **sct;
for (offset = PAGE_OFFSET; offset < ULLONG_MAX; offset += sizeof(void *)) {
sct = (unsigned long **)offset;
if (sct[__NR_close] == (unsigned long *) sys_close) {
return sct;
}
}
return NULL;
}
这个示例通过遍历从 PAGE_OFFSET 开始的内核内存地址空间,查找包含 sys_close 函数地址的位置,来确定系统调用表的位置。
2. kallsyms_lookup_name
作用
kallsyms_lookup_name 是内核提供的一个函数,用于通过符号名称查找其地址。这在调试和开发内核模块时非常方便,能够直接获取符号(如函数、变量等)的地址。
使用场景
- 内核开发和调试:在开发内核模块时,通过符号名称快速查找函数或变量的地址。
- 符号查找:需要查找特定符号的地址时,如
sys_call_table的地址。
使用方法
使用 kallsyms_lookup_name 需要确保内核配置启用了 CONFIG_KALLSYMS 和 CONFIG_KALLSYMS_ALL,并且函数是GPL导出的。以下是一个示例代码:
#include <linux/kallsyms.h>
#include <linux/module.h>
static int __init init_module_func(void) {
unsigned long address;
address = kallsyms_lookup_name("sys_call_table");
if (address) {
printk(KERN_INFO "sys_call_table address: %lx\n", address);
} else {
printk(KERN_ERR "sys_call_table not found\n");
}
return 0;
}
static void __exit cleanup_module_func(void) {
printk(KERN_INFO "Module exiting\n");
}
module_init(init_module_func);
module_exit(cleanup_module_func);
MODULE_LICENSE("GPL");
总结
- 查找方法:
find_sys_call_table通过遍历内存查找特定模式找到系统调用表,而kallsyms_lookup_name通过符号名称直接查找地址。 - 适用场景:
find_sys_call_table适用于符号信息不可用或者不支持kallsyms_lookup_name的情况,而kallsyms_lookup_name适用于开发和调试,需要通过符号名称快速查找地址的情况。 - 实现复杂度:
find_sys_call_table通常实现较复杂,需要了解内核内存布局和系统调用表特征;kallsyms_lookup_name使用方便,只需提供符号名称即可。
两者在使用场景和实现复杂度上有显著区别,应根据具体需求选择合适的方法。
find_sys_call_table和kallsysms_lookup_name的区别的更多相关文章
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- 探究@property申明对象属性时copy与strong的区别
一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...
- X86和X86_64和X64有什么区别?
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- MySQL中interactive_timeout和wait_timeout的区别
在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...
- 设置line-height:1.5和line-height:150%或者line-height:150px的区别
直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
随机推荐
- 很呆的一个问题:我的新项目又找不到mapper这个bean了
1.选springboot版本 <properties> <java.version>8</java.version> <project.build.sour ...
- 【Phoenix】4.14.1-Hbase-1.3版本 安装
Phoenix 版本 会附带Hbase版本,要根据安装的Hbase版本下载Phoenix 下载Phoenix wget http://archive.apache.org/dist/phoenix/a ...
- 【JavaWeb】接口请求404的问题排查
响应状态404:404 Page Not Found 根本原因: 服务器找不到这个地址描述的页面资源, 注意是页面资源 可能的出现的开发情况: 1.请求的资源可能真的不存在,是接口,也可以是页面 2. ...
- 【Mybatis-Plus】06 代码生成器 CodeGenerator
导入生成器需要的依赖坐标: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybat ...
- Django框架创建运行最小程序过程记录
基于 python语言 Django web框架下 用pycharm创建,修改,运行 最简单程序.旨在过程 ========================================== 步骤一 ...
- 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
教程简介 EasySQLite是一个七天.NET 8操作SQLite入门到实战详细教程(包含选型.开发.发布.部署)! 什么是SQLite? SQLite 是一个软件库,实现了自给自足的.无服务器的. ...
- 2024 年了,IT 运维监控系统都有哪些推荐?
大浪淘沙,2024 年的今天,市面上很多监控系统慢慢淡出了大家的视野,而一些新的监控系统也逐渐崭露头角.今天我们就来看看 2024 年的当下,哪些 IT 运维监控系统最值得关注. Prometheus ...
- 23暑假友谊赛No.2
23暑假友谊赛No.2 A-雨_23暑假友谊赛No.2 (nowcoder.com) #include <bits/stdc++.h> using namespace std; signe ...
- SMU Autumn 2023 Round 3(Div.1)
SMU Autumn 2023 Round 3(Div.1) A. Find The Array 要满足"b数组内任意一个元素满足可以被数组两边的元素整除"这个条件,我们很容易想到 ...
- C语言实现url解析小实例
一.前言 前面一口君写了一篇关于url的文章: <一文带你理解URI 和 URL 有什么区别?> 本篇在此基础上,编写一个简单的用于解析url的小例子, 最终目标是解析出URL中所有的数据 ...