URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3977
[ Назад ]

Исходное сообщение
"'ring 0' и Написание модуля ядра на C/C++"

Отправлено proglammer , 20-Фев-05 00:11 
Здравствуйте все.
я пытаюсь получить уровень 0 в линуксе на ассемблере,
но поскольку я ламер и не знаю английского - я не могу нормально понять доки по заражению елф(хочу заразить ядро без потери его функциональности).
мне советовали написать модуль к ядру - но я не знаток C/C++, сейчас понемногу изучаю.
боольшая просьба всем тем - у кого есть свободное время и знания C/C++ или Gnu_as - выложить здесь или скинуть на proglammer@inbox.ru код получения уровня 0 на асме(не под виндовс!), или код ЛЮБОГО модуля ядра(2.4-18.3) для линукса(ну пусть он хоть хелло выводит) который можно скомпилить gcc-2.96-110.

большая просьба - дайте код и всё. не надо писать "зайди на коденет.ру там все есть".
заранее ОХРЕНЕННОЕ спасибо всем кто сможет помочь.
и извиняюсь - но отвечать здесь кому либо смогу нескоро т.к. вкалываю грузчиком и времени ОЧЕНЬ мало.
в качестве платы за вашу щедрость моду дать поюзать мой hex - редактор, ом довольно сырой(пишу часика по два в день, когда не сплю и не работаю :) ).
вот он - leaker.narod.ru/hewr.rar

также буду благодарен всем кто даст ссылки на русские хелпы по ELF формату.


Содержание

Сообщения в этом обсуждении
"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 20-Фев-05 00:16 
господи... не "моду" а могу, и не "ом" а он.

"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Vadim , 20-Фев-05 13:51 
>господи... не "моду" а могу, и не "ом" а он.
Ага. А я ставлю пиво тому, кто мне объяснит, что такое ring0 в линуксе.

"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Murr , 20-Фев-05 17:37 
mymodule.c
--->
#define __KERNEL__
#define MODULE

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

static int mymodule_init() {
    printk("hello,world\n");
    return 0;
}

static void mymodule_done() {
}

module_init();
module_exit();

--->

gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c

--->

Если хочешь получить ассемблерный код, то замени "-c" на "-s". :)


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Murr , 20-Фев-05 17:38 
Пардон "-c" на "-S", конечно же.

"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 21-Фев-05 11:56 
gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c
выдает: "gcc: cannot specify -o with -c or -S and multiple compilations"
----------
gcc -I/lib/modules/`uname -r`/build mymodule.c -o mymodule.o -c
выдает:
In file included from mymodule.c:5:
/usr/include/linux/module.h:60: parse error before `atomic_t'
/usr/include/linux/module.h:60: warning: no semicolon at end of struct or union
/usr/include/linux/module.h:60: warning: no semicolon at end of struct or union
/usr/include/linux/module.h:62: parse error before `}'
/usr/include/linux/module.h:62: warning: data definition has no type or storage class
/usr/include/linux/module.h:91: parse error before `}'
----------
закомментил
union
{ atomic_t usecount;
  long pad;
} uc;
в module.h

gcc выдал:
/tmp/ccaA55N7.s: Assembler messages:
/tmp/ccaA55N7.s:38: Error: missing expression
/tmp/ccaA55N7.s:40: Error: missing expression

я так понял - у меня говеный glibc-kernheaders*rpm   ?
или что?


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Murr , 21-Фев-05 13:38 
>gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c

gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 21-Фев-05 16:09 
Спасибо! :) совсем отупел я от работы, пора увольнятся.
но тут загвоздка:
теперь
gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c
выдает:
/tmp/ccQKp19t.s: Assembler messages:
/tmp/ccQKp19t.s:38: Error: missing expression
/tmp/ccQKp19t.s:40: Error: missing expression
--------
я сделал так
gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -S
и исправил строчки 38/40
с     .set    init_module,
.globl cleanup_module
    .set    cleanup_module,

на    .set    init_module,0
.globl cleanup_module
    .set    cleanup_module,1
и попытался скомпилить
вот что выдал ld
ld: warning: cannot find entry symbol _start; defaulting to 08048074
a.out: In function `mymodule_init':
a.out(.text+0xf): undefined reference to `printk'

:(


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Lamr , 21-Фев-05 17:20 
>>gcc -I/lib/modules/`uname -r`/build include mymodule.c -o mymodule.o -c
>
>gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o mymodule.o -c

Чё, Murr, на пиво заработать решил?

:-))

ну-ну


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 22-Фев-05 16:48 
:) !!!!!
спасибо пиплы!
допер! радости полные штаны блин!!!!

всего-то
gcc -I/lib/modules/`uname -r`/build/include mymodule.c -o 0.s -S
-----------------------0.s:
.set    init_module,0
.globl cleanup_module
.set    cleanup_module,0
-----------------------
gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymodule.o -c

все работает - вот тока insmod выдает:
Warning: loading mymodule.o will taint the kernel: no license

как от этого избавится а?


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 22-Фев-05 18:21 
ну все! разобрался.
короче для всех ламеров вроде меня выкладываю сл. код:
файл mymod.c
------------------------------
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define DRIVER_AUTHOR "автор модуля"
#define DRIVER_DESC   "описание модуля"

static int __init init_fisrt_mod(void)
{
        printk(KERN_ALERT "Hello, world!\n");
        return 0;
}

static void __exit cleanup_fisrt_mod(void)
{
        printk(KERN_ALERT "Goodbye, world.\n");
}

module_init(init_fisrt_mod);
module_exit(cleanup_fisrt_mod);

MODULE_LICENSE("GPL");
/*
*эта хрень не дает insmod-у выводить:
Warning: loading mymodule.o will taint the kernel: no license
*/

а то что ниже я пока не пробовал
// MODULE_AUTHOR(DRIVER_AUTHOR);    /* Автор модуля */
// MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */
---------------------------------
чтобы это скомпилить должен быть установлен kernel-source*.rpm
компилить так:
gcc -I/lib/modules/`uname -r`/build/include mymod.c -o mymod.o -c
---------------------------------
а те кто в С/С++ ноль, а в асме крут - делают так:

gcc -I/lib/modules/`uname -r`/build/include mymod.c -o 0.s -S
#дальше редактируем файл 0.s:
#и компилим дальше
gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymod.o -c

блин ну и долго`ж я мудился....



