亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

OpenBSD 可加載內核模塊編程完全指南

2019-11-17 05:38:49
字體:
來源:轉載
供稿:網友

  緒論

這篇文章我說明在openbsd上如何進行內核編程,以下句子來自lkm手冊頁: "可加載內核模塊可以答應系統治理員在一臺運行著的系統上動態的增加或刪除功能模塊,它同時可以幫助軟件工程師們為內核增加新的功能而根本就不需要重起計算機就可以測試他們開發的程序."

當然,像眾多系統的lkm一樣,它存在一定的安全隱患,哈哈,其實這也是我寫這篇文章給大家的原因:)它提供了更廣泛的空間給惡意的superroot,其實也就是已經得到系統治理員權限的我們。我們利用lkm可以駕馭整個系統而不會輕易被發現. 同樣的, 假如你系統的securelevel在0級一行的話就不能加載或卸載模塊了,假如你要使系統在進入securemode之前可以加載模塊,可以編輯/etc/rc.securelevel文件,添加相應的入口.

總覽

/dev/lkm設備與用戶的交互通過ioctl(2)系列系統調用來進行. 主要是一些工具如modload,modunload和modstat等來控制模塊的加載

和卸載以及模塊的狀態.
lkm接口定義了五種不同的模塊類型:

系統調用模塊
虛擬文件系統模塊
設備驅動模塊
可執行程序解釋器模塊
其它模塊
一個普通的模塊包括三個主要部分:
1) 內核入口和出口的處理(也就是當模塊被加載,被卸載時的動作).

2) 一個外部入口點, 當模塊用modload程序被加載的時候需要用到

3) 模塊的主體, 包含函數代碼等.

對于其他類型的模塊來說,它需要開發人員提供嚴格的控制和當內核模塊卸載的時候對內核原有的狀態的保存.

對于模塊的支持必須用'option LKM'編譯進內核的配置文件.模塊需要支持默認的openBSD 2.9的內核.通常,內核空間的數據接口都被提供

給了模塊來操作.后面
就有一個lkm設備的例子.

每個類型的模塊的內部數據結構里面都存在一個宏用來加載自己.也就類似模塊本身模塊名的東東,它被指定在內核數據結構中,和模塊的一些

非凡數據如sysent這樣
的針對系統調用模塊的結構在一起.

讓我們看看一些例子吧.

★系統調用模塊.

這里我們將增加一個新的系統調用PRintf()的整型和字符串參數.它的原型如下:

int syscall(int, char *)

內核內部定義的一個lkm的syscall結構如下:
strUCt lkm_syscall {
MODTYPE lkm_type;
int lkm_ver;
char *lkm_name;
u_long lkm_offset; /* 保存/分配 內存空間 */
struct sysent *lkm_sysent;
struct sysent lkm_oldent; /*保存原調用,用于lkm的卸載 */
};

現在我們已經有了一個簡單的模塊框架了(應該叫LM_SYSCALL),lkm的版本,模塊名,都在系統調用表里存在一個相應的入口.這樣我們有

了一個指向結構sysent的模塊框架
我們將用MOD_SYSCALL宏來安裝它:

MOD_SYSCALL("ourcall", -1, &newcallent)

我們來分析一下上面的宏,很明顯,模塊名為"ourcall",用來標示模塊,還有一個作用就是我們利用modstat命令時會顯示出來.-1代表我們

的syscall該插入的位置,在這個
宏當中的-1的意思是我們不用關心位置具體在什么地方,它會被分配到一個空的位置.最后一個字段newcallent是一個指向sysent的結構,

它包含了我們系統調用的相應的數
據.
除此之外我們還需要一個句柄用來加載和卸載內核模塊,好,在這個例子中我用'hi'來加載,用'bye'來卸載.這對我們調試程序很有幫助.句柄可

以是相同的函數或者單個函數,
假如沒有定義句柄,那么lkm_nofunc()會簡單的返回0,這個模塊是沒有加載卸載的,也就失去了作用.

我們模塊的外部入口點是ourcall():

int

ourcall(lkmtp, cmd, ver)
struct lkm_table *lkmtp;
int cmd;
int ver;
{
DISPATCH(lkmtp, cmd, ver, ourcall_handler, ourcall_handler, lkm_nofunc)
}

這個句柄可以用來加載,卸載模塊.第四個參數我們用作加載操作,第五個參數用作卸載操作,第六個參數是狀態函數(在此例中沒有用到).
ok!完整的系統調用模塊代碼如下(syscall.c):

#include <sys/param.h>
#include <sys/systm.h>
#include <sys/ioctl.h>
#include <sys/cdefs.h>
#include <sys/conf.h>
#include <sys/mount.h>
#include <sys/exec.h>
#include <sys/lkm.h>
#include <sys/proc.h>
#include <sys/syscallargs.h>


/* 定義我們自己的系統調用原型 */
int newcall __P((struct proc *p, void *uap, int *retval));

/*
* 所有的系統調用都有三個參數: 一個指向proc結構的結構指針,一個空指針指向參
* 數本身和一個返回指針.下面,我們定義這些參數的結構.假如你只有一個參數,則
* 只需要一個入口就可以了.
*/

struct newcall_args{
syscallarg(int) value;
syscallarg(char *) msg;
};

/*
* 下面這個結構定義了我們的系統調用.第一個參數是系統調用的參數數目,第二個參數
* 是參數的大小,第三個參數是我們的系統調用的代碼了,呵呵:)
*/

static struct sysent newcallent = {
2, sizeof(struct newcall_args), newcall
};

/*
* 好了,到了我們的syscall的核心結構了,呵呵:)
* 第一個參數是syscall的名稱,ioctl()調用用它來查詢syscall.第二個參數告訴我們
* syscall的位置.這里你可以輸入數字,或者-1來讓系統自動分配.第三個參數指向一個
* sysent結構的指針.
*/

MOD_SYSCALL("ourcall", -1, &newcallent);

/*
* 要使我們的模塊正常運行我們還要用到以下函數.此函數類似linux的lkm里面的init_module
* 和cleanup_module.
* 它通過一個指向lkm_table結構的指針來完成我們給定的動作.檢查cmd的值來判定該加載
* 什么樣的句柄.當我們利用模塊來增加一個系統調用的時候,這兒沒有專門的句柄來操作.
* 當然,我們hacking kernel的時候是不會用例如"hi"和"bye"這樣的簡單的句柄的,我們
* 需要改變系統調用.我們現在是說明原理,其實大同小異:)
*/

static int
ourcall_handler(lkmtp, cmd)
struct lkm_table *lkmtp;
int cmd;
{
if (cmd == LKM_E_LOAD)
printf("hi!n");
else if (cmd == LKM_E_UNLOAD)
printf("bye!n");

return(0);
}

/*
* 下面就是我們模塊的外部入口點,也就是我們的系統調用的主體.
* 象上面那樣我們通過判定一個cmd所匹配的句柄來描述動作的執行.我們也可以通過一個版本號
* 答應一個模塊兼容以后版本內核的源碼,以保證向下的兼容性.
* DISPATCH宏通過三個參數來表示動作的加載,卸載和狀態.我們看下面例子,對于加載和卸載
* 我們用共享函數ourcall_handler().對于狀態(當增加系統調用的時候就用不到它了)我們
* 用lkm_nofunc(),該函數僅僅簡單的返回0.
*/

int
ourcall(lkmtp, cmd, ver)
struct lkm_table *lkmtp;
int cmd;
int ver;
{
DISPATCH(lkmtp, cmd, ver, ourcall_handler, ourcall_handler, lkm_nofunc)

}

/*
* 最后對于我們的系統調用應該有主體代碼,該調用干了什么之類.
*/

int
newcall(p, v, retval)
struct proc *p;
void *v;
int *retval;
{
struct newcall_args *uap = v;

printf("%d %sn", SCARG(uap, value), SCARG(uap, msg));
return(0);
}

ok!我們編譯安裝它:
# cc -D_KERNEL -I/sys -c syscall.c
# modload -o ourcall.o -e ourcall syscall.o
Module loaded as ID 0
#

-o參數指定輸出文件名,這和gcc的-o選項是一樣的.-e參數指定我們的外部標示,最后一個參數就是輸入文件.好,我們用modstat看看我們的

模塊有沒有被成功加載:
# modstat
Type Id Off Loadaddr Size Info Rev Module Name
SYSCALL 0 210 e0b92000 0002 e0b93008 2 ourcall
#

以上顯示需要注重一下'off'字段,它標示了該模塊在system call表里面的位置.這在創建系統調用的時候需要用到.我們可以通過dmesg命令

的輸出'hi'來驗證我們
的模塊正確的加載運行了:
# dmesg tail -2
hi!
DDB symbols added: 150060 bytes
#

好,現在讓我們來看一個測試我們剛才新的系統調用的簡單程序(calltest.c):
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产亚洲精品a区天堂华泰| 日韩欧美国产黄色| 国产日韩欧美自拍| 欧美国产日韩精品| 久久亚洲精品一区| 亚洲国产精品系列| 色先锋资源久久综合5566| 亚洲男人天堂2024| 亚洲欧洲日本专区| 国产mv久久久| 亚洲欧洲自拍偷拍| 亚洲bt欧美bt日本bt| 欧美精品videos性欧美| 亚洲网站在线播放| 国产精品视频白浆免费视频| 亚洲国产成人爱av在线播放| 亚洲天堂网在线观看| 91av免费观看91av精品在线| 日本精品免费观看| 在线观看久久久久久| 精品亚洲精品福利线在观看| 国产一区二区在线播放| 亚洲bt欧美bt日本bt| 97超级碰碰人国产在线观看| 欧美插天视频在线播放| 久久久免费高清电视剧观看| 色婷婷**av毛片一区| 欧美午夜电影在线| 在线a欧美视频| 97热在线精品视频在线观看| 深夜精品寂寞黄网站在线观看| 欧美福利视频在线观看| 精品国产福利在线| 日韩欧美精品中文字幕| 精品一区二区三区电影| 国产精品福利网站| 永久免费精品影视网站| 亚洲黄色www| 欧美精品久久一区二区| 欧美成年人网站| 麻豆精品精华液| 性亚洲最疯狂xxxx高清| 午夜精品久久久久久久99热浪潮| 激情av一区二区| 亚洲男人第一网站| 日韩中文综合网| 欧美国产日韩一区二区在线观看| 国产精品69精品一区二区三区| 亚洲欧洲在线视频| 91色视频在线观看| 国外成人在线视频| 亚洲女在线观看| 亚洲成人a级网| 狠狠色狠狠色综合日日小说| 91色中文字幕| 日韩高清中文字幕| 亚洲成人久久一区| 国产综合在线看| 国产精品老牛影院在线观看| 久久躁日日躁aaaaxxxx| 日韩精品有码在线观看| 国产欧美日韩专区发布| 国产性猛交xxxx免费看久久| 午夜精品久久17c| 亚洲日韩欧美视频一区| 亚洲第一区中文99精品| 日本久久91av| 日本高清+成人网在线观看| 91视频免费网站| 不卡av在线播放| 亚洲男女自偷自拍图片另类| 国产精品精品国产| 日本久久91av| 在线看日韩欧美| 国产日韩欧美日韩大片| 国产日韩在线观看av| 久久久久久久久久久久av| 久久综合国产精品台湾中文娱乐网| 国产精品视频最多的网站| 亚洲丝袜一区在线| 国产精彩精品视频| 午夜精品久久久久久久99黑人| 国产精品入口夜色视频大尺度| 欧美孕妇与黑人孕交| 国产精品欧美久久久| 国产网站欧美日韩免费精品在线观看| 国产精品久久久久久av| 综合网日日天干夜夜久久| 亚洲视频免费一区| 欧美性猛交xxxxx水多| 日韩在线精品视频| 97超碰蝌蚪网人人做人人爽| 国产精品视频一区二区高潮| 欧美三级xxx| 色综合久综合久久综合久鬼88| 亚洲精品国产拍免费91在线| 久久国产精彩视频| 97视频在线观看免费| 在线免费看av不卡| 精品一区二区三区三区| 九九综合九九综合| 日韩精品在线电影| www.亚洲人.com| 亚洲国产精品小视频| 欧美亚洲国产另类| 国产精品第10页| 在线亚洲男人天堂| 日韩中文字幕第一页| 中文字幕日韩在线视频| 亚洲国产99精品国自产| 中文字幕最新精品| 国产精品亚洲欧美导航| 国产午夜精品理论片a级探花| 国产日韩欧美日韩大片| 狠狠躁18三区二区一区| 久久伊人91精品综合网站| 亚洲xxx视频| 欧美高清视频一区二区| 欧美日韩综合视频网址| 91精品国产高清久久久久久| 国产日本欧美一区二区三区在线| 欧洲日本亚洲国产区| 91精品视频免费| 久久久久一本一区二区青青蜜月| 亚洲aⅴ男人的天堂在线观看| 欧美极品美女视频网站在线观看免费| 久久久久久国产精品三级玉女聊斋| 国产午夜精品免费一区二区三区| 中文字幕国产亚洲| 亚洲sss综合天堂久久| 欧美成人性生活| 美女久久久久久久久久久| 国产精品视频公开费视频| 97在线视频观看| 亚洲免费一在线| 国产一区二区三区三区在线观看| 欧美性生交大片免网| 欧美日本啪啪无遮挡网站| 欧美亚洲免费电影| 久久久精品免费| 国产在线播放91| 国产精品成人在线| 久久亚洲精品一区二区| 亚洲国模精品一区| 欧美国产精品va在线观看| 久久久久久久久国产| 欧美俄罗斯性视频| 国产精品www色诱视频| 欧美电影在线观看完整版| 国产一区二区三区免费视频| 亚洲欧美制服第一页| 国产成人精品免费久久久久| 日韩**中文字幕毛片| 91九色国产在线| 日韩成人在线播放| 精品久久久av| 亚洲精品福利在线| 欧美视频在线免费看| 8x拔播拔播x8国产精品| 久久精品久久精品亚洲人| 欧美一级电影免费在线观看| 色伦专区97中文字幕| 日韩av免费一区| 亚洲国产天堂久久综合网|