📄 linux可加载内核模块完全版.htm
字号:
<P align=justify><FONT size=3> </P>
<P align=justify>#define MODULE</P>
<P align=justify>#include <Linux/module.h></P>
<P align=justify> </P>
<P align=justify>int init_module(void)</P>
<P align=justify>{</P>
<P align=justify>printk("<1>Hello World\n");</P>
<P align=justify>return 0;</P>
<P align=justify>}</P>
<P align=justify> </P>
<P align=justify>void cleanup_module(void)</P>
<P align=justify>{</P>
<P align=justify>printk("<1>Bye, Bye");</P>
<P align=justify>}</P>
<P align=justify></FONT> </P>
<P align=justify>你可能想知道为什么用<FONT size=3>printk(...)</FONT>而不是用<FONT
size=3>printf(...)</FONT>,是的,内核编程大体上是不同于用户空间编程的。你只有一个有限的命令集(见<FONT
size=3>I.6</FONT>)。用这些命令你不能做太多事,所以你将学到如何利用你所知的用户空间应用的大量函数去帮助你攻击内核。耐心一点,我们不得不做一些以前(没听过,没做过<FONT
size=3>...</FONT>)的一些事。</P>
<P align=justify>上例如下编译:<FONT size=3></P>
<P align=justify>#gcc –c –O3 helloworld.c</P>
<P align=justify>#insmod helloworld.o</FONT></P>
<P align=justify>好,我们的模块被加载了,并显示了最著名的文字。现在你可以用一些命令来告诉你你的<FONT
size=3>LKM</FONT>确实存在于内核空间了。<FONT size=3></P>
<P align=justify>#lsmod</P>
<P align=justify>Module Pages Used by</P>
<P align=justify>helloworld 1 0</FONT></P>
<P align=justify>此命令从<FONT
size=3>/proc/modules</FONT>下读取信息,显示当前哪些模块被加载。<FONT
size=3>’Pages’</FONT>是内存信息(此模块用了多少页);<FONT size=3>’Used
by’</FONT>栏目告之此模块被系统用了多少次(引用次数)。只有此栏目数值为<FONT
size=3>0</FONT>时,才能删除模块;检查此数值后,可用如下命令删除模块:<FONT size=3></P>
<P align=justify>#rmmod helloworld</FONT></P>
<P align=justify>好,这是我们朝着滥用<FONT size=3>LKM</FONT>走的第一小步(非常小)。本人经常把<FONT
size=3>LKM</FONT>同以前<FONT
size=3>DOS</FONT>下内存驻留程序进行对比(我知道,它们有很多不同),它们都是我们驻留在内存中截获每个我们想要的中断的一个门户。微软的<FONT
size=3>Win9x</FONT>有种程序叫<FONT size=3>VxD</FONT>的,也同<FONT
size=3>LKM</FONT>相似(当然也有很多不同)。这些驻留程序最令人感兴趣的部分是具有挂起系统函数的功能,这些系统函数在<FONT
size=3>Linux</FONT>世界里称为系统调用。</P>
<P></FONT><FONT face=宋体 size=4>2、什么是系统调用</FONT><FONT face=宋体 size=3></P>
<P> </P>
<P align=justify>我希望你能明白,每个操作系统都有一些嵌在内核中的函数,这些函数可以被系统的每个操作使用。</P>
<P align=justify>这些<FONT
size=3>Linux</FONT>使用的函数称为系统调用。它们对应用户和内核之间的转换。在用户空间打开一个文件对应内核空间的<FONT
size=3>sys_open</FONT>系统调用。要得到自己系统的完全的系统调用列表可以看<FONT
size=3>/usr/include/sys/syscall.h</FONT>文件。下面是我机器上的<FONT
size=3>syscall.h</FONT>列表:<FONT size=3></P>
<P align=justify>#ifndef _SYS_SYSCALL_H</P>
<P align=justify>#define _SYS_SYSCALL_H</P>
<P align=justify> </P>
<P align=justify>#define SYS_setup 0 /* </FONT>只用于初始化,使系统运行<FONT size=3>
</FONT>。<FONT size=3>*/</P>
<P align=justify>#define SYS_exit 1</P>
<P align=justify>#define SYS_fork 2</P>
<P align=justify>#define SYS_read 3</P>
<P align=justify>#define SYS_write 4</P>
<P align=justify>#define SYS_open 5</P>
<P align=justify>#define SYS_close 6</P>
<P align=justify>#define SYS_waitpid 7</P>
<P align=justify>#define SYS_creat 8</P>
<P align=justify>#define SYS_link 9</P>
<P align=justify>#define SYS_unlink 10</P>
<P align=justify>#define SYS_execve 11</P>
<P align=justify>#define SYS_chdir 12</P>
<P align=justify>#define SYS_time 13</P>
<P align=justify>#define SYS_prev_mknod 14</P>
<P align=justify>#define SYS_chmod 15</P>
<P align=justify>#define SYS_chown 16</P>
<P align=justify>#define SYS_break 17</P>
<P align=justify>#define SYS_oldstat 18</P>
<P align=justify>#define SYS_lseek 19</P>
<P align=justify>#define SYS_getpid 20</P>
<P align=justify>#define SYS_mount 21</P>
<P align=justify>#define SYS_umount 22</P>
<P align=justify>#define SYS_setuid 23</P>
<P align=justify>#define SYS_getuid 24</P>
<P align=justify>#define SYS_stime 25</P>
<P align=justify>#define SYS_ptrace 26</P>
<P align=justify>#define SYS_alarm 27</P>
<P align=justify>#define SYS_oldfstat 28</P>
<P align=justify>#define SYS_pause 29</P>
<P align=justify>#define SYS_utime 30</P>
<P align=justify>#define SYS_stty 31</P>
<P align=justify>#define SYS_gtty 32</P>
<P align=justify>#define SYS_access 33</P>
<P align=justify>#define SYS_nice 34</P>
<P align=justify>#define SYS_ftime 35</P>
<P align=justify>#define SYS_sync 36</P>
<P align=justify>#define SYS_kill 37</P>
<P align=justify>#define SYS_rename 38</P>
<P align=justify>#define SYS_mkdir 39</P>
<P align=justify>#define SYS_rmdir 40</P>
<P align=justify>#define SYS_dup 41</P>
<P align=justify>#define SYS_pipe 42</P>
<P align=justify>#define SYS_times 43</P>
<P align=justify>#define SYS_prof 44</P>
<P align=justify>#define SYS_brk 45</P>
<P align=justify>#define SYS_setgid 46</P>
<P align=justify>#define SYS_getgid 47</P>
<P align=justify>#define SYS_signal 48</P>
<P align=justify>#define SYS_geteuid 49</P>
<P align=justify>#define SYS_getegid 50</P>
<P align=justify>#define SYS_acct 51</P>
<P align=justify>#define SYS_phys 52</P>
<P align=justify>#define SYS_lock 53</P>
<P align=justify>#define SYS_ioctl 54</P>
<P align=justify>#define SYS_fcntl 55</P>
<P align=justify>#define SYS_mpx 56</P>
<P align=justify>#define SYS_setpgid 57</P>
<P align=justify>#define SYS_ulimit 58</P>
<P align=justify>#define SYS_oldolduname 59</P>
<P align=justify>#define SYS_umask 60</P>
<P align=justify>#define SYS_chroot 61</P>
<P align=justify>#define SYS_prev_ustat 62</P>
<P align=justify>#define SYS_dup2 63</P>
<P align=justify>#define SYS_getppid 64</P>
<P align=justify>#define SYS_getpgrp 65</P>
<P align=justify>#define SYS_setsid 66</P>
<P align=justify>#define SYS_sigaction 67</P>
<P align=justify>#define SYS_siggetmask 68</P>
<P align=justify>#define SYS_sigsetmask 69</P>
<P align=justify>#define SYS_setreuid 70</P>
<P align=justify>#define SYS_setregid 71</P>
<P align=justify>#define SYS_sigsuspend 72</P>
<P align=justify>#define SYS_sigpending 73</P>
<P align=justify>#define SYS_sethostname 74</P>
<P align=justify>#define SYS_setrlimit 75</P>
<P align=justify>#define SYS_getrlimit 76</P>
<P align=justify>#define SYS_getrusage 77</P>
<P align=justify>#define SYS_gettimeofday 78</P>
<P align=justify>#define SYS_settimeofday 79</P>
<P align=justify>#define SYS_getgroups 80</P>
<P align=justify>#define SYS_setgroups 81</P>
<P align=justify>#define SYS_select 82</P>
<P align=justify>#define SYS_symlink 83</P>
<P align=justify>#define SYS_oldlstat 84</P>
<P align=justify>#define SYS_readlink 85</P>
<P align=justify>#define SYS_uselib 86</P>
<P align=justify>#define SYS_swapon 87</P>
<P align=justify>#define SYS_reboot 88</P>
<P align=justify>#define SYS_readdir 89</P>
<P align=justify>#define SYS_mmap 90</P>
<P align=justify>#define SYS_munmap 91</P>
<P align=justify>#define SYS_truncate 92</P>
<P align=justify>#define SYS_ftruncate 93</P>
<P align=justify>#define SYS_fchmod 94</P>
<P align=justify>#define SYS_fchown 95</P>
<P align=justify>#define SYS_getpriority 96</P>
<P align=justify>#define SYS_setpriority 97</P>
<P align=justify>#define SYS_profil 98</P>
<P align=justify>#define SYS_statfs 99</P>
<P align=justify>#define SYS_fstatfs 100</P>
<P align=justify>#define SYS_ioperm 101</P>
<P align=justify>#define SYS_socketcall 102</P>
<P align=justify>#define SYS_klog 103</P>
<P align=justify>#define SYS_setitimer 104</P>
<P align=justify>#define SYS_getitimer 105</P>
<P align=justify>#define SYS_prev_stat 106</P>
<P align=justify>#define SYS_prev_lstat 107</P>
<P align=justify>#define SYS_prev_fstat 108</P>
<P align=justify>#define SYS_olduname 109</P>
<P align=justify>#define SYS_iopl 110</P>
<P align=justify>#define SYS_vhangup 111</P>
<P align=justify>#define SYS_idle 112</P>
<P align=justify>#define SYS_vm86old 113</P>
<P align=justify>#define SYS_wait4 114</P>
<P align=justify>#define SYS_swapoff 115</P>
<P align=justify>#define SYS_sysinfo 116</P>
<P align=justify>#define SYS_ipc 117</P>
<P align=justify>#define SYS_fsync 118</P>
<P align=justify>#define SYS_sigreturn 119</P>
<P align=justify>#define SYS_clone 120</P>
<P align=justify>#define SYS_setdomainname 121</P>
<P align=justify>#define SYS_uname 122</P>
<P align=justify>#define SYS_modify_ldt 123</P>
<P align=justify>#define SYS_adjtimex 124</P>
<P align=justify>#define SYS_mprotect 125</P>
<P align=justify>#define SYS_sigprocmask 126</P>
<P align=justify>#define SYS_create_module 127</P>
<P align=justify>#define SYS_init_module 128</P>
<P align=justify>#define SYS_delete_module 129</P>
<P align=justify>#define SYS_get_kernel_syms 130</P>
<P align=justify>#define SYS_quotactl 131</P>
<P align=justify>#define SYS_getpgid 132</P>
<P align=justify>#define SYS_fchdir 133</P>
<P align=justify>#define SYS_bdflush 134</P>
<P align=justify>#define SYS_sysfs 135</P>
<P align=justify>#define SYS_personality 136</P>
<P align=justify>#define SYS_afs_syscall 137 /* </FONT>用于<FONT
size=3>Andrew</FONT>文件系统的系统调用。<FONT size=3>*/</P>
<P align=justify>#define SYS_setfsuid 138</P>
<P align=justify>#define SYS_setfsgid 139</P>
<P align=justify>#define SYS__llseek 140</P>
<P align=justify>#define SYS_getdents 141</P>
<P align=justify>#define SYS__newselect 142</P>
<P align=justify>#define SYS_flock 143</P>
<P align=justify>#define SYS_syscall_flock SYS_flock</P>
<P align=justify>#define SYS_msync 144</P>
<P align=justify>#define SYS_readv 145</P>
<P align=justify>#define SYS_syscall_readv SYS_readv</P>
<P align=justify>#define SYS_writev 146</P>
<P align=justify>#define SYS_syscall_writev SYS_writev</P>
<P align=justify>#define SYS_getsid 147</P>
<P align=justify>#define SYS_fdatasync 148</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -