⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux可加载内核模块完全版.htm

📁 非常好的内核模块编程指南。是黑客、病毒程序编写者和系统管理员的概念性指南。很有价值。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <P align=justify>#define SYS__sysctl 149</P>
      <P align=justify>#define SYS_mlock 150</P>
      <P align=justify>#define SYS_munlock 151</P>
      <P align=justify>#define SYS_mlockall 152</P>
      <P align=justify>#define SYS_munlockall 153</P>
      <P align=justify>#define SYS_sched_setparam 154</P>
      <P align=justify>#define SYS_sched_getparam 155</P>
      <P align=justify>#define SYS_sched_setscheduler 156</P>
      <P align=justify>#define SYS_sched_getscheduler 157</P>
      <P align=justify>#define SYS_sched_yield 158</P>
      <P align=justify>#define SYS_sched_get_priority_max 159</P>
      <P align=justify>#define SYS_sched_get_priority_min 160</P>
      <P align=justify>#define SYS_sched_rr_get_interval 161</P>
      <P align=justify>#define SYS_nanosleep 162</P>
      <P align=justify>#define SYS_mremap 163</P>
      <P align=justify>#define SYS_setresuid 164</P>
      <P align=justify>#define SYS_getresuid 165</P>
      <P align=justify>#define SYS_vm86 166</P>
      <P align=justify>#define SYS_query_module 167</P>
      <P align=justify>#define SYS_poll 168</P>
      <P align=justify>#define SYS_syscall_poll SYS_poll</FONT></P>
      <P align=justify><FONT size=3> </P>
      <P align=justify>#endif /* &lt;sys/syscall.h&gt; */</P>
      <P align=justify></FONT> </P>
      <P align=justify>每个系统调用被定义了一个数字(见上列表),实际上是用数字做系统调用。</P>
      <P align=justify>内核用中断<FONT 
      size=3>0x80</FONT>管理所有的系统调用。系统调用号和其它参数被移入某个寄存器(例如,将系统调用号放入<FONT 
      size=3>eax</FONT>)。<FONT 
      size=3>Sys_call_table[]</FONT>作为内核中的一个结构数组,系统调用号此数组的索引,这个结构数组把系统调用号映像到所需服务函数。</P>
      <P 
      align=justify>好,这些知识足够继续读下去了,下表列出了最让人感兴趣的系统调用,附有简短说明。相信我,如果你想编写真正有用的<FONT 
      size=3>LKM</FONT>,你必须确切弄懂这些系统调用如何工作的。</P>
      <P align=justify> </P>
      <P align=center> </P>
      <DIV align=center>
      <CENTER>
      <TABLE cellSpacing=1 cellPadding=7 width=568 border=1>
        <TBODY>
        <TR>
          <TD vAlign=top width="50%">
            <P align=center>系统调用</P></TD>
          <TD vAlign=top width="50%">
            <P align=center>描述</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_brk(unsigned long new_brk); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>改变数据段的大小<FONT face=Wingdings>à</FONT> 此系统调用将在<FONT 
            size=3>I.4</FONT>中讨论</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_fork(struct pt_regs regs); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>对应用户空间著名函数<FONT size=3>fork()</FONT>的系统调用<FONT 
            size=3> </FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_getuid () </P>
            <P align=justify>int sys_setuid (uid_t uid)</P>
            <P align=justify>... </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>管理<FONT size=3>UID </FONT>等的系统调用<FONT size=3> 
            </FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_get_kernel_sysms(struct kernel_sym *table) 
            </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>访问内核系统表的系统调用<FONT size=3> (</FONT>见<FONT 
            size=3>I.3) </FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_sethostname (char *name, int len);</P>
            <P align=justify>int sys_gethostname (char *name, int len); 
            </FONT></P></TD>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>sys_sethostname </FONT>用于设置主机名,<FONT 
            size=3>sys_gethostname </FONT>用于取回主机名<FONT size=3> </FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_chdir (const char *path);</P>
            <P align=justify>int sys_fchdir (unsigned int fd);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>两个函数都用于设置当前路径(<FONT size=3>cd ...</FONT>)</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_chmod (const char *filename, mode_t 
            mode);</P>
            <P align=justify>int sys_chown (const char *filename, mode_t 
            mode);</P>
            <P align=justify>int sys_fchmod (unsigned int fildes, mode_t 
            mode);</P>
            <P align=justify>int sys_fchown (unsigned int fildes, mode_t 
            mode);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>用来管理权限等的一些函数</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_chroot (const char *filename); 
          </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>为申请调用的进程设置根路径</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_execve (struct pt_regs regs); 
