find_sys_call_tablekallsyms_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_KALLSYMSCONFIG_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的区别的更多相关文章

  1. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  2. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  3. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  4. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  5. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  6. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  7. MySQL中interactive_timeout和wait_timeout的区别

    在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...

  8. 设置line-height:1.5和line-height:150%或者line-height:150px的区别

    直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...

  9. C#中Length和Count的区别(个人观点)

    这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...

  10. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

随机推荐

  1. hbuilderx生成ios证书和上架全教程

    现在很多公司都使用uniapp作为底层框架来开发app应用,而uniapp的开发工具hbuilderx云打包的时候,需要证书和证书profile文件. 假如是ios应用,则还需要上架到appstore ...

  2. python __del__() 清空对象

    python __del__() 清空对象 python垃圾回收机制:当一个对象的引用被完全清空之后,就会调用__del__()方法来清空这个对象 当对象的引用没有被完全清空时,代码如下: class ...

  3. 从C++看C#托管内存与非托管内存

    进程的内存 一个exe文件,在没有运行时,其磁盘存储空间格式为函数代码段+全局变量段.加载为内存后,其进程内存模式增加为函数代码段+全局变量段+函数调用栈+堆区.我们重点讨论堆区. 进程内存 函数代码 ...

  4. PixiJS源码分析系列:第四章 响应 Pointer 交互事件(上篇)

    响应 Pointer 交互事件(上篇) 上一章我们分析了 sprite 在 canvasRenderer 上的渲染,那么接下来得看看交互上最重要的事件系统了 最简单的 demo 还是用一个最简单的 d ...

  5. 位段 -- 内存布局详解C语言

    目录 位段的介绍 位段使用示例: 位段的内存分配 Example 内存分配解析: ## 位段 位段的介绍 位段(二进制位):就是按位存储 位段(bit-field)是C语言中的一种特殊数据类型,它允许 ...

  6. 斯坦福AI团队被质疑抄袭国产大模型

    原文地址: https://mbd.baidu.com/newspage/data/landingsuper?context={"nid"%3A"news_8882699 ...

  7. devtools工具遇到的坑

    下载devtools一定要下载5.1.1版本,其他版本要么就是下载依赖不行,要么就是打包不行,不清楚的同学会下载最新版,最新版的不能用,切记 地址放这里了: https://github.com/vu ...

  8. 计算购物车价格Vue

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. springboot如何集成Prometheus如何暴露Histogram来获取P99等监控指标

    背景 springboot如何集成Prometheus我这里不做详细描述,要想了解集成过程,可以参考一下博客: Spring Boot 使用 Micrometer 集成 Prometheus 监控 J ...

  10. 我当年如何入门Linux的?-zdc的那些往事

    一.通信当年的疯狂 还记得09年初, 山寨机横行, 市场上手机主要还是塞班os, 小灵通还没有退出市场, 基于安卓的智能手机陆续推出. 没有王者荣耀,更没有微信, 小米的米聊还在ppt里: 那个时候网 ...