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

时间:2009-02-26 17:26:55

标签: linux assembly routines

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

2 个答案:

答案 0 :(得分:6)

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

What:           The kernel syscall interface
Description:
        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通过system_call设置set_system_gate函数的地址,这将该条目放入中断描述符表中。 system_call函数本身位于entry.S中,并从系统调用表中调用请求的指针。
有一些内务处理细节,您可以看到读取代码,但直接修改0x80中断处理程序是在system_call函数内的entry.S中完成的。以更加理智的方式,您可以修改系统调用表,插入自己的函数而无需修改调度机制
事实上,在阅读了2.6源代码之后,它直接说到int 0x80和x86-64系统调用使用相同的代码,到目前为止。因此,您可以对x86-32和x86-64进行便携式更改 结束更新

INT 0x80方法调用系统调用表处理程序。这将寄存器参数与调用表进行匹配,并根据EAX寄存器的内容调用内核函数。您可以轻松扩展系统调用表以添加自定义内核API函数
这甚至可以在x86-64上使用新的系统调用代码,因为它也使用系统调用表
如果以任何方式更改当前系统调用表而不是扩展它,则将中断所有依赖库和代码,包括libc,init等。

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

答案 1 :(得分:5)

  1. 这是一次建筑改造。一切都在内部发生了变化。 SMP支持已经完成,流程调度程序得到了极大的改进,内存管理得到了彻底的改进,还有很多其他的东西。
  2. 是。它是开源软件。如果您没有来源的副本,可以从供应商或kernel.org获取。
  3. 是的,但这不可取,因为打破libc,打破你的baselayout,如果你打破你的工具链改变现有系统调用的顺序,几乎所有你认为想要做的事都应该在用户空间完成。