трюки в модулях ядра

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

трюки в модулях ядра

Непрочитанное сообщение Olej » 29 июн 2022, 19:43

Чтение-запись файлов непосредственно из модуля ядра.
Всё так же как в рукописи книги практикум по Linux Kernel (там все объяснения).
Только это работает в ядре 5.4, как минимум ... нужно проверить и расширить на 5.10-5.15
Вложения
file.265.tgz
(15.18 КБ) 37 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: трюки в модулях ядра

Непрочитанное сообщение Olej » 29 июн 2022, 19:45

Olej писал(а):
29 июн 2022, 19:43
Всё так же как в рукописи книги практикум по Linux Kernel (там все объяснения).
Посылка сигналов UNIX - из модуля ядра ... через модуль ядра, транзитом ... и т.д.
Опять же - всё как в рукописи книги 2015 года ... но всё работающее.
Вложения
signal.265.tgz
(7.34 КБ) 37 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: трюки в модулях ядра

Непрочитанное сообщение Olej » 29 июн 2022, 20:05

Olej писал(а):
29 июн 2022, 19:43
Всё так же как в рукописи книги практикум по Linux Kernel (там все объяснения).
Запуск новых пользовательских процессов из модуля ядра...
Вложения
exec.265.tgz
(4.9 КБ) 35 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: трюки в модулях ядра

Непрочитанное сообщение Olej » 30 июн 2022, 08:46

Экспортируемые символы ядра...
Вас учили что вы в модуле можете использовать (вызывать) только экспортируемые символы ядра?
На самом деле - "слухи сильно преувеличены" :lol:
Вы можете вызывать любые функции API ядра и обращаться к любым структурам ядра!
Ограничения на экспорт введены для вашей же безовасности, но их можно обходить, если с большой осторожностью и понимая что делаешь...
Вот как находится "самое сокровенное" :lol: : таблица системных вызовов и первые 10 системных вызова в ней - 3 разных способа:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ sudo insmod mod_rct.ko
[sudo] пароль для olej:       
insmod: ERROR: could not insert module mod_rct.ko: Operation not permitted


olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ dmesg | tail -n7
[48698.857446] + openning file: /proc/kallsyms
[48698.857457] + op. table => 0000000000000000
[48699.237192] + ffffffffadc013c0 R sys_call_table
[48699.237193] + ffffffffadc013c0
[48699.237194] + sys_call_table address = ffffffffadc013c0
[48699.237196] + sys_call_table : ffffffffacecdf00 ffffffffacece020 ffffffffacec9bd0 ffffffffacec7c80 ffffffffaced2fe0 ffffffffaced3200 ffffffffaced30a0 ffffffffacee6ed0 ffffffffacecb820 ffffffffacc36820  ...
[48699.237197] + close file: /proc/kallsyms

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ sudo insmod mod_kct.ko
insmod: ERROR: could not insert module mod_kct.ko: Operation not permitted

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ dmesg | tail -n2
[51798.589498] + sys_call_table address = ffffffffadc013c0
[51798.589502] + sys_call_table : ffffffffacecdf00 ffffffffacece020 ffffffffacec9bd0 ffffffffacec7c80 ffffffffaced2fe0 ffffffffaced3200 ffffffffaced30a0 ffffffffacee6ed0 ffffffffacecb820 ffffffffacc36820  ...

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ sudo insmod mod_koes.ko
insmod: ERROR: could not insert module mod_koes.ko: Operation not permitted

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ dmesg | tail -n2
[52386.678370] + find in position 51990
[52386.678375] + sys_call_table : ffffffffacecdf00 ffffffffacece020 ffffffffacec9bd0 ffffffffacec7c80 ffffffffaced2fe0 ffffffffaced3200 ffffffffaced30a0 ffffffffacee6ed0 ffffffffacecb820 ffffffffacc36820  ...
И проверочка:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ head -n13 /usr/include/x86_64-linux-gnu/asm/unistd_64.h
#ifndef _ASM_X86_UNISTD_64_H
#define _ASM_X86_UNISTD_64_H 1

#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ sudo grep 'ffffffffacecdf00\|ffffffffacece020\|ffffffffacec9bd0\|ffffffffacec7c80\|ffffffffaced2fe0\|ffffffffaced3200\|ffffffffaced30a0\|ffffffffacee6ed0\|ffffffffacecb820\|ffffffffacc36820' /proc//kallsyms 
ffffffffacc36820 T __x64_sys_mmap
ffffffffacec7c80 T __x64_sys_close
ffffffffacec9bd0 T __x64_sys_open
ffffffffacecb820 T __x64_sys_lseek
ffffffffacecdf00 T __x64_sys_read
ffffffffacece020 T __x64_sys_write
ffffffffaced2fe0 T __x64_sys_newstat
ffffffffaced30a0 T __x64_sys_newlstat
ffffffffaced3200 T __x64_sys_newfstat
ffffffffacee6ed0 T __x64_sys_poll
Вложения
call_table.265.tgz
(15.54 КБ) 32 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: трюки в модулях ядра

