IA32架构下截获系统调用的方法

概念整理ia32/x86/amd64/ia64/arm64 x86 早期,1980s年代,x86一般指当时的处理器8088和80286,不过这两个处理器都是16位的。如今,x86通常指32位指令集架构的处理器,比如80386。80386处理器是intel在1985年实现的第一款32位指令集架构的处理器,又叫i386,Intel Architecture, 32-bit,缩写为IA-32,现在,IA-32一般又能引喻成所有的支持32位计算的x86架构。 按照发展历史看,x86应该是指令集概念,一般用于个人PC系统如8086,286,386。IA-32是intel首推的 阅读详情

 


1 系统调用的基础

应用程序通过0x80号中断进入系统调用,所以首先要在硬件机制上铺好进入中断的道路
这是在系统初始化进行的:
void __init trap_init(void)
{
...
set_system_gate(SYSCALL_VECTOR,&system_call);
...
}


2 系统调用表
在IA32架构下,内核里所有的系统调用的入口函数,都被放入系统调用表中
在arch/i386/kernel/syscall_table.S中

ENTRY(sys_call_table)
 .long sys_restart_syscall
 .long sys_exit
 .long sys_fork
 .long sys_read
 .long sys_write
 .long sys_open  /* 5 */
 .long sys_close
 ......
}

这张表其实就是个函数指针表,这张表是系统调用总的转发依据


在进入system_call之后,内核以eax的系统调用号为索引,调用对应的系统调用入口函数:

syscall_call:

#eax存放着系统调用号,这里进入对应的系统调 用
 call *sys_call_table(,%eax,4)

# 从系统调用中返回,eax里存放系统调用的结果
 movl %eax,PT_EAX(%esp)    


3 系统调用的截获
我们就是要在进入系统调用之前和之后截获系统调用
首先准备我们的系统调用进入和退出时的截获函数

asmlinkage void senix_sys_enter(int call)
{
 printk("senix_sys_enter %d %s %d/n",current->pid,current->comm,call);
 
}

asmlinkage void senix_sys_exit(int ret)
{
 printk("senix_sys_exit %d %s %d/n",current->pid,current->comm,ret);

}

 

 

然后修改进入系统调用的流程

syscall_call:

#保存eax里的系统调用号,防止被修改
 pushl %eax    

#进入我们的截获函数,在里面截取系统调用号(也可截获其他参数)
 call senix_sys_enter 

#恢复系统调用号     

 popl %eax
 call *sys_call_table(,%eax,4)

#保存eax里的系统调用返回值,防止被修改
 pushl %eax     

#进入我们的截获函数,在里面截取系统返回值

call senix_sys_exit

#恢复系统调用返回值  
popl %eax
movl %eax,PT_EAX(%esp) 
...


4 讨论
以上代码在本人的机器上调试成功,内核版本为linux-2.6.21.5

 

 


===============================================================
讨论  linux_kernel_2_6@yahoo.com.cn
未经允许请勿用于商业用途
                                             wangsen
===============================================================

 

 

Intel64和IA-32架构软件开发者手册第1卷:基本架构 第1章-关于本手册。给出了英特尔®64和IA-32架构软件开发者手册的所有五卷的概述。它还描述了这些手册中的符号约定,并列出了程序员和硬件设计人员感兴趣的相关Intel手册和文档。 第2章- Intel®64和IA-32架构。介绍Intel 64和IA-32架构以及基于这些架构的Intel处理器系列。它还概述了这些处理器的常见特性,以及Intel 64和IA-32架构的简要历史。 第3章-基本执行环境。介绍了内存组织的模型,并描述了应用程序使用的寄存器集。 第4章-数据类型。描述处理器识别的数据类型和寻址模 阅读详情

相关推荐

IA32e下分页的开启:概述

内存分布 IA32e下的地址用64位来表示,但CPU只使用了其中的前52位,即4PB的最大物理内存寻址空间,而开启分页后,CPU只使用其中48位,即256TB的最大虚拟内存寻址空间,而到了Windows,则更是只使用了其中44位,即只用16TB的虚拟内存寻址空间,其中0000000000000000-000007FFFFFFFFFF是用户层地址空间,而FFFFF80000000000-FFFFF

