问题标签 [sysenter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
960 浏览

objective-c - CPU 使用 attributesOfItemAtPath:error 引发:

我正在使用[NSFileManager attributesOfItemAtPath:error:]函数来获取文件的属性。但有时我的应用程序 cpu 会达到 100%。我将此功能用于 100k(大约)个文件。
我的应用程序示例:

谁能帮帮我?

0 投票
0 回答
538 浏览

linux - 如何在 Linux 中禁用 SYSENTER 系统调用支持并仅使用 int $0x80

我正在尝试禁用SYSENTER系统调用支持,并让所有系统调用通过 Linux 中的中断回退int $0x80,而不使用任何 ptrace。

我找到了两种方法:</p>

  1. /proc/sys/vm/vdso_enabled通过将文件修改为 0来完全禁用 VDSO
  2. 调整/usr/src/linux/arch/x86/vdso/vdso32-setup.c

修改 VDSO(虚拟动态共享对象)应该是我方法中的方法,但我不知道要修改哪一行。有人可以给我任何建议吗?

谢谢你。

0 投票
2 回答
8154 浏览

linux - 32 位 Linux 上的 Syscall 或 sysenter?

从 MS‑DOS 开始,我就知道使用中断进行系统调用。在旧论文中,我看到了int 80h在 Linux 上调用系统函数的参考。很长一段时间以来,我知道int 80h不赞成使用该syscall指令。但我无法让它在我的 32 位机器上运行。

问题

syscall指令只能在 64 位平台上使用吗?32位Linux不使用syscall吗?

样品测试

在我的 32 位 Linux(Ubuntu Precise)上,该程序以核心转储终止:

我试过用sysenter而不是syscall,但它以同样的方式崩溃。

0 投票
1 回答
2870 浏览

windows - Windows 7 x86 使用 sysenter 执行直接系统调用

我正在尝试编写一些程序来直接调用系统调用而不通过 ntdll.dll

我的代码(Visual Studio 语法...):

当程序尝试执行 sysenter 指令时,程序会因访问冲突而崩溃:

我试图在所需的系统调用中使用内核调试器放置一个硬件断点,但执行流程没有到达那里......

我猜这个问题与堆栈顺序/深度有关。

非常感谢!

解决了:

我想问题是我试图在不加载 user32 和 gdi32 dll 的情况下执行 win32k 系统调用。

刚刚添加:

问题解决了..

如果有人对为什么在不加载这些 dll 的情况下会发生这种情况有更好的了解,我会很高兴知道 :)

0 投票
0 回答
462 浏览

linux - Linux系统调用寄存器保存

我有两个关于 32 位 Linux 系统调用的简单问题。

在 x86 Linux 中,调用系统调用有两种方式。

第一个使用 int 0x80,另一个是 sysenter。

我知道这两者之间的基本概念区别(sysenter 使用 SYSENTER_MSR_EIP、SYSENTER_MSR_ESP 寄存器、int 0x80 使用中断表、sysenter 提供更好的性能等...)

我的问题是...

  1. 从程序员的角度来看,int 0x80 和 sysenter 之间有什么功能区别吗?(即调用约定,对内存布局的副作用,或其他...)

  2. 从系统调用返回后,除了 EAX 寄存器之外,是否有任何系统调用发生变化?

先感谢您。

0 投票
2 回答
618 浏览

linux - 为什么linux内核在使用sysenter/sysexit时不恢复所有寄存器?

在linux kernel 2.6.11中,使用sysenter进行系统调用时,几乎和init 0x80一样,使用save_all将所有寄存器压入内核栈,但是调用完成后,如果没有设置相关标志,我们使用 sysexit 返回,但不恢复所有已保存在堆栈上的寄存器。

某些系统调用可能会更改寄存器值,为什么我们不需要重新设置所有寄存器

我已经阅读了相应的 i386 文档,它说

“Intel386 上的所有寄存器都是全局的,因此对调用函数和被调用函数都是可见的。寄存器 %ebp、%ebx、%edi、%esi 和 %esp“属于”调用函数。换句话说,被调用函数“

所以保存工作是 glibc 包装函数的责任,我已经阅读了一些 glibc 代码来确保它。所以在使用sysenter/sysexit做系统调用的时候,我们先将%ebp,%edx,%ecx压入用户栈是有道理的,因为%edx和%ecx不在保存寄存器中,需要等完成后再恢复系统调用,我们在调用系统服务例程之前也使用 %ebp 来保存用户堆栈指针,所以我们需要恢复它来传递参数

0 投票
0 回答
378 浏览

