在 x64 系统上编写自己的客户系统调用/int 0x80

逆向工程 部件 linux x64
2021-06-28 03:30:03

有没有办法在不使用它们的情况下编写我自己的syscall/ int 0x80所以,通常它会像

setup registers
...
syscall or int 0x80

我有兴趣在没有syscall/int 0x80

setup registers
call mysyscall

我在哪里可以找到syscallor 的实现int 0x80还是在 asm 中实现它的级别太低?

1个回答

TL;DR:这是CPU支持两条指令,您不能在汇编中实现它们,因为它们是(或不是)您正在使用的汇编语言的一部分。

更多背景:

中断(汇编int指令导致软件中断)是 CPU 的特殊事件。CPU 立即停止执行它正在执行的指令序列,保存当前执行的上下文(例如EIP和其他控制寄存器,大多数用户无法直接访问),并切换到专门指定的代码序列,负责处理该特定中断。

硬件中断的例子与处理电源、硬盘网络和其他外围设备有关,以及当程序访问内存区域失败、某些计算失败(除以零)、浮点错误、尝试执行特权或无效指令和许多其他指令。

此外,程序可以通过使用int接收单个操作数指令有意触发中断- 要触发的中断 id。

当中断发生时,在中断描述符表(又名中断向量表)中的中断索引所指向的地址处恢复执行,在 的情况下int 0x80,这0x80显然是偏移处的地址

由于中断对 CPU 来说是一项昂贵的操作(它需要大量与线程和上下文切换相关的簿记等),因此 AMD(以及后来的 Intel)引入了该sysenter指令(syscall由 Intel调用)。该指令仅通过提升到 ring0 并执行内核代码来将簿记保持在最低限度。