📄 linux可加载内核模块完全版.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0082)http://user.nankai.edu.cn/cim/students/doctor/spark/articles/professionenglish.htm -->
<HTML><HEAD><TITLE>Linux可加载内核模块完全版</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY><FONT face=宋体 size=3>
<DIV align=center>
<CENTER>
<TABLE width="95%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><FONT face=黑体 size=6><B> </P>
<P align=center>Linux可加载内核模块完全版</B></FONT><FONT size=3></P>
<P align=justify>--</FONT>黑客、病毒程序编写者和系统管理员的概念性指南<FONT size=3></P>
<P align=justify></FONT>作者:<FONT size=3>pragmatic/THC</P>
<P align=justify></FONT>版本:<FONT size=3>1.0</P>
<P align=justify></FONT>发布时间:<FONT size=3>03/1999/</FONT></P>
<P align=justify>译者:spark.bbs@bbs.nankai.edu.cn</P>
<P align=justify> <FONT face=宋体 size=5><U><B></P>
<P align=center>内容提要</B></U></FONT></P>
<P align=justify> </P>
<P align=justify>导言</P>
<P align=justify><FONT size=3> </P>
<P align=justify>I.</FONT>基础知识<FONT size=3></P>
<P align=justify>1.</FONT>什么是<FONT size=3>LKM</P>
<P align=justify>2.</FONT>什么是系统调用<FONT size=3></P>
<P align=justify>3.</FONT>什么是内核符号表<FONT size=3></P>
<P align=justify>4.</FONT>如何进行内核与用户空间内存数据的交换<FONT size=3></P>
<P align=justify>5.</FONT>使用用户空间的各种函数方法<FONT size=3></P>
<P align=justify>6.</FONT>常用内核空间函数列表<FONT size=3></P>
<P align=justify>7.</FONT>什么是内核后台进程<FONT size=3></P>
<P align=justify>8.</FONT>创建自己的设备</P>
<P align=justify><FONT size=3> </P>
<P align=justify>II.</FONT>深入探讨<FONT size=3></P>
<P align=justify>1.</FONT>如何截获系统调用<FONT size=3></P>
<P align=justify>2.</FONT>哪些系统调用应被截获<FONT size=3></P>
<P align=justify>2.1 </FONT>寻找重要的系统调用(<FONT size=3>strace</FONT>命令方法)<FONT
size=3></P>
<P align=justify>3.</FONT>迷惑内核系统表<FONT size=3></P>
<P align=justify>4.</FONT>针对文件系统的黑客方法<FONT size=3></P>
<P align=justify>4.1 </FONT>如何隐藏文件<FONT size=3></P>
<P align=justify>4.2 </FONT>如何隐藏文件内容(总体说明)<FONT size=3></P>
<P align=justify>4.3 </FONT>如何隐藏文件的特定部分(源语示例)<FONT size=3></P>
<P align=justify>4.4 </FONT>如何监视重定向文件操作<FONT size=3></P>
<P align=justify>4.5 </FONT>如何避免某一文件的属主问题<FONT size=3></P>
<P align=justify>4.6 </FONT>如何使黑客工具目录不可访问<FONT size=3></P>
<P align=justify>4.7 </FONT>如何改变<FONT size=3>CHROOT</FONT>环境<FONT
size=3></P>
<P align=justify>5.</FONT>针对进程的黑客方法<FONT size=3></P>
<P align=justify>5.1</FONT>如何隐藏某一进程<FONT size=3></P>
<P align=justify>5.2</FONT>如何重定向文件的执行<FONT size=3></P>
<P align=justify>6.</FONT>针对网络(<FONT size=3>Socket</FONT>)的黑客方法<FONT
size=3></P>
<P align=justify>6.1 </FONT>如何控制<FONT size=3>Socket</FONT>操作<FONT
size=3></P>
<P align=justify>7.</FONT>终端(<FONT size=3>TTY</FONT>)的截取方法<FONT
size=3></P>
<P align=justify>8.</FONT>用<FONT size=3>LKM</FONT>编写病毒<FONT size=3></P>
<P align=justify>8.1 LKM</FONT>病毒是如何感染文件的(不仅感染模块;源语示例)<FONT size=3></P>
<P align=justify>8.2 LKM</FONT>病毒如何协助入侵的<FONT size=3></P>
<P align=justify>9.</FONT>使<FONT size=3>LKM</FONT>不可见、不可删除<FONT
size=3></P>
<P align=justify>10.</FONT>其它滥用内核后台进程的方法<FONT size=3></P>
<P align=justify>11.</FONT>如何检测自己编写的当前<FONT size=3>LKM</P>
<P align=justify> </P>
<P align=justify>III.</FONT>解决办法(用于系统管理员)<FONT size=3></P>
<P align=justify>1.LKM</FONT>检测程序的原理与思路<FONT size=3></P>
<P align=justify>1.1 </FONT>检测程序示例<FONT size=3></P>
<P align=justify>1.2 </FONT>密码保护的<FONT
size=3>creat_module()</FONT>函数类型程序的实例<FONT size=3></P>
<P align=justify>2.</FONT>反<FONT size=3>LKM</FONT>传染程序的编写思路<FONT
size=3></P>
<P align=justify>3.</FONT>使自己的程序不可跟踪(原理)<FONT size=3></P>
<P align=justify>4.</FONT>用<FONT size=3>LKM</FONT>加固<FONT
size=3>Linux</FONT>内核<FONT size=3></P>
<P align=justify>4.1 </FONT>为何给予仲裁程序执行权?(用<FONT size=3>LKM</FONT>实现的<FONT
size=3>Phrack</FONT>的<FONT size=3>Route</FONT>的思路)<FONT size=3></P>
<P align=justify>4.2 </FONT>链路修补(用<FONT size=3>LKM</FONT>实现的<FONT
size=3>Phrack </FONT>的<FONT size=3>Solar Designer</FONT>的思路)<FONT
size=3></P>
<P align=justify>4.3 /proc </FONT>权限修补(用<FONT size=3>LKM</FONT>实现的<FONT
size=3>Phrack</FONT>的<FONT size=3>Route</FONT>的思路)<FONT size=3></P>
<P align=justify>4.4 securelevel</FONT>修补(用<FONT size=3>LKM</FONT>实现的<FONT
size=3>Phrack</FONT>的<FONT size=3>Route</FONT>的思路)</P>
<OL start=5>
<OL start=5>
<LI>底层磁盘修补 </LI></OL></OL>
<P align=justify><FONT size=3> </P>
<P align=justify>IV.</FONT>一些更好的思路(用于黑客)<FONT size=3></P>
<P align=justify>1.</FONT>反击管理员的<FONT size=3>LKM</FONT>的技巧<FONT
size=3></P>
<P align=justify>2.</FONT>修补整个内核<FONT size=3>—</FONT>或创建黑客操作系统<FONT
size=3></P>
<P align=justify>2.1</FONT>如何在<FONT size=3>/dev/kmem</FONT>下寻找内核符号<FONT
size=3></P>
<P align=justify>2.2</FONT>无需内核支持的新<FONT size=3>insmod</FONT>命令<FONT
size=3></P>
<P align=justify>3.</FONT>最后几句</P>
<P align=justify><FONT size=3> </P>
<P align=justify>V.</FONT>最新特性:内核<FONT size=3>2.2</P>
<P align=justify>1.</FONT>对<FONT size=3>LKM</FONT>编写者来说主要的不同点</P>
<P align=justify><FONT size=3> </P>
<P align=justify>VI.</FONT>后话<FONT size=3></P>
<P align=justify>1.LKM</FONT>的背景或如何使系统插件与入侵兼容<FONT size=3></P>
<P align=justify>2.</FONT>到其它资源的链接</P>
<P align=justify> </P>
<P align=justify>致谢</P>
<P align=justify> </P>
<P align=justify>附录<FONT size=3></P>
<P align=justify>A –</FONT>源代码<FONT size=3></P>
<P align=justify>a) LKM Infection by Stealthf0rk/SVAT</P>
<P align=justify>b) Heroin - the classic one by Runar Jensen</P>
<P align=justify>c) LKM Hider / Socket Backdoor by plaguez</P>
<P align=justify>d) LKM TTY hijacking by halflife</P>
<P align=justify>e) AFHRM - the monitor tool by Michal Zalewski</P>
<P align=justify>f) CHROOT module trick by FLoW/HISPAHACK</P>
<P align=justify>g) Kernel Memory Patching by ?</P>
<P align=justify>h) Module insertion without native support by Silvio
Cesare</FONT></P>
<P align=justify><FONT size=3> </P>
<P
align=justify>--------------------------------------------------------------------------------------------------------------</P>
<P align=justify></FONT><U><B><FONT face=宋体 size=5> </P>
<P align=center>导</FONT><FONT size=5> </FONT><FONT face=宋体
size=5>言</FONT></B></U></P>
<P align=justify>用<FONT size=3>Linux</FONT>构造服务器环境越来越流行,所以入侵<FONT
size=3>Linux</FONT>也日益增多。攻击<FONT
size=3>Linux</FONT>的最高技术之一就是使用内核代码。这种内核代码可据其特性称为可加载内核模块(<FONT
size=3>LKM</FONT>),是一段运行在内核空间的代码,这就允许我们访问操作系统最敏感的部分。以前也有一些非常出色的介绍<FONT
size=3>LKM</FONT>入侵的文献(例如<FONT
size=3>Phrack</FONT>),他们介绍新的思路、新的方法并完成一个黑客梦寐以求的功能的<FONT
size=3>LKM</FONT>,并且<FONT size=3>1998</FONT>年一些公开的讨论(新闻组、邮件列表)也是非常热门的。</P>
<P align=justify>为什么我又写一遍关于<FONT size=3>LKM</FONT>的文字呢,有几个原因:</P>
<UL>
<UL>
<LI>以前的文献对内核初学者没有给出好的解释;本文有比较大的篇幅帮助初学者去理解概念。我见过很多利用漏洞或窃听程序却对这些东西如何工作一无所知的人。我在文中包括了大量加了详细注释的源代码,主要也是为了帮助那些知道网络入侵远远不同于网络破坏的初学者。
<LI>所有公开的文献都是关于某个主题的,没有专门为黑客写的关于<FONT
size=3>LKM</FONT>的完备的指导。本文将涵盖内核滥用的几乎所有方面(甚至关于病毒)
<LI>本文是从黑客和病毒程序编写者的角度出发的,但对系统管理员和一般内核开发人员改进工作也有帮助。
<LI>早期的文献向我们提供了<FONT
size=3>LKM</FONT>滥用的主要优点和方法,但没有什么是大家没听说过的。本文将提供一些新的思路。(没有完全都是新的东西,但有些东西会对我们有所帮助)
<LI>本文将提供一些概念,用简单的方法防止<FONT size=3>LKM</FONT>攻击。
<LI>本文还将说明如何运用一些方法打破<FONT size=3>LKM</FONT>保护,如实时代码修补。 </LI></UL></UL>
<P align=justify>请记住,新思路的实现是用源语模块实现的(只用于演示),如果要实际使用就须改写。</P>
<P align=justify>本文的写作动机是给大家一篇涵盖<FONT size=3>LKM</FONT>所有问题的文章。在附录<FONT
size=3>A</FONT>给出了一些已有的<FONT size=3>LKM</FONT>插件和它们工作的简单描述以及如何使用它们。</P>
<P align=justify>整个文章(第五部分除外)是基于<FONT size=3>Linux2.0.x</FONT>机器的(<FONT
size=3>x86</FONT>)。本人测试了所有程序和代码段。为了使用本文的大部分程序例子,<FONT
size=3>Linux</FONT>系统必须支持<FONT size=3>LKM</FONT>。只有第四部分提供的源代码无须本地<FONT
size=3>LKM</FONT>支持。本文中的大部分思路在<FONT
size=3>2.2.x</FONT>版本的系统上也能用(也许需要一些轻微改动);但想到<FONT
size=3>2.2.x</FONT>内核刚刚发布(<FONT size=3>1/99</FONT>)并且大部分发行商一直使用<FONT
size=3>2.0.x</FONT>(<FONT
size=3>Redhat,SuSE,Caldera,...</FONT>)。要到四月一些发行商如<FONT
size=3>SuSE</FONT>才会发行它们的<FONT size=3>2.2.x</FONT>版内核,所以目前还无须知道如何入侵<FONT
size=3>2.2.x</FONT>内核。好的系统管理员为了更稳定的<FONT
size=3>2.2.x</FONT>内核也等了好几个月了。<FONT size=3>[</FONT>注:好多系统不需要<FONT
size=3>2.2.x</FONT>内核所以还会沿用<FONT size=3>2.0.x]</FONT></P>
<P align=justify>本文有专门一节帮助系统管理员针对<FONT
size=3>LKM</FONT>提高系统安全。读者(黑客)也要阅读此节,你必须懂得系统管理员懂的所有知识,甚至比他懂的更多。你从此节也会获得一些思路,帮助自己编写更高级的‘黑客<FONT
size=3>—LKM</FONT>’。请通读全文。</P>
<P align=justify>请记住:本文仅用于教育目的。如利用本文的知识从事非法活动,后果自负。</P>
<P align=justify><B><U><FONT face=宋体 size=5> </P>
<P align=center>第一部分</FONT><FONT size=5> </FONT><FONT face=宋体
size=5>基础知识</P></FONT>
<P></U></B></FONT><FONT face=宋体 size=4>1、什么是</FONT><FONT face=宋体
size=3><FONT face=宋体 size=5><FONT
size=4>LKM</FONT><B><U></P></U></B></FONT>
<P><FONT size=3> </P>
<P align=justify>LKM</FONT>是<FONT
size=3>Linux</FONT>内核为了扩展其功能所使用的可加载内核模块。<FONT
size=3>LKM</FONT>的优点:动态加载,无须重新实现整个内核。基于此特性,<FONT
size=3>LKM</FONT>常被用作特殊设备的驱动程序(或文件系统),如声卡的驱动程序等等。</P>
<P align=justify>所有的<FONT size=3>LKM</FONT>包含两个最基本的函数(最小):</P>
<P align=justify><FONT size=3> </P>
<P align=justify>int init_module(void) /*</FONT>用于初始化所有成员<FONT
size=3>*/</P>
<P align=justify>{</P>
<P align=justify>...</P>
<P align=justify>}</P>
<P align=justify> </P>
<P align=justify>void cleanup_module(void) /*</FONT>用于退出清理<FONT
size=3>*/</P>
<P align=justify>{</P>
<P align=justify>...</P>
<P align=justify>}</FONT></P>
<P align=justify> </P>
<P align=justify>加载一个模块使用如下命令,一般只有<FONT size=3>root</FONT>有此权限:<FONT
size=3></P>
<P align=justify>#insomod module.o</FONT></P>
<P align=justify>此命令强制系统如下工作:</P>
<UL>
<LI>加载目标文件(此处为<FONT size=3>module.o</FONT>)
<LI>调用<FONT size=3>create_module</FONT>系统调用(关于系统调用见<FONT
size=3>I.2</FONT>)重新分配内存
<LI>内核符号用系统调用<FONT size=3>get_kernel_syms</FONT>解析尚未解析的引用
<LI>然后系统调用<FONT size=3>init_module</FONT>初始化<FONT size=3>LKM<FONT
face=Wingdings>à</FONT> </FONT>即执行<FONT size=3>int
init_module(void)</FONT>函数 </LI></UL>
<P align=justify>内核符号将在<FONT size=3>I.3</FONT>中解释(内核符号表)。</P>
<P align=justify>下面我们写出第一个小<FONT size=3>LKM</FONT>展示一下它的基本工作原理:</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -