2009-10-19 49 views
0

我試圖通過sys_call_table的Linux內核2.6.18

extern void *sys_call_table[]; 
real_sys_exit = sys_call_table[__NR_exit] 
然而

設置SYS退出調用一個變量,當我嘗試做,控制檯給我的錯誤

error: ‘__NR_exit’ undeclared (first use in this function) 

任何提示,將不勝感激:)謝謝

回答

4

由於您在內核2.6.x中,sys_call_table不會再導出。 如果你想避免編譯錯誤試試這個包括

#include<linux/unistd.h> 

但是,它不會工作。所以工作圍繞「玩」與sys_call_table的是找到sys_call_table的在SystemXXXX.map用這個命令地址(位於/啓動):

grep sys_call System.map-2.6.X -i 

這會給ADDRES,那麼這段代碼應該允許您修改表:

unsigned long *sys_call_table; 
sys_call_table = (unsigned long *) simple_strtoul("0xc0318500",NULL,16); 


original_mkdir = sys_call_table[__NR_mkdir]; 
sys_call_table[__NR_mkdir] = mkdir_modificado; 

希望它爲你工作,我只是測試它在內核2.6.24,所以應該2.6.18

工作也檢查這裏,它是一個很好的 http://commons.oreilly.com/wiki/index.php/Network_Security_Tools/Modifying_and_Hacking_Security_Tools/Fun_with_Linux_Kernel_Modules

+1

...你爲什麼在靜態值上使用'strtoul'?爲什麼不使用文字'0xc0318500'?而且,這將在可重定位內核上失敗。 – bdonlan 2012-01-12 21:17:13

2

如果你還沒有包含文件syscall.h,你應該做的,在__NR_exit的引用之前。例如,

#include <syscall.h> 
#include <stdio.h> 

int main() 
{ 
    printf("%d\n", __NR_exit); 
    return 0; 
} 

返回:

$ cc t.c 
$ ./a.out 
60 

其他一些意見:

  1. 如果您已經包含的文件,通常的原因__NR_exit不會被定義爲該定義因條件編譯而被忽略(#ifdef#ifndef在某處工作)或因爲它在其他地方被刪除h a #undef

  2. 如果你正在編寫內核空間的代碼,你有一套完全不同的頭文件可供使用。 LXR(http://lxr.linux.no/linux)可搜索的,可瀏覽的內核源文件是一個有用的資源。

+0

我有,而且實際上由於某種原因,其實際上linux/syscalls.h在這個內核版本...... :(也許我錯了嗎? – hahuang65 2009-10-19 02:08:24

+0

對不起,沒有幫助的答案。我必須猜測很多關於您的編譯環境才能回答這個問題。例如,我仍然不知道:什麼版本的Linux內核,什麼編譯器版本,編譯器標誌,代碼是否用於交叉編譯,以及您是在編譯內核模塊還是用於用戶空間。你能提供有關你的項目的其他信息嗎? – 2009-10-19 15:33:39

+0

其Linux內核2.6.18 使用Makefile編譯(gcc不知道什麼版本) obj-m + = file.c 使內核模塊攔截系統調用。 我看了一下lxr,它列出了我的linux版本的一堆syscall.h,但是它是一個補丁內核,所以我可能只需要問我的教授。 我嘗試了一些來自lxr的頭文件,他們要麼丟失,要麼是錯誤的體系結構,要麼只是沒有工作。 – hahuang65 2009-10-19 17:59:36