yeshahayes的博客 2098

Linux系统调用之二——调用机制

无论是GUI(用户图形接口)、应用程序,还是命令行接口最终都需要使用系统调用来实现。 当我们要打开文件(open)然后进行写入(write)或者分配内存(malloc)时,此时将会切换到内核态,虽然我们并察觉不到;之后内核对调用进行检查,如果通过,则按照指令执行相应的操作,分配相应的资源。

保持一颗永远好奇、勇于探索的心 3979

深入了解Intel IA-32架构:官方手册三卷精要

本文还有配套的精品资源,点击获取 简介:《Intel IA-32手册》是专业计算机工程师和程序员必备的参考资料,分为三卷,详尽描述了Intel IA-32处理器的基础知识、指令集和系统编程指南。从处理器架构、指令集、异常处理到系统级编程,这三卷手册为深入理解计算机硬件和优化软件性能提供了全面的指导。 1. Intel IA-32架构概述 简介 IA-32架...

weixin_33597080的博客 1867

Linux4.19-通过IDT获取sys_call_table实现系统调用劫持

上一篇博客写了如何获取IDT地址,这里将接着上一篇博客继续写,如果还不清楚如何获取IDT可以看一下我的上一篇博客:Linux4.19-获取IDT地址:https://blog.youkuaiyun.com/qq_41208289/article/details/106012230 这里再次声明一下,博主的系统为目前最新版本的Debian10,Linux4.19内核(32位x86机器) 前言 网上的绝大部分博客对于获取sys_call_table的方法在目前的内核中都已经失效,Linux大概从4.8开始加入了保

CalvinXu 2266

全面掌握Intel IA32架构及80x86开发技术手册

IA32架构是x86系列处理器的基础,广泛应用于个人电脑和服务器领域。它采用了复杂指令集计算机(CISC)架构,支持多种数据类型、寻址模式和复杂操作。IA32的设计目标是提供高性能和高兼容性,它允许32位应用程序在64位操作系统中运行,这种特性也被称为x86-64或AMD64。数据操作指令是80x86指令集中最基本也是最常用的指令类型。它们涉及数据的移动、算术运算和逻辑运算。理解这些指令对于编写高效、优化的程序至关重要。

weixin_35899324的博客 464

深入解析Intel处理器IA-32指令集

指令集是计算机处理器(CPU)能够理解并执行的命令集合。它定义了硬件与软件之间的接口,是构建和优化程序的重要基础。理解指令集的原理,有助于程序员编写更高效、更贴近硬件的代码。

weixin_36382073的博客 1135

Hook Linux内核系统调用

百度搜索到Hook Linux内核系统调用的方式,通过修改系统调用表syscall_table相应的地址,查找syscall_table的方式主要有3种: 通过查看/boot/System.map.*文件,从sys_close遍历到loops_per_jiffy来查找到syscall_table,代码如下: unsigned long **find_sys_call_table(void) ...

xiejianjun417的专栏 900

Autodesk软件网络授权破解