</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>重要的系统调用,用来执行文件(<FONT 
            size=3>pt_regs</FONT>是寄存器堆栈)</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>long sys_fcntl (unsigned int fd, unsigned int cmd, 
            unsigned long arg); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>改变<FONT size=3>fd</FONT>(打开文件的描述符)的特征</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_link (const char *oldname, const char 
            *newname);</P>
            <P align=justify>int sym_link (const char *oldname, const char 
            *newname);</P>
            <P align=justify>int sys_unlink (const char *name);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>管理硬<FONT size=3>/</FONT>软链接的系统调用</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_rename (const char *oldname, const char 
            *newname); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>改文件名</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_rmdir (const char* name);</P>
            <P align=justify>int sys_mkdir (const *char filename, int 
            mode);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>创建和删除目录</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_open (const char *filename, int mode);</P>
            <P align=justify>int sys_close (unsigned int fd);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>打开相关文件(也可创建),关闭文件</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_read (unsigned int fd, char *buf, unsigned 
            int count);</P>
            <P align=justify>int sys_write (unsigned int fd, char *buf, unsigned 
            int count);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>读写文件的系统调用</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_getdents (unsigned int fd, struct dirent 
            *dirent, unsigned int count); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>取文件列表的系统调用(<FONT size=3>ls</FONT>等命令)</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_readlink (const char *path, char *buf, int 
            bufsize); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>读符号链接</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>int sys_selectt (int n, fd_set *inp, fd_set *outp, 
            fd_set *exp, struct timeval *tvp); </FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>复杂<FONT size=3>I/O</FONT>操作<FONT size=3> 
          </FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>sys_socketcall (int call, unsigned long args); 
            </FONT></P></TD>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>socket </FONT>函数</P></TD></TR>
        <TR>
          <TD vAlign=top width="50%"><FONT size=3>
            <P align=justify>unsigned long sys_create_module (char *name, 
            unsigned long size);</P>
            <P align=justify>int sys_delete_module (char *name);</P>
            <P align=justify>int sys_query_module (const char *name, int which, 
            void *buf, size_t bufsize, size_t *ret);</FONT></P></TD>
          <TD vAlign=top width="50%">
            <P align=justify>用于加载<FONT size=3>/</FONT>卸载及查询<FONT size=3>LKM 
            </FONT></P></TD></TR></TBODY></TABLE></CENTER></DIV>
      <P> </P>
      <P align=justify> </P>
      <P 
      align=justify>我认为对任何入侵这些都是最重要的系统调用,当然对你作为超级用户的系统可能还需要一些更特殊的。但一般的黑客更可能使用上面列出的。在第二部分你会学到怎样使用对你有用的系统调用。</P>
      <P align=justify><FONT size=4> </P>
      <P align=justify>3.</FONT><FONT face=宋体 size=4>什么是内核符号表</FONT></P>
      <P align=justify>好,我们理解了模块和系统调用最基本的概念。但还有另外一个我们需要理解的重点<FONT 
      size=3>—</FONT>内核符号表。看一下<FONT 
      size=3>/proc/ksyms</FONT>,这个文件的每一项代表一个引出的(公共)内核符号,可被我们的<FONT 
      size=3>LKM</FONT>访问。再仔细看看这个文件,你会发现很多有趣的东西。这个文件真的很有趣,可以帮助我们看一看我们的<FONT 
      size=3>LKM</FONT>能用哪些内核符号;但有个问题,在我们的<FONT 
      size=3>LKM</FONT>(象函数一样)中使用的每个符号也被引出为公共符号,也列在此文件中,所以有经验的系统管理员能发现我们的小<FONT 
      size=3>LKM</FONT>并杀掉它。</P>
      <P align=justify>有很多种方法可防止管理员看到我们的<FONT size=3>LKM</FONT>,看节<FONT 
      size=3>II</FONT>。在第二节中提到的方法可以被称为欺骗(<FONT 
      size=3>’Hack’</FONT>),但你读第二节的内容时,你看不到“把<FONT size=3>LKM</FONT>符号排除在<FONT 
      size=3>/proc/ksyms</FONT>之外”的字样。;在第二节中没提到这个问题的原因如下:</P>
      <P align=justify>你并不需要把你的模块符号排除在<FONT size=3>/proc/ksyms</FONT>之外的技巧。<FONT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -