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多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
随机推荐
- 解决 IIS Express 启动错误:“拒绝访问”问题
报错 Starting IIS Express ... stderr: Failed to register URL "http://localhost:8378/" for si ...
- pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass RuntimeError: FIND was unable to find an engine to execute this computatio
GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07 File "/home/devil/anaconda3/envs/sample- ...
- Jax框架在不同版本间的随机数生成并不一致 —— jax.random
官方: https://jax.readthedocs.io/en/latest/api_compatibility.html#numerics-and-randomness 具体的解释就是在不同的J ...
- 【转载】 在PyTorch训练一个epoch时,模型不能接着训练,Dataloader卡死——在pytorch中尽量不要使用opencv而是使用PIL
版权声明:本文为CSDN博主「时光碎了天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/u013289254/ ...
- ubuntu20.04/22.04 系统环境下源码编译Python3.10
2022年10月3日更新 在Ubuntu22.04系统上源码编译python,所依赖环境的安装命令为: sudo apt install gcc g++ libffi-dev build-essent ...
- HTB-Permx靶机笔记
Permx靶机笔记 概述 permx靶机是HTB的简单靶机,这台靶机整体考验渗透人员的信息搜集能力,可以收只有信息搜集的快速,才能快速拿到它的flag. 整体是比较简单的靶机 靶机连接:https:/ ...
- VIM正则替换行尾
https://nfcwar.lofter.com/post/1d1ee5d7_670890a 替换/删除某个字符后面的所有内容::%s/b.*/c/g 删除b后面所有的字符,以c替换.用g表示全 ...
- armbian指令大全
修复缺失内容 使用以下命令修复安装时缺失的内容: sudo apt --fix-broken install 使用 aptitude 安装软件 aptitude 是 Debian 及其衍生系统中功能强 ...
- Swahili-text:华中大推出非洲语言场景文本检测和识别数据集 | ICDAR 2024
论文提出了一个专门针对斯瓦希里语自然场景文本检测和识别的数据集,这在当前研究中是一个未充分开发的语言领域.数据集包括976张带标注的场景图像,可用于文本检测,以及8284张裁剪后的图像用于识别. 来源 ...
- 使用了 sudo 却依然显示权限不够的原因
$ sudo echo "151.101.76.133 raw.githubusercontent.com" >> /etc/hosts bash: /etc/host ...