(4)将ia32_sysenter_target(sysenter指令的接口函数)设置到MSR_IA32_SYSENTER_EIP。...3.2 sysenter和sysexit的指令操作 在Ring3的代码调用sysenter指令之后,CPU做出如下操作: 将SYSENTER_CS_MSR的值装在到cs寄存器。...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函数。...sysexit ... entry_SYSENTER_32()函数主要工作: (1)之前说到sysenter指令会将SYSENTER_ESP_MSR的值装载到esp寄存器,但是里面保存的是sysenter_stack
.从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 只使用固定值,或寄存器的值来完成跳转
_SYSENTER_EIP(175H):存放内核态栈顶偏移量 IA32_SYSENTER_ESP(176H):存放内核态处理代码偏移量 当执行 sysenter 时,执行以下操作: 清除 FLAGS 的...SYSENTER_CS_MSR 的值到 CS 将 SYSENTER_CS_MSR + 8 的值加载到 ss 。..._SYSENTER_ESP 中,最后将内核入口点 entry_SYSENTER_32 的地址设置到 MSR_IA32_SYSENTER_EIP 中。...前文提到过,执行了 sysenter 指令之后直接切换到内核态,同时寄存器也都设置好了:eip 被设置为 IA32_SYSENTER_EIP 即 entry_SYSENTER_32 的地址,其定义在arch...esp 中,但 IA32_SYSENTER_ESP 保存的是 SYSENTER_stack 的地址,需要通过 TSS_sysenter_sp0 进行修正,指向进程的内核栈。
因为是在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!
因为是在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]这条指令的时候需要填入调用函数的真实地址,
-8700 CPU @ 3.20GHz (6400.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER...-8700 CPU @ 3.20GHz (6400.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER...-8700 CPU @ 3.20GHz (6400.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER...-8700 CPU @ 3.20GHz (6400.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER...-8700 CPU @ 3.20GHz (6400.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER
环进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 代替。
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.
实验拓扑基本的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
忙完上面的操作,我环顾四周,发现这房间里还有一道门,门上写着sysenter。 我小心翼翼的走了进去,突然,眼前闪过一道白光,紧接着光线消失,四周变得幽暗起来。...是不是就是那个sysenter指令,通过它进入的?",我恍然大悟。 “对,没错!”。...对了大叔,你也是从那个sysenter虫洞穿越过来的吗?” “我是从虫洞过来的,不过不是sysenter哦,而是···哦我还有事要忙,就此别过吧”,说完匆忙离去。 我大吃一惊!难道还有别的虫洞?
实验如下拓扑图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.
实验拓扑最左边路由器的配置AR2的基本配置sysEnter system view, return user view with Ctrl+Z....最右边AR3的基本配置sysEnter system view, return user view with Ctrl+Z....其次就是链接RIP和OSPF的路由器AR1的基本配置(核心)首先就是基本的IP地址配置sysEnter system view, return user view with Ctrl+Z
系统调用为何那么耗时 那么哪些方式可以触发系统调用呢,在Linux系统下有这几种方式: “ 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER...有些汇编指令如SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table、IDT)中查找系统调用对应的执行过程,也不需要保存堆栈和返回地址等信息...使用软件中断触发的系统调用需要保存堆栈和返回地址等信息,还要在中断描述表中查找系统调用的响应函数,虽然多数的操作系统不会使用 INT 0x80 触发系统调用,但是在一些特殊场景下,我们仍然需要利用这一古老的技术; 使用汇编指令 SYSCALL / SYSENTER
包括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寄存器 }
这段代码的作用是hook SYSENTER, 具体可参见 [1]。下次执行SYSENTER指令的时候,控制会转到ebx+17 的代码,即地址 FFDFF221。 跟进FFDFF221 代码, ?...这段代码过河拆桥,将上面SYSENTER的Hook摘掉。随后执行 ? FFDFF39A这个函数正是试图安装双脉冲星后门的函数。这个函数篇幅略长,但目的非常清晰,替换 srv.sys!
调试异常不会因为开启EFLAGS.IF标志位而被停止 如果MOV SS 或 POP SS指令后面跟类似SYSCALL, SYSENTER, INT 3等指令,则控制权限将转移到CPL < 3,此时调试异常则会在...SS; SYSCALL [RUN] MOV SS; breakpointed NOP Got SIGTRAP with RIP=400f37, EFLAGS.RF=0 [RUN] MOV SS; SYSENTER
为什么系统调用会带来这么大的额外开销,它在内部到底执行了哪些工作呢,本文将介绍 Linux 执行系统调用的三种方法: 使用软件中断(Software interrupt)触发系统调用; 使用 SYSCALL / SYSENTER...Linux 为了解决这个问题,在较新的版本使用了新的汇编指令 SYSENTER / SYSCALL,它们是 Intel 和 AMD 上用于实现快速系统调用的指令,我们会在 32 位的操作系统上使用 SYSENTER...与 INT 0x80 通过触发软件中断实现系统调用不同,SYSENTER 和 SYSCALL 是专门为系统调用设计的汇编指令,它们不需要在中断描述表(Interrupt Descriptor Table...使用软件中断触发的系统调用需要保存堆栈和返回地址等信息,还要在中断描述表中查找系统调用的响应函数,虽然多数的操作系统不会使用 INT 0x80 触发系统调用,但是在一些特殊场景下,我们仍然需要利用这一古老的技术; 使用汇编指令 SYSCALL / SYSENTER
基本acl的应用示例:AR1的基本配置基本的IP配置还有默认路由 先实现全网互通sysEnter system view, return user view with Ctrl+Z....1]ip add 6.6.6.6 255.255.255.0 [Huawei]ip route-static 0.0.0.0 0 6.6.6.7AR2的基本配置基本的配置实现全网互通sysEnter
我们知道从ring3进入ring0需要通过int2e/sysenter(syscall)进入ring0,而进入ring0之后又会通过KiFastCallEntry/KiSystemService去找SSDT...首先是对int2e/sysenter的盯防,我们知道大多数函数都是通过一系列的调用链,最终找到ntdll.dll里面的函数,找到调用号后通过int2e/sysenter的方式进入ring0,杀软首先会hook...ntdll.dll来实现监测的效果,这里的话之前已经介绍过了,我们可以通过自己逆向的方式通过汇编定位到int2e/sysenter的地址自己重写ring3部分的api来达到绕过杀软的效果 那么再看ring0
领取专属 10元无门槛券
手把手带您无忧上云