网上搜索了一下, 发现此代码主要原理是通过搜索 int 0x80的中断服务程序中的sys_call_table来实现.

在linux中所有的syscall都是调用int 0x80, int 0x80的中断服务程序为system_call(arch/x86/kernel/traps_32.c:set_system_gate(SYSCALL_VECTOR,&system_call).  system_call (arch/x86/entry_32.S)最终call *sys_call_table(,%eax,4)来完成一个syscall调用.

即 int 0x80 -> system_call -> sys_call_table, 这样我们只要首先获取int 0x80的中断服务地址system_call地址, 然后在system_call代码中直接搜索call指令即可找到sys_call_table地址了!

另一种方法就是直接修改

通过cat /boot/System.map-`uname -r` |grep sys_call_table  查看当前sys_call_table地址,并与通过以上方法取得的地址做比较!

内核版本: ubuntu 2.6.24-19-server

/*
 * Standard in kernel modules
 */
#include <linux/kernel.h>   /* We're doing kernel work */
#include <linux/module.h>   /* Specifically, a module, */
#include <linux/moduleparam.h>  /* which will have params */
#include <linux/unistd.h>   /* The list of system calls */

/*
 * For the current (process) structure, we need
 * this to know who the current user is.
 */
#include <linux/sched.h>
#include <asm/uaccess.h>

unsigned long *sys_call_table = 0;
//EXPORT_SYMBOL ( sys_call_table );
struct {
    unsigned short  limit;
    unsigned int    base;
} __attribute__ ( ( packed ) ) idtr;
struct {
    unsigned short  offset_low;
    unsigned short  segment_select;
    unsigned char   reserved,   flags;
    unsigned short  offset_high;
} __attribute__ ( ( packed ) ) * idt;

unsigned long* find_sys_call_table(void)
{
    unsigned long system_call = 0;          // x80中断处理程序system_call 地址
    char *call_hex = "/xff/x14/x85";    // call 指令
    char *code_ptr = NULL;
    char *p = NULL;
    unsigned long sct = 0x0;
    int i = 0;

// 获取中断描述符表寄存器的地址
    __asm__ ( "sidt %0": "=m" ( idtr ) );
    // 获取0x80中断处理程序的地址
    idt = ( void * ) ( idtr.base + 8 * 0x80 );
    system_call = ( idt->offset_high << 16 ) | idt->offset_low;

// 搜索system_call代码
    code_ptr = (char *)system_call;
    for(i = 0;i < ( 100 - 2 ); i++) {
        查找call指令
        if(code_ptr[i] == call_hex[0]
            && code_ptr[i+1] == call_hex[1]
            && code_ptr[i+2] == call_hex[2] ) {
            //
            p = &code_ptr[i] + 3;
            break;
        }
    }
    if ( p ){
        sct = *(unsigned long*)p;
    }
    return (unsigned long*)sct;
}

int init_module ( void ) {

if ( ( sys_call_table = find_sys_call_table() ) )   {
        printk( "sys_call_table = %p/n", sys_call_table );
    }
    return 0;
}

void cleanup_module ( void ) {
}

Makefile文件:

obj-m = get_sct.o
KVERSION = $(shell uname -r)
all:
            make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
            make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

获取Linux 2.6.x sys_call_table相关推荐

  1. vc++6.0获取磁盘基本信息_分享一个实用脚本--一键获取linux内存、cpu、磁盘IO等信息...

    概述 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. 脚本 #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`ifconfig | grep i ...

  2. 用Python获取Linux资源信息的三种方法

    方法一:psutil模块 #!usr/bin/env python # -*- coding: utf-8 -*-import socket import psutil class NodeResou ...

  3. python相关linux_Python实现获取Linux系统基本信息

    Python实现获取Linux系统基本信息,获取信息如下: 主机名 系统版本 系统内核版本 总内存 CPU生厂商 CPU总核心数 服务器生厂商 服务器序列号 各网卡IP,MAC和网卡名信息 实现代码如 ...

  4. linux 获取模块,get_module - 获取Linux内核模块的详细信息

    补充说明 get_module命令 用于获取Linux内核模块的详细信息. 语法 get_module 模块名 实例 使用lsmod命令查看内核模块: lsmod | head -5 Module S ...

  5. java获取服务器信息返回前端,java程序获取linux服务器进程信息

    搜索了很多关于获取Linux的信息,但是没有发现获取linux服务器的进程信息详细说明. 在这里求解一下,能否在java代码中实现读取代码执行的本机linux服务器中的进程信息? 该问题又分为三个小问 ...

  6. android 获取网卡mac_Java获取Linux安卓设备的mac地址方法

    Java如何获取Linux或安卓Android设备的mac地址呢?方法非常简单,只需要使用下方代码即可轻松通过java获取mac地址了,代码如下:public String getMacAddress ...

  7. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取

    Android系统信息获取 之十三:Linux内核版本信息获取 Android系统是基于Linux的,各个Android版本对应的Linux版本不尽相同,我们这里不去追究各个Android对应的Lin ...

  8. linux qt 音频文件怎么打开,Qt:获取Linux中可用音频设备的列表

    我想要获取我的Linux系统上可用的所有音频设备的列表.然后我会将这个列表显示在一个组合框中,用户将从中选择用于录制/播放的设备.根据用户的选择,我将构建QAudioInput和QAudioOutpu ...

  9. 使用 Python 获取 Linux 系统信息的代码

    From: http://www.jb51.net/article/52107.htm 在本文中,我们将会探索使用Python编程语言工具来检索Linux系统各种信息,需要的朋友可以参考下 哪个Pyt ...

  10. 使用Python获取Linux系统的各种信息

    From: http://www.jb51.net/article/52058.htm 这篇文章主要介绍了使用Python获取Linux系统的各种信息,例如系统类型.CPU信息.内存信息.块设备等,需 ...

最新文章

  1. Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装
  2. spring配置文件路径修改后web.xml配置
  3. python 签名计算 请求参数签名
  4. 超详细 kafka 入门(最佳实践)
  5. Oracle新手笔记(2) 关于Oracle 9i或9i以上版本客户端连接Oracle 8i及8i版本以下服务器端中文字符乱码的解决办法...
  6. 再生希尔伯特空间_向量、函数向量、再生核希尔伯特空间、核技巧
  7. 装饰器3--装饰器作用原理
  8. 【Python3】POP3协议收邮件
  9. pythonfor循环加2_初中生教你编程---python(for循环)part 2
  10. mybatis-generator 根据表生成对应文件
  11. 今天闲来无事,做了个简易的ORM 感觉有点像ActiveRecord作业风格,又有点像iBatis...
  12. iview vue 打包图标不显示_使用vue-cli生成的项目引用iview组件库,字体图标不显示...
  13. 数字化时代:电梯广告的喜与忧
  14. dlib实现人脸识别方法
  15. 操作系统中怎么预防死锁呢?简单列举几种方法!
  16. 【知识点】UDS刷写的一般流程介绍
  17. jquery 做一个小的倒计时效果
  18. qinghua大乱斗C
  19. 新安装的windows2003找不到网上邻居
  20. 手机钢琴软件测试自学,手机钢琴app哪个好_自学钢琴软件哪个好_安卓钢琴软件哪个好...

热门文章

  1. git学习笔记-(12-git后悔药-1)
  2. 怎么解Linux内核温控,Linux Thermal 框架解析
  3. java证明角谷猜想_Java 代码界 3% 的王者?看我是如何解错这 5 道题的
  4. python3file函数_Python3 File(文件) 方法
  5. python自控_怎么自学python,大概要多久?
  6. java怎么控制页面打印次数_java – 控制打印页面上面板的大小
  7. python快速排序时间复杂度-快速排序python实现总结
  8. arduino 中断 串口_【Arduino教程】第一讲:Arduino是什么?
  9. 面试总结——Java篇
  10. 操作文件的类 File demo3 小练习