Непрочитанное сообщение Olej » 02 июл 2022, 15:15

Olej писал(а):
30 июн 2022, 08:46
Экспортируемые символы ядра...
Вас учили что вы в модуле можете
Это место очень интересно!
Потому что в разных дистрибутивах-сборках всё относительно имён: kallsyms_lookup, kallsyms_on_each_symbol и sys_call_table - радикально отличается, "как небо и земля" ... в отношении экспортируемости, определённости в ядре и т.д., в зависимости от CONFIG_* параметров с которыми собиралось ядро!
Для тестирования специально сделал скрипт посмотреть:

Код: Выделить всё

#!/bin/bash

sudo uname -a
inxi -SCxxx

cat /lib/modules/`uname -r`/build/.config | grep "CONFIG_X86_64=\|CONFIG_64BIT=\|CONFIG_X86_32=\|CONFI
cat /boot/config-`uname -r` | grep "CONFIG_X86_64=\|CONFIG_64BIT=\|CONFIG_X86_32=\|CONFIG_64BIT="

cat /lib/modules/`uname -r`/build/.config | grep CONFIG_ARM=
cat /boot/config-`uname -r` | grep CONFIG_ARM=

cat /lib/modules/`uname -r`/build/.config | grep CONFIG_KALLSYMS
#sudo cat /proc/kallsyms | grep ' T ' | grep kallsyms_on_each_symbol
sudo grep ' T ' /proc/kallsyms | grep kallsyms_on_each_symbol
#sudo cat /proc/kallsyms | grep ' T ' | grep kallsyms_lookup
sudo grep ' T ' /proc/kallsyms | grep kallsyms_lookup

sudo grep 'sys_call_table' /proc/kallsyms

cat /lib/modules/`uname -r`/build/Module.symvers | grep 'printk' | head -n3
cat /lib/modules/`uname -r`/build/Module.symvers | grep kallsyms_lookup | head -n3
cat /lib/modules/`uname -r`/build/Module.symvers | grep kallsyms_on_each_symbol | head -n3
Вложения
test_distr.sh
(967 байт) 33 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: трюки в модулях ядра

Непрочитанное сообщение Olej » 02 июл 2022, 15:21

Olej писал(а):
02 июл 2022, 15:15
Для тестирования специально сделал скрипт посмотреть:
Смотрим:
- Mint 20.3, 64-бит, ядро 5.4.0:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table$ ./test_distr
[sudo] пароль для olej:       
Linux R420 5.4.0-121-generic #137-Ubuntu SMP Wed Jun 15 13:33:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
System:    Host: R420 Kernel: 5.4.0-121-generic x86_64 bits: 64 compiler: gcc v: 9.4.0 Desktop: Cinnamon 5.2.7 
           wm: muffin 5.2.1 dm: LightDM 1.30.0 Distro: Linux Mint 20.3 Una base: Ubuntu 20.04 focal 
CPU:       Topology: 2x 10-Core model: Intel Xeon E5-2470 v2 bits: 64 type: MT MCP SMP arch: Ivy Bridge rev: 4 
           L2 cache: 50.0 MiB 
           flags: avx lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx bogomips: 192090 
           Speed: 1202 MHz min/max: 1200/3200 MHz Core speeds (MHz): 1: 1693 2: 1202 3: 1965 4: 1893 5: 1511 6: 1596 7: 1522 
           8: 1705 9: 1591 10: 1670 11: 1643 12: 1205 13: 1958 14: 2435 15: 1201 16: 1747 17: 1200 18: 1596 19: 1212 20: 2350 
           21: 1212 22: 1899 23: 1200 24: 1237 25: 1576 26: 1336 27: 2494 28: 1380 29: 2445 30: 1292 31: 2645 32: 1210 
           33: 2405 34: 1247 35: 1570 36: 1297 37: 1757 38: 1287 39: 2374 40: 1510 
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
ffffffffb8947de0 T module_kallsyms_on_each_symbol
ffffffffb89482d0 T kallsyms_on_each_symbol
ffffffffb8947d50 T module_kallsyms_lookup_name
ffffffffb89483a0 T kallsyms_lookup_name
ffffffffb8948460 T kallsyms_lookup_size_offset
ffffffffb8948530 T kallsyms_lookup
ffffffffb98002a0 R x32_sys_call_table
ffffffffb98013c0 R sys_call_table
ffffffffb9802400 R ia32_sys_call_table
0xae2d4d20	__ftrace_vprintk	vmlinux	EXPORT_SYMBOL_GPL	
0x82797823	ibdev_printk	drivers/infiniband/core/ib_core	EXPORT_SYMBOL	
0x3ec14617	sdev_prefix_printk	vmlinux	EXPORT_SYMBOL	
0xe007de41	kallsyms_lookup_name	vmlinux	EXPORT_SYMBOL_GPL	
0x6d1d3389	kallsyms_on_each_symbol	vmlinux	EXPORT_SYMBOL_GPL	
- LMDE 5 (Debian 11.2), 32-бит, ядро 5.10.0:

