本篇文章将介绍和分析在指令层面上对系统调用响应速度的优化——快速系统调用指令,32位下使用的sysenter/sysexit;64位下使用的syscall/sysret,以及linux内核中为了支持这些快速系统调用指令所做的相关操作...- IA32_SYSENTER_ESP(175H):指定要执行的Ring0代码所使用的栈指针 (4)使用rdmsr/wrmsr读取和写入MSR 下面基于linux-2.6.39内核进行分析: 3.1...系统调用初始化 从linux内核启动流程入手:start_kernel() -> chenk_bugs() -> identify_boot_cpu() -> sysenter_setup() &...3.3 sysenter的系统调用处理 3.3.1 linux2.6.39内核sysenter系统调用 正如刚才对IA32_SYSENTER_EIP寄存器中传入sysenter的系统调用函数入口地址ia32...3.3.2 linux4.20内核sysenter系统调用 在linux4.20内核中,对IA32_SYSENTER_EIP寄存器中传入的是entry_SYSENTER_32函数。
一、背景 为了安全,Linux 中分为用户态和内核态两种运行状态。对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力。...以下的分析基于 Linux kernel 4.9.76 ,glibc 为 2.25.90。.../linkage.h> #include #include #include #include <asm...六、总结 本文主要分析了Linux下的三种系统调用方式:int 0x80 ,sysenter 和 syscall 。...05/the-definitive-guide-to-linux-system-calls/ http://www.ibm.com/developerworks/cn/linux/kernel/l-k26ncpu
在 Linux 环境下如何测试 CPU 等硬件和操作系统性能?...================================= BYTE UNIX Benchmarks (Version 5.1.3) System: iEUCD-DP: GNU/Linux...OS: GNU/Linux -- 5.11.0-40-generic -- #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 Machine...同样用 Ubuntu 台式机跑了一遍,可以在 这里 查看跑分结果: Linux 环境下我个人倾向于使用开源软件 Unixbench ,可以直接在终端查看结果,无需联网。...至此,本文介绍了 Linux 环境下的跑分方法。
.从ring0到ring3最开始是用的int2E,此模式切换过程设计很多次内存访问,还有两次查表操作机访问权限的检查,这导致模式切换的开销很大从PentiumII 处理器开始,Inter引入了新的指令sysenter...sysenter使用3个MSR寄存器来指定跳转目的地址和栈位置。 可以在内核模式下通过 rdmsr/wrmsr 指令来设置这3个寄存器。(可想而知,在这可以HOOK) ?...HOOk代码: NTSTATUS HookSYSENTER() { _asm mov ecx,0x176; // IA32_SYSENTER_EIP 在MSR的偏移为...内部指令: 1.将IA32_SYSENTER_CS 和IA32_SYSENTER_EIP分别装到cs和eip寄存器中 2.将IA32_SYSENTER_CS+8 和IA32_SYSENTER_ESP...3.将IA32_SYSENTER_CS+24装载到ss寄存器中; 4.将ecx寄存器中的指针装载到esp中,切换到特权3. 5.sysenter / sysexit 只使用固定值,或寄存器的值来完成跳转
1 开启冒险之旅 我是一个线程,出生在这个Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。...忙完上面的操作,我环顾四周,发现这房间里还有一道门,门上写着sysenter。 我小心翼翼的走了进去,突然,眼前闪过一道白光,紧接着光线消失,四周变得幽暗起来。...“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间...是不是就是那个sysenter指令,通过它进入的?",我恍然大悟。 “对,没错!”。...对了大叔,你也是从那个sysenter虫洞穿越过来的吗?” “我是从虫洞过来的,不过不是sysenter哦,而是···哦我还有事要忙,就此别过吧”,说完匆忙离去。 我大吃一惊!难道还有别的虫洞?
系统调用为何那么耗时 那么哪些方式可以触发系统调用呢,在Linux系统下有这几种方式: “ 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER...有些汇编指令如SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table、IDT)中查找系统调用对应的执行过程,也不需要保存堆栈和返回地址等信息...当然,使用虚拟动态共享对象(vSDO)执行系统调用性能更优越,这里涉及到Linux知识,不做细讲。 但是vSDO性能这么优良,无论什么情况下都使用vSDO可以么。当然不行。...使用软件中断触发的系统调用需要保存堆栈和返回地址等信息,还要在中断描述表中查找系统调用的响应函数,虽然多数的操作系统不会使用 INT 0x80 触发系统调用,但是在一些特殊场景下,我们仍然需要利用这一古老的技术; 使用汇编指令 SYSCALL / SYSENTER
1开启冒险之旅 我是一个线程,出生在这个Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。...忙完上面的操作,我环顾四周,发现这房间里还有一道门,门上写着sysenter。 我小心翼翼的走了进去,突然,眼前闪过一道白光,紧接着光线消失,四周变得幽暗起来。...“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间...是不是就是那个sysenter指令,通过它进入的?",我恍然大悟。 “对,没错!”。...对了大叔,你也是从那个sysenter虫洞穿越过来的吗?” “我是从虫洞过来的,不过不是sysenter哦,而是···哦我还有事要忙,就此别过吧”,说完匆忙离去。 我大吃一惊!难道还有别的虫洞?
因为是在xp里面进行实验,这里就用od里面的调用进行分析实现 我们希望可以在自己的代码中直接使用 sysenter,但经过编写发现其并没有提供这种指令。...KiFastSystemCall: 7c92e4f0 8bd4 mov edx,esp 7c92e4f2 0f34 sysenter ntdll!...中断门进0环,需要的CS、EIP在IDT表中,需要查内存(SS与ESP由TSS提供) 而CPU如果支持sysenter指令时,操作系统会提前将CS/SS/ESP/EIP的值存储在MSR寄存器中,sysenter...KiSystemService API通过sysenter指令进0环: CS/ESP/EIP由MSR寄存器提供(SS是算出来的),进入0环后执行的内核函数:NT!...KiFastCallEntry 代码实现 因为这里_asm不支持 sysenter 指令,可以用 _emit 代替,在模拟调用CALL [0x7FFE0300]这条指令的时候需要填入调用函数的真实地址,
因为是在xp里面进行实验,这里就用od里面的调用进行分析实现 我们希望可以在自己的代码中直接使用 sysenter,但经过编写发现其并没有提供这种指令。...KiFastSystemCall: 7c92e4f0 8bd4 mov edx,esp 7c92e4f2 0f34 sysenter ntdll!...当通过eax=1来执行cpuid指令时,处理器的特征信息被放在ecx和edx寄存器中,其中edx包含了一个SEP位(11位),该位指明了当前处理器是否支持sysenter/sysexit指令,进入od使用...中断门进0环,需要的CS、EIP在IDT表中,需要查内存(SS与ESP由TSS提供) 而CPU如果支持sysenter指令时,操作系统会提前将CS/SS/ESP/EIP的值存储在MSR寄存器中,sysenter...KiSystemService API通过sysenter指令进0环: CS/ESP/EIP由MSR寄存器提供(SS是算出来的),进入0环后执行的内核函数:NT!
执行系统调用的三种方法: 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER 等汇编指令触发系统调用; 使用虚拟动态共享对象(virtual...Linux 为了解决这个问题,在较新的版本使用了新的汇编指令 SYSENTER / SYSCALL,它们是 Intel 和 AMD 上用于实现快速系统调用的指令,我们会在 32 位的操作系统上使用 SYSENTER...与 INT 0x80 通过触发软件中断实现系统调用不同,SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table...vDSO 虚拟动态共享对象(virtual dynamic shared object、vDSO)是 Linux 内核对用户空间暴露内核空间部分函数的一种机制[^16],简单来说,我们将 Linux 内核中不涉及安全的系统调用直接映射到用户空间...linux-vdso.so.1 (0x00007fff2709c000)
在上一篇文章《系统调用分析(2)》中介绍和分析了32位和64位的快速系统调用指令——sysenter/sysexit和syscall/sysret,以及内核对快速系统调用部分的相关代码,并追踪了一个用户态下的系统调用程序运行过程...之后对32位下的快速系统调用指令——sysenter/sysexit进行指令学习和对相关Linux源码分析。...Linux源码分析。.../linux-syscall-3.html [5] Linux系统调用过程分析. https://www.binss.me/blog/the-analysis-of-linux-system-call/...Linux快速系统调用实现机制分析.
环进0环需要更改的4个寄存器 以 ReadProcessMemory 为例说明系统调用全过程 重写 ReadProcessMemory 和 WriteProcessMemory int 0x2e 和 sysenter...系统调用有中断调用和快速调用两种方式,中断调用是通过中断门进0环,此过程需要查IDT表和TSS表; 快速调用则是使用 sysenter 指令进0环,这种方式不需要查内存,而是直接从CPU的MSR寄存器中获取所需数据..._KiFastSystemCall@0 proc near mov edx, esp sysenter _KiFastSystemCall@0 endp ; 把3环栈顶地址存储到edx中,然后调用...sysenter指令,然后就进0环了。...注意,vs 内联汇编不支持 sysenter 指令,可以用 _emit 代替。
======================= BYTE UNIX Benchmarks (Version 5.1.2) System: VM_132_128_centos: GNU/Linux... OS: GNU/Linux -- 3.10.0-514.21.1.el7.x86_64 -- #1 SMP Thu May 25 17:04:51 UTC 2017 Machine: x86...Xeon(R) CPU E5-26xx v4 (4788.9 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER
调试异常不会因为开启EFLAGS.IF标志位而被停止 如果MOV SS 或 POP SS指令后面跟类似SYSCALL, SYSENTER, INT 3等指令,则控制权限将转移到CPL < 3,此时调试异常则会在...在SS被加载时就会产生#DB异常 在Windows,macOS会导致提权,对于FreeBSD和Linux kernel会导致崩溃 IF(bit 9) [Interrupt enable flag]...SS; SYSCALL [RUN] MOV SS; breakpointed NOP Got SIGTRAP with RIP=400f37, EFLAGS.RF=0 [RUN] MOV SS; SYSENTER
实验拓扑基本的IP配置如下从左往右AR3的基本配置默认路由sysEnter system view, return user view with Ctrl+Z....ip route-static 0.0.0.0 0 192.168.2.2 AR1的基本配置sysEnter system view, return user view...192.168.3.1 24[Huawei-GigabitEthernet0/0/1][Huawei-GigabitEthernet0/0/1]qAR2的基本配置配置了接口的IP地址十分简单sysEnter...Huawei-GigabitEthernet0/0/1]ip add 192.168.4.1 24[Huawei-GigabitEthernet0/0/1]qAR4的基本配置默认路由sysEnter
kernel32.OpenProcess KernelBase.OpenProcess Ntdll.NtOpenProcess 7FFE0300(获取KiFastCallEntry) sysenter...KiFastSystemCall: 772b70b0 8bd4 mov edx,esp 772b70b2 0f34 sysenter ntdll!...将 SYSENTER_CS_MSR 的值装载到 cs 寄存器 174 2. 将 SYSENTER_EIP_MSR 的值装载到 eip 寄存器 176 3....将 SYSENTER_CS_MSR 的值加 8(Ring0 的堆栈段描述符)装载到 ss 寄存器。 4. 将 SYSENTER_ESP_MSR 的值装载到 esp 寄存器 175 5....将 SYSENTER_CS_MSR 的值加 16(Ring3 的代码段描述符)装载到 cs 寄存器 2. 将寄存器 edx 的值装载到 eip 寄存器 3.
实验如下拓扑图AR1的配置sysEnter system view, return user view with Ctrl+Z....AR2的配置sysEnter system view, return user view with Ctrl+Z....[Huawei-ospf-1-area-0.0.0.0]network 192.168.8.0 0.0.0.255[Huawei-ospf-1-area-0.0.0.0]AR3的配置sysEnter...0.0.0.255[Huawei-ospf-1-area-0.0.0.0]network 192.168.6.0 0.0.0.255[Huawei-ospf-1-area-0.0.0.0]AR4的配置sysEnter...AR5的配置sysEnter system view, return user view with Ctrl+Z.
包括SSDT-hook,IDT-hook,sysenter-hook。欢迎讨论,指正!内核层需要驱动,有这方面的基础最好,如果不会,了解下其中的思路也可以的。 II....SSDT-hook,IDT-hook,sysenter-hook 一.SSDT-hook (一)一般思路: 1.先来了解一下,什么是SSDT SSDT既System Service Dispath...用户模式(User mode)的所有调用,如Kernel32,User32.dll, Advapi32.dll等提供的API,最终都封装在Ntdll.dll中,然后通过Int 2E或SYSENTER进入到内核模式...mov ecx, 0x176 rdmsr // 读IA3_SYSENTER_EIP...// hook函数地址 wrmsr // 将hook函数移入IA32_SYSENTER_EIP寄存器 }
Linux 内核以 C 语言语法 API 接口形式(头文件),提供有一系列服务供程序访问。可以通过 man 2 syscall 查看系统调用信息。...外壳函数执行一条中断机器指令(int 0×80),引发处理器从用户态切换到核心态,并执行系统中断 0×80(十进制128)的中断矢量所之指向的代码;(2.6内核 和 glibc 2.3.2 以后的版本支持 sysenter...Go 中 Syscall 的实现,在汇编文件 syscall/asm_linux_amd64.s 中: // func Syscall(trap int64, a1, a2, a3 int64) (r1...searchin/golang-nuts/Syscall$20RawSyscall/golang-nuts/y9lT_1loJj4/g4ZrYB2_80YJ 《The Linux Programming...Interface —A Linux and UNIX System Programming Handbook》
这段代码的作用是hook SYSENTER, 具体可参见 [1]。下次执行SYSENTER指令的时候,控制会转到ebx+17 的代码,即地址 FFDFF221。 跟进FFDFF221 代码, ?...这段代码过河拆桥,将上面SYSENTER的Hook摘掉。随后执行 ? FFDFF39A这个函数正是试图安装双脉冲星后门的函数。这个函数篇幅略长,但目的非常清晰,替换 srv.sys!
领取专属 10元无门槛券
手把手带您无忧上云