gpt4 book ai didi

linux - 我们可以修改 int 0x80 例程吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:07 25 4
gpt4 key购买 nike

  1. linux 2.6 与 2.4 有何不同?
  2. 我们可以修改源内核吗?
  3. 我们可以修改 int 0x80 服务例程吗?

最佳答案

更新:
1. 0x80 处理程序在 2.4 和 2.6 之间基本相同,尽管从处理程序调用的函数在 2.6 中由 x86-64 的“系统调用”指令处理程序调用。2. 0x80 处理程序可以像内核的其余部分一样进行修改。
3. 除非取消向后兼容性,否则修改不会破坏任何内容。例如,如果您愿意,可以添加自己的跟踪或后门。另一篇文章说,如果您修改处理程序,您将破坏您的库和工具链,这是不正确的。如果你破坏了调度算法,或者错误地修改了调度表,那么你就会破坏东西。
3a.正如我最初发布的那样,扩展 0x80 服务的最佳方法是扩展系统调用处理程序。

正如内核源代码所说:

What:           The kernel syscall interfaceDescription:        This interface matches much of the POSIX interface and is based        on it and other Unix based interfaces.  It will only be added to        over time, and not have things removed from it.

    Note that this interface is different for every architecture
that Linux supports. Please see the architecture-specific
documentation for details on the syscall numbers that are to be
mapped to each syscall.


i386 的系统调用表条目位于:
arch/i386/kernel/syscall_table.S

请注意,该表是一系列指针,因此如果您想与内核维护者保持一定程度的前向兼容性,则需要在放置指针之前填充该表。

系统调用向量号在 irq_vectors.h
中定义然后traps.c通过 set_system_gate设置 system_call函数的地址,将入口放入中断描述符表中。 system_call 函数本身在 entry.S 中,并从系统调用表中调用请求的指针。
有一些内务处理细节,您可以在阅读代码时看到这些细节,但是直接修改 0x80 中断处理程序是在 system_call 函数内的 entry.S 中完成的。以更理智的方式,您可以修改系统调用表,插入您自己的函数而不修改分派(dispatch)机制。

其实看了2.6的源码,直接说int 0x80和x86-64 syscall使用相同的代码,到目前为止。因此,您可以为 x86-32 和 x86-64 进行可移植的更改。
结束更新

INT 0x80 方法调用系统调用表处理程序。这会将寄存器参数与调用表匹配,根据 EAX 寄存器的内容调用内核函数。您可以轻松扩展系统调用表以添加自定义内核 API 函数。

这甚至可能适用于 x86-64 上的新系统调用代码,因为它也使用系统调用表。

如果您以任何方式更改当前系统调用表而不是扩展它,您将破坏所有依赖的库和代码,包括 libc、init 等。

这是当前的 Linux 系统调用表: http://asm.sourceforge.net/syscall.html

关于linux - 我们可以修改 int 0x80 例程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com