system-calls - Sysenter 结果在 SIGILL 信号中。如何在 A x86_64 上测试 Int0x80 /​​ Sycall / Sysenter?

.

我有一个学校项目,在 x86_64 OpenSUSE 上重新编码类似 strace 的命令。(英特尔 i7)

为此,我们当然使用 ptrace 系统调用,但禁止使用 PTRACE_SYSCALL。由于 PTRACE_PEEKTEXT 和与系统调用指令相对应的操作码(0x80CD 用于 int0x80,0x050F 用于 syscall,0x340F 用于 sysenter),我们必须使用 PTRACE_SINGLESTEP 并检测系统调用。

直到那里,我很好。但是接下来我们必须获取系统调用的参数。对于 syscall 和 intx80 这很简单,我查看 rax 以了解它是哪个系统调用,然后查看 rdi、rsi、rdx 等。

但是对于 sysenter 我找不到它是如何真正工作的。所以我尝试编写一个小汇编程序来测试这 3 条指令。

效果很好!

现在对于 int 0x80 版本,我只是将 rax 中的系统调用编号从 1 更改为 4。(在 32 中,不知道为什么,但系统调用编号不一样)

其工作率为 50%。显示一个字符串,但它是垃圾。

现在,如果我放一个 sysenter,我会收到一个 SIGILL 信号。我在 rax 中尝试了 1 和 4。

我的项目只需要在我的计算机上运行,​​但我必须能够检测和分析使用 sysenter 的二进制文件

有人可以对这些事情进行一些解释吗?

谢谢 !

Ps:对不起我的英语不好

0 投票
1 回答
701 浏览

assembly - SYSENTER 在 64 位模式下如何使用,IA32_SYSENTER_CS 是什么?

阅读 SYSENTER 指令的描述,我发现了以下内容:

IA32_SYSENTER_CS包含环 0 代码段 (CS)

我以为64位系统现在使用虚拟内存地址方案(分页),基本上不再依赖代码段(CS)寄存器。IA32_SYSENTER_CS有人可以解释一下注册表中究竟包含什么吗?

0 投票
0 回答
429 浏览

windows - 为系统调用挂钩 Windows 内核调度程序

我正在尝试SYSENTER从内核中挂钩调度功能,在过去的几天里,我正在研究程序执行SYSENTER并想要进入内核时会发生什么,然后我意识到IA32_SYSENTER_EIPIA32_SYSENTER_ESP负责设置内核RIPRSP之后SYSENTER

昨天我阅读了英特尔软件开发人员手册SWAPGS

SWAPGS 将当前 GS 基址寄存器值与 MSR 地址 C0000102H (IA32_KERNEL_GS_BASE) 中包含的值交换。SWAPGS 指令是供系统软件使用的特权指令。

当使用 SYSCALL 实现系统调用时,在 OS 入口点没有内核栈。也没有一种直接的方法来获取指向内核结构的指针,从中可以读取内核堆栈指针。因此,内核无法保存通用寄存器或参考内存。

从第二段开始,there is no kernel stack at the OS entry point似乎操作系统内核执行SWAPGS设置GS然后获取内核堆栈指针,但正如我所读到的,SYSENTER内核中的 RIP(EIP) 和 RSP (ESP) 应该设置从IA32_SYSENTER_EIPIA32_SYSENTER_ESP因此内核的堆栈指针在IA32_SYSENTER_ESP

我的问题:

  1. 如果内核堆栈地址应该来自GS,那么目的是IA32_SYSENTER_ESP什么?
  2. AMD LSTAR (0xC0000082)和 和有什么区别IA32_SYSENTER_EIP?我问它是因为我看到 Windows 在我的英特尔处理器上设置了 0xc0000082。
  3. 挂钩内核SYSENTER调度程序是否有任何特殊问题?这是因为每当我在负责在远程调试机器(不是VM)上调度SYSENTER调用(KiSystemCall64Shadow)的Windows函数中放置断点时,它都会导致带有UNEXPECTED_KERNEL_MODE_TRAP的BSOD。
0 投票
3 回答
843 浏览

c++ - 内联汇编中的 C++ SYSENTER x86 调用

我即将学习 x86 上的 sysenter 是如何工作的。我在 x86 平台上创建了一个简单的控制台应用程序,它应该在内联汇编中手动调用 NtWriteVirtualMemory 函数。

我从这里的代码开始,但似乎编译器不理解操作码“sysenter”,所以我决定_emit使用 sysenter 的字节。(也许我需要在我的项目设置中更改某些内容?)它编译但是当它大约调用函数visual studio给我一个错误,我ret在执行时是一条非法指令,程序停止。

有人知道如何正确地做到这一点吗?