Autodesk 全系列产品网络授权破解 此网络许可授权破解文件及方法适用Autodesk 绝大部分的产品, 安装网络许可证管理器Autodesk网络许可证管理器x64位官方下载地址( https://knowledge.autodesk.com/sites/default/files/file_downloads/nlm11.14.1.3_ipv4_ipv6_win64.msi ) Autod...

weixin_33919950的博客 8254

64位linux 兼容32位程序,linux的64位操作系统对32位程序的兼容-全面分析

1.结构体ioctl_trans:struct ioctl_trans {unsigned long cmd;ioctl_trans_handler_t handler;struct ioctl_trans *next;};该结构体提供了一个粘合层,用户可以动态注册一个ioctl_trans以便其提供64位和32位的粘合:extern int register_ioctl32_conversion...

weixin_35658042的博客 671

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 512

DataGridView 右键菜单复制(公共)

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {

沁心渃水 2829

在Linux操作系统中如何截获系统调用

在Linux操作系统中如何截获系统调用 使用Linux Kernel Module的一般目的就是扩展系统的功能,或者给某些特殊的设备提供驱动等等。其实利用Linux内核模块我们还可以做一些比较“黑客”的事情,例如用来拦截系统调用,然后自己处理。嘿嘿,有意思的说。   下面给出一个简单的例子,说明了其基本的工作过程。  #de

joy 1790

零差云控关节模组:EtherCAT+preempt-RT实现微秒级同步

关节模组是协作机器人、外骨骼与高精度服务机器人的核心执行单元,其性能瓶颈常在于多轴运动的时序一致性与实时闭环能力。实现‘零差’同步依赖于确定性通信(如EtherCAT)与硬实时操作系统支持(如Linux preempt-RT),前者保障指令与状态在微秒级时间戳下全局对齐,后者消除内核调度抖动,使PID控制、电流采样、编码器反馈等关键路径具备纳秒级可预测性。技术价值体现在相位偏差<±0.01°、端到端控制周期稳定1ms、连续运行温漂<±1.2℃等工程指标,广泛应用于力控装配、康复训练、远程遥操作等对动态精度与

weixin_34192816的博客 1197

IA32架构的MASM

​ 答:在子程序中使用寄存器,要先压入堆栈进行保护,使用完毕后再弹出,这是因为,子程序中直接使用寄存器会破坏其中的值,特别是这个寄存器如果在调 用者中还要再次使用,如果值被破坏,那么程序最后的执行结果就会出错。通过连续内存来存储分支的地址,减少了程序中各种转移指令的使用,不仅使程序可读性更强,同时分支可预测,在分支之间转移的时间少,利于流水线模式。​ 答: 传值:压入堆栈的是原变量的副本,在堆栈中不会影响原变量的值,影响的只是原变量的副本。函数指针中存放的是函数首条指令的地址,而汇编中调用函数就相当于。

2301_79797055的博客 931

【Android Performance】Android CPU绑核实战:从taskset到cpuset的完整调优指南

本文系统讲解Android系统中的CPU绑核(CPU Affinity)技术,涵盖用户空间的taskset命令行绑核、内核cpuset分组机制的原理与操作、进程级与线程级绑核的代码实现、以及中断绑核的底层方法。文中深入拆解CPU亲和性掩码的计算规则、各cpuset分组的默认策略差异、绑核后的验证手段及常见踩坑场景,并配有多项实操命令与C代码示例。适合从事Android系统性能调优、进程调度优化的开发者阅读。

weixin_44081096的博客 1310

2025年12月GESP真题及题解(C++一级): 小杨的爱心快递

2025年12月GESP真题及题解(C++一级): 小杨的爱心快递

王老师青少年编程 1648

Windows(IA-32e模式)系统调用

一、本文主题 Windows NT是一个面向分层的操作系统,最底层是硬件,最高层使用户接口,Windows采用这种模式来保护内核不被应用程序错误的波及,操作系统核心运行在内核层(Ring 0 ),用户模式运行在应用层(Ring 3)。这只是操作系统分层的抽象概念。而本文旨在讨论Windows操作系统在IA-32e模式下从Ring3进入Ring0的部分具体实现过程,也会对比IA-32模式下的部分差异。本文IA-32e测试系统为Windows 10 2004。 二、系统调用 ...

m0_43422086的博客 2279

EtherCAT主站SOEM -- 1 -- SOEM之ethercattype.h文件分析

“ethercattype.h” 文件用于支持 EtherCAT 网络通信,提供了各种类型定义和宏,以便开发者更轻松地开发 EtherCAT 相关应用程序。这些定义包括数据类型、命令类型、状态类型和错误类型,以支持 EtherCAT 通信。根据具体应用需求,还可以调整一些超时和帧长度设置。这些定义用于处理函数调用的结果,如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。这些定义用于处理 EtherCAT 命令,例如 EC_CMD_APRD(自动递增读取

常驻客栈的博客--嵌入式EtherCAT 2714

IA-32e模式学习小插曲

​ 本文从调试Linux 6.9系统调用时观察到的ds选择子清零出发,探索了intel 64下为什么允许一些段寄存器清零。在解决ds清零程序仍可以正常运行的过程中,了解到代码段描述符的CS.L位的含义,发出了32位程序该如何进行系统调用的疑问,然后笔者设计了实验来手动的在32位应用程序中进行64位的系统调用。印字符,这样就不需要引入stdio.h了)***​ 本文从调试Linux 6.9系统调用时观察到的ds选择子清零出发,探索了intel 64下为什么允许一些段寄存器清零。

qq_45711131的博客 1281

使用MATLAB结合EasySpin进行ESR模拟的详细步骤及示例代码

安装EasySpin:确保你已经安装了EasySpin工具箱,它可以帮助你进行ESR模拟。你可以从EasySpin的官方网站(https://easyspin.org/)下载并安装。准备实验数据:将实验得到的EPR数据整理成合适的格式,一般包含磁场(Magnetic Field)和信号强度(Intensity)两列。进行模拟:使用EasySpin的函数对单线态氧自由基和超氧自由基进行模拟。调整参数:通过调整模拟参数,使模拟得到的峰型和峰位置与实验数据尽可能匹配。导出数据。

AI的内部世界的博客 2004

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系

想要搞清楚 x64、IA64、AMD64 指令集之间的关系,就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史。 x86 处理器 1978年 Intel 生产了它的第一款 16bit处理器8086,之后几款处理器名字也都以86结尾,包括80186,80286, 80386,80486,这些处理器的架构被统一称为 x86 架构。其中8086、80186、80286是 16b...

chaoguo1234的专栏 3959

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Intel 64和IA-32架构——操作模式

Intel的实模式和保护模式,必须要知道的... 一、Intel手册如是说 Intel的IA-32架构支持三种基本操作模式:保护模式、实地址模式和系统管理模式。操作模式决定了哪些指令和架构相关的特性是可用的: 保护模式(protected mode)——是处理器的根本模式,在保护模式下,可以为直接运行的实地址模式程序提供保护的、多任务的环境,这种特性被称作“虚拟8086模式(

u014763664的专栏 1488

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Intel IA-32架构浅析

IA32的cpu操作模式  1保护模式:  这个模式是cpu的native状态.它可以在一个保护的多任务的环境中直接执行 "real-address mode"的8086的软件.这个特性叫做virtual-8086模式.  这个模式也就是cpu的一般工作模式.因为这个模式基本上打开了cpu的所有特性.  2 real-address模式:  这个模式它实现了一个8086处理器的环境的

Invoker's Tower 1285

i386, x86, x86_64, IA-32, IA-64, 安腾, AMD64 的关系是什么?

x86 是一个统称,用来表示 XX86 指令集兼容的 CPU 架构, Intel 提出,但不专属于 Intel。代码里,i386 通常用来表示 32 位 x86 架构,x86_64 表示 64 位 x86 架构,和 CPU 厂商无关。 x86 兼容架构: i386, x86, x86_64, IA-32,AMD64,Xeon,Pentium IA-64 兼容架构: IA-64, 安腾 进化路径: Intel 时代:8008 -> 80386 -> 80486 -> 奔腾系列 -> 酷

余璜的技术博客 1086

ia32-libs

在64-bit机器上运行32-big的应用程序是,需要安装ia32-libs库 username@ubuntu:/usr$ apt-cache search ia32-libs ia32-libs-multiarch - Multi-arch versions of former ia32-libraries ia32-libs - ia32 shared libraries for use

jackie_gnu的专栏 1万+

第二章 Intel 64 及 IA-32架构

Intel奔腾D处理器同样支持多核技术,但不支持超线程技术,这意味着其最多提供两个逻辑处理器,每个逻辑处理器都独占其处理器核心的执行资源。和传统的使用两个或多个独立其物理IA32处理器的多处理器系统不同,支持超线程技术的IA32处理器中的逻辑处理器共享物理处理器的核心资源,包括执行引擎,系统总线接口。Intel至强3000,3200,5100,5300和7300系列处理器,Intel奔腾双核处理器,Intel酷睿二代至尊版,Intel酷睿二代四核处理器,Intel酷睿二代双核处理器支持Intel64架构;

qq_46655954的博客 1621
上一篇: swap换出的情景分析
下一篇: dynamic timer 对soc电源管理的影响
linux_kernel_2_8
博客等级 码龄19年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值