"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Simps , 22-Фев-05 19:25 
>ну все! разобрался.
>короче для всех ламеров вроде меня выкладываю сл. код:
>файл mymod.c
>------------------------------
>#define __KERNEL__
>#define MODULE
>#include <linux/module.h>
>#include <linux/kernel.h>
>#include <linux/init.h>
>#define DRIVER_AUTHOR "автор модуля"
>#define DRIVER_DESC   "описание модуля"
>
>static int __init init_fisrt_mod(void)
>{
>        printk(KERN_ALERT "Hello, world!\n");
>        return 0;
>}
>
>static void __exit cleanup_fisrt_mod(void)
>{
>        printk(KERN_ALERT "Goodbye, world.\n");
>}
>
>module_init(init_fisrt_mod);
>module_exit(cleanup_fisrt_mod);
>
>MODULE_LICENSE("GPL");
>/*
>*эта хрень не дает insmod-у выводить:
>Warning: loading mymodule.o will taint the kernel: no license
>*/
>
>а то что ниже я пока не пробовал
>// MODULE_AUTHOR(DRIVER_AUTHOR);    /* Автор модуля */
>// MODULE_DESCRIPTION(DRIVER_DESC); /* Назначение модуля */
>---------------------------------
>чтобы это скомпилить должен быть установлен kernel-source*.rpm
>компилить так:
>gcc -I/lib/modules/`uname -r`/build/include mymod.c -o mymod.o -c
>---------------------------------
>а те кто в С/С++ ноль, а в асме крут - делают
>так:
>
>gcc -I/lib/modules/`uname -r`/build/include mymod.c -o 0.s -S
>#дальше редактируем файл 0.s:
>#и компилим дальше
>gcc -I/lib/modules/`uname -r`/build/include 0.s -o mymod.o -c
>
>блин ну и долго`ж я мудился....

Да ты уже гуру в вопросе написания модулей для ядра =)


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 24-Фев-05 21:19 
>Да ты уже гуру в вопросе написания модулей для ядра =)

:)

нее до гуру мне оччень далеко...
я в осносном asm мучаю, и вообщем еще один вопрос - как из модуля запустить программу.
я хотел через execve("/bin/prog");, execl и т.д. но во первых -
insmod выдает:
mymod.o: unresolved symbol execve
и во вторых ведь при execve код вызвавшегоо процесса перезапишется, а ето лажа...
ну а с fork-ом я конкретно обломался, как только вызвал - ядро повисло.
а попытавшись сделать execve через асм
pushl    $0x7672732f      #/srv - запускаемая прога
movl    %esp,%ebx
movl    $11,%eax
xorl    %ecx,%ecx
xorl    %edx,%edx
int    $0x80
опять обломался - ничего не произошло....


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Murr , 25-Фев-05 20:42 
>pushl $0x7672732f      #/srv - запускаемая прога

Строки должны быть 0-завершенные. В ядре используются ASCIIZ строки.

>movl %esp,%ebx
>movl $11,%eax
>xorl    %ecx,%ecx
>xorl    %edx,%edx
>int $0x80
>опять обломался - ничего не произошло....

В ядре нужно быть очень аккуратным при попытках из ядра делать вещи, завязанные на контекст текущего процесса/нити. К тому же, не забывай, что если ты дергаешь ядреные функции не напрямую, а через intx80, то ты тем самым портишь стек ядра (если ты сделаешь это из init функции, то модуль не завершит инициализацию).


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 26-Фев-05 20:05 
>В ядре нужно быть очень аккуратным при попытках из ядра делать вещи,
>завязанные на контекст текущего процесса/нити. К тому же, не забывай, что
>если ты дергаешь ядреные функции не напрямую, а через intx80, то
>ты тем самым портишь стек ядра (если ты сделаешь это из
>init функции, то модуль не завершит инициализацию).

а из какой функции это делать?("main(){}"?), как вызывать функции напрямую,
и как можно запустить прогу не испортив стек ядра?
хочется знать все и сразу. :)

ставлю виртуальную бутылку пива всем участникам беседы. :)


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено majordomo , 26-Фев-05 22:06 
>>В ядре нужно быть очень аккуратным при попытках из ядра делать вещи,
>>завязанные на контекст текущего процесса/нити. К тому же, не забывай, что
>>если ты дергаешь ядреные функции не напрямую, а через intx80, то
>>ты тем самым портишь стек ядра (если ты сделаешь это из
>>init функции, то модуль не завершит инициализацию).
>
>а из какой функции это делать?("main(){}"?), как вызывать функции напрямую,
>и как можно запустить прогу не испортив стек ядра?
>хочется знать все и сразу. :)
>
>ставлю виртуальную бутылку пива всем участникам беседы. :)


static void call(void* dummy){
    int rv;
    static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
    char *argv[] = { "/sbin/watchdog", NULL };
    rv = call_usermodehelper(argv[0],argv,envp,0);
// можно что-нибудь сделать с rv...
}

static DECLARE_WORK(work,call,0);

void func() // где-то внутри модуля
{
    schedule_work(&work);
}

static void __exit fini(void) // при выгрузке модуля
{
        flush_scheduled_work();
}

Код для 2.6, в 2.4 немного по-другому... В прошлом году мне на Lor подсказали, для iptables расширение писал, там и для 2.4 пример остался...


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 27-Фев-05 21:21 
>Код для 2.6, в 2.4 немного по-другому...
а у меня какраз 2.4-18.3
да и скомпилить не получилось :(
асм всетаки проще...
и в модуле всего 2-е функции чтоли?(__init и __exit)
я попробовал между ними " main(){ printk(KERN_ALERT "work.\n");} " вставить,
и ничего не вышло.
блин из меня программер как из горбачева балерина.
а "Lor" это что за форум? - я на lor.ru зашел так это сайт оториноларингологии! оказался :)


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено majordomo , 27-Фев-05 22:14 
>>Код для 2.6, в 2.4 немного по-другому...
>а у меня какраз 2.4-18.3
>да и скомпилить не получилось :(
>асм всетаки проще...
>и в модуле всего 2-е функции чтоли?(__init и __exit)
>я попробовал между ними " main(){ printk(KERN_ALERT "work.\n");} " вставить,
>и ничего не вышло.
>блин из меня программер как из горбачева балерина.
>а "Lor" это что за форум? - я на lor.ru зашел так
>это сайт оториноларингологии! оказался :)

1) Почитайте литературу по ядру линукса, хотя бы вот это:
http://jamesthornton.com/linux/lkmpg/

2) lor == linux.org.ru
Вот ссылка на нужный тред:
http://www.linux.org.ru/profile/majordomo//view-message.jsp?...
см. сообщение от idle 20.04.2004 18:09:13, да и вообще вес тред познавательный 8)


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Link , 27-Фев-05 22:38 
>блин из меня программер как из горбачева балерина.

Вы бы для начала почитали хоть какую-нить плохонькую теорию, представление получили, над чем вообще работаете. А то всё это сильно напоминает шаманские пляски с бубном под мухоморами.

Вот, например, замечательная книжка Морриса Баха,"Архитектура ОС UNIX"
http://coolsoft.ru/lib/unix.txt.tgz

( смотреть можно так: tar zxfO unix.txt.tgz | less )

И вообще, завязывайте с линухом возюкаться - это мода, впустую время потратите.
ИМХО
beastie.ru


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 27-Фев-05 23:19 
>1) Почитайте литературу по ядру линукса, хотя бы вот это:
>http://jamesthornton.com/linux/lkmpg/
я совершенно не знаю английского.
а на lor сходил - хелпов там куча, буду читать.

> И вообще, завязывайте с линухом возюкаться - это мода, впустую время
>потратите.
> ИМХО
>beastie.ru
книжку ессно скачал и буду читать.
а про linux/unix споров много - на вкус и цвет товарищей нет.


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено majordomo , 28-Фев-05 00:10 
>>1) Почитайте литературу по ядру линукса, хотя бы вот это:
>>http://jamesthornton.com/linux/lkmpg/
>я совершенно не знаю английского.

Это не кошерно. Самые интересные доки как обычно не на русском 8)

Посмотрите еще вот это:
http://www.opennet.me/openforum/vsluhforumID3/4560.html


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено proglammer , 28-Фев-05 12:44 
>Посмотрите еще вот это:
>http://www.opennet.me/openforum/vsluhforumID3/4560.html

:)
а вот по русски - это дело! буду читать ессно!
Спасиба всем! а именно Murr-у majordomo и Link-у!


"'ring 0' и Написание модуля ядра на C/C++"
Отправлено Murr , 25-Фев-05 20:31 
> Чё, Murr, на пиво заработать решил?
>
> :-))
>
> ну-ну


На пиво мне в отличие от некоторых и зарплаты хватает.
Насчет того кода - руки решил размять.