Код: Выделить всё

olej@lmde32:~/kernel/sys_call_table$ ./test_distr
Linux lmde32 5.10.0-15-686 #1 SMP Debian 5.10.120-1 (2022-06-09) i686 GNU/Linux
System:    Host: lmde32 Kernel: 5.10.0-15-686 i686 bits: 32 compiler: gcc v: 10.2.1 Desktop: Cinnamon 5.2.7 
           tk: GTK 3.24.24 wm: muffin 5.2.1 dm: LightDM 1.26.0 Distro: LMDE 5 Elsie base: Debian 11.2 bullseye 
CPU:       Info: Single Core model: Intel Xeon E5-2470 v2 bits: 32 type: MCP arch: Ivy Bridge rev: 4 L2 cache: 25 MiB 
           flags: avx sse sse2 sse3 sse4_1 sse4_2 ssse3 bogomips: 4771 
           Speed: 2386 MHz min/max: N/A Core speed (MHz): 1: 2386 
CONFIG_X86_32=y
CONFIG_X86_32=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_KALLSYMS_BASE_RELATIVE=y
c510ab80 T module_kallsyms_on_each_symbol
c510b370 T kallsyms_on_each_symbol
c510aaf0 T module_kallsyms_lookup_name
c510b2d0 T kallsyms_lookup_name
c510b430 T kallsyms_lookup_size_offset
c510b4f0 T kallsyms_lookup
0xae2d4d20	__ftrace_vprintk	vmlinux	EXPORT_SYMBOL_GPL	
0x835247b1	trace_array_init_printk	vmlinux	EXPORT_SYMBOL_GPL	
0xec6a6d91	netdev_printk	vmlinux	EXPORT_SYMBOL	
- LMDE 5 (Debian 11.2), 64-бит, ядро 5.10.0:

Код: Выделить всё

olej@lmde64:~/kernel/sys_call_table$ ./test_distr
[sudo] пароль для olej:       
Linux lmde64 5.10.0-15-amd64 #1 SMP Debian 5.10.120-1 (2022-06-09) x86_64 GNU/Linux
System:    Host: lmde64 Kernel: 5.10.0-15-amd64 x86_64 bits: 64 compiler: gcc v: 10.2.1 Desktop: Cinnamon 5.2.7 
           tk: GTK 3.24.24 wm: muffin 5.2.1 dm: LightDM 1.26.0 Distro: LMDE 5 Elsie base: Debian 11.2 bullseye 
CPU:       Info: Single Core model: Intel Xeon E5-2470 v2 bits: 64 type: MCP arch: Ivy Bridge rev: 4 
           L2 cache: 25 MiB 
           flags: avx lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 bogomips: 4771 
           Speed: 2386 MHz min/max: N/A Core speed (MHz): 1: 2386 
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
ffffffffb3b38f20 T module_kallsyms_on_each_symbol
ffffffffb3b397d0 T kallsyms_on_each_symbol
ffffffffb3b38e90 T module_kallsyms_lookup_name
ffffffffb3b39720 T kallsyms_lookup_name
ffffffffb3b39890 T kallsyms_lookup_size_offset
ffffffffb3b39960 T kallsyms_lookup
ffffffffb48002e0 D sys_call_table
ffffffffb4801360 D ia32_sys_call_table
ffffffffb4802180 D x32_sys_call_table
0xae2d4d20	__ftrace_vprintk	vmlinux	EXPORT_SYMBOL_GPL	
0x94bd4dff	trace_array_init_printk	vmlinux	EXPORT_SYMBOL_GPL	
0x068f8d82	netdev_printk	vmlinux	EXPORT_SYMBOL	
- Astra Linux, 64-бит, ядро 4.19:

Код: Выделить всё

olej@astra:~/2022/kernel/sys_call_table$ ./test_distr
[sudo] пароль для olej: 
Linux astra 4.19.0-1-generic #astra1 SMP Wed Mar 20 12:59:21 UTC 2019 x86_64 GNU/Linux
System:    Host: astra Kernel: 4.19.0-1-generic x86_64 (64 bit gcc: 6.3.0) Desktop: N/A dm: N/A
           Distro: Astra Linux (Orel 2.12.43)
CPU:       Single core Intel Xeon E5-2470 v2 (-MCP-) cache: 25600 KB
           flags: (lm nx sse sse2 sse3 sse4_1 sse4_2 ssse3) bmips: 4762 speed: 2381 MHz (max)
CONFIG_64BIT=y
CONFIG_X86_64=y
cat: /boot/config-4.19.0-1-generic: Нет такого файла или каталога
cat: /boot/config-4.19.0-1-generic: Нет такого файла или каталога
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
ffffffff9d53acc0 T module_kallsyms_on_each_symbol
ffffffff9d53b570 T kallsyms_on_each_symbol
ffffffff9d53ac30 T module_kallsyms_lookup_name
ffffffff9d53b640 T kallsyms_lookup_name
ffffffff9d53b700 T kallsyms_lookup_size_offset
ffffffff9d53b7d0 T kallsyms_lookup
ffffffff9e2001c0 R sys_call_table
ffffffff9e2015a0 R ia32_sys_call_table
0x00000000	__ftrace_vprintk	vmlinux	EXPORT_SYMBOL
0x00000000	sdev_prefix_printk	vmlinux	EXPORT_SYMBOL
0x00000000	netdev_printk	vmlinux	EXPORT_SYMBOL
0x00000000	kallsyms_lookup_name	vmlinux	EXPORT_SYMBOL
0x00000000	kallsyms_on_each_symbol	vmlinux	EXPORT_SYMBOL
- RaspberryPi, Raspbian, 32-бит, ядро 5.15.32:

Код: Выделить всё

olej@raspberrypi:~/kernel/examples/sys_call_table $ ./test_distr
Linux raspberrypi 5.15.32-v7+ #1538 SMP Thu Mar 31 19:38:48 BST 2022 armv7l GNU/Linux
System:    Host: raspberrypi Kernel: 5.15.32-v7+ armv7l bits: 32 compiler: gcc v: 10.2.1 
           Console: tty 5 DM: LightDM 1.26.0 Distro: Raspbian GNU/Linux 11 (bullseye) 
CPU:       Info: Quad Core model: ARMv7 v7l variant: cortex-a7 bits: 32 type: MCP arch: v7l 
           rev: 5 
           features: Use -f option to see features bogomips: 256 
           Speed: 1000 MHz min/max: 600/1000 MHz Core speeds (MHz): 1: 1000 2: 1000 3: 1000 
           4: 1000 
cat: /boot/config-5.15.32-v7+: Нет такого файла или каталога
CONFIG_ARM=y
cat: /boot/config-5.15.32-v7+: Нет такого файла или каталога
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
801cdf24 T module_kallsyms_lookup_name
801ce8ac T kallsyms_lookup_name
801ce96c T kallsyms_lookup_size_offset
801cea28 T kallsyms_lookup
80100244 T sys_call_table
0x92997ed8	_printk	vmlinux	EXPORT_SYMBOL	
0x7e3bdecd	__ftrace_vprintk	vmlinux	EXPORT_SYMBOL_GPL	
0xc6be525a	trace_array_init_printk	vmlinux	EXPORT_SYMBOL_GPL	
- OrangePi One, Armbian, 32-бит, ядро 5.15.48:

Код: Выделить всё

olej@orangepione:~/kernel/examples/sys_call_table$ ./test_distr
[sudo] пароль для olej: 
Linux orangepione 5.15.48-sunxi #22.05.3 SMP Wed Jun 22 07:35:10 UTC 2022 armv7l GNU/Linux
System:    Host: orangepione Kernel: 5.15.48-sunxi armv7l bits: 32 compiler: N/A Console: tty 4 
           dm: LightDM 1.26.0 Distro: Armbian GNU/Linux 10 (buster) 
CPU:       Topology: Quad Core model: ARMv7 v7l variant: cortex-a7 bits: 32 type: MCP arch: v7l 
           rev: 5 
           features: Use -f option to see features bogomips: 0 
           Speed: 1008 MHz min/max: 480/1008 MHz Core speeds (MHz): 1: 1008 2: 1008 3: 1008 
           4: 1008 
CONFIG_ARM=y
CONFIG_ARM=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_KALLSYMS_BASE_RELATIVE=y
c0197a7c T module_kallsyms_lookup_name
c0198148 T kallsyms_lookup_name
c01981c8 T kallsyms_lookup_size_offset
c0198254 T kallsyms_lookup
c01002a4 T sys_call_table
0x00000000	_printk	vmlinux	EXPORT_SYMBOL	
0x00000000	__ftrace_vprintk	vmlinux	EXPORT_SYMBOL_GPL	
0x00000000	trace_array_init_printk	vmlinux	EXPORT_SYMBOL_GPL	

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей