Re: Не могу подменить системный вызов
От: yowof  
Дата: 06.11.08 18:22
Оценка: 1 (1)
On Wed, 05 Nov 2008 12:09:22 GMT
"nasekomoe" <78294@users.rsdn.ru> wrote:

> День добрый всем!

> Проблема с модулем ядра.Есть такой код:
>

http://www.epanastasi.com/docs/syscall_talk/syscall-talk.html

> ......
Posted via RSDN NNTP Server 2.1 beta
Не могу подменить системный вызов
От: nasekomoe  
Дата: 05.11.08 12:09
Оценка:
День добрый всем!
Проблема с модулем ядра.Есть такой код:

original_call_clone = sys_call_table[__NR_clone];
sys_call_table[__NR_clone] = my_sys_clone;

Тоесть сохраняем у себя адрес оригинального системного вызова клонирования и подпихиваем в таблицу свою версию. Адрес таблицы вызовов берется из файла System.map.

Проблема в том, что этот код всегда работал (с тех пор как код стал рабочим я его не менял)... до тех пор пока я не обновил на днях свою убунту 8.04; что там обновилось — не просек (может ядро, может дрова какие то или патчи). Итак: данный код у меня теперь не работает на Убунте 8.04 с ядром 2.6.24-21. Пробовал на убунте 8.10 — то же самое.

Вот что dmesg выдает:
[ 1672.577687] ..................
[ 1672.577687] BUG: unable to handle kernel paging request at c0385a60
[ 1672.577797] IP: [<e08600e9>] roc_watcher_modroc_watcher_init+0xe9/0x10c
[ 1672.578784] *pde = 005c1067 *pte = 00385161
[ 1672.579543] Oops: 0003 1 SMP
[ 1672.579906] Modules linked in: proc_watcher_mod(+) isofs udf crc_itu_t binfmt_misc af_packet bridge stp bnep rfcomm sco l2cap bluetooth ppdev vmblock vmci vmmemctl speedstep_lib cpufreq_powersave cpufreq_userspace cpufreq_stats cpufreq_ondemand cpufreq_conservative freq_table video output sbs sbshc pci_slot wmi battery iptable_filter ip_tables x_tables vmhgfs lp loop ipv6 snd_ens1371 gameport snd_ac97_codec ac97_bus snd_pcm_oss snd_mixer_oss snd_pcm snd_seq_dummy parport_pc parport snd_seq_oss evdev snd_seq_midi snd_rawmidi snd_seq_midi_event snd_seq container psmouse serio_raw snd_timer snd_seq_device ac button snd pcspkr i2c_piix4 soundcore snd_page_alloc intel_agp i2c_core shpchp agpgart pci_hotplug ext3 jbd mbcache sd_mod crc_t10dif sr_mod cdrom sg pcnet32 mptspi mptscsih mii uhci_hcd mptbase scsi_transport_spi ata_piix ata_generic pata_acpi usbcore libata scsi_mod dock thermal processor fan fbcon tileblit font bitblit softcursor fuse vmxnet
[ 1672.580036]
[ 1672.580036] Pid: 5950, comm: insmod Not tainted (2.6.27-7-generic #1)
[ 1672.580036] EIP: 0060:[<e08600e9>] EFLAGS: 00010282 CPU: 0
[ 1672.580036] EIP is at proc_watcher_init+0xe9/0x10c [proc_watcher_mod]
[ 1672.580036] EAX: c01023c0 EBX: 00000000 ECX: e0c4c666 EDX: c0385880
[ 1672.580036] ESI: e0860000 EDI: 00000000 EBP: de7fff1c ESP: de7fff0c
[ 1672.580036] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
[ 1672.580036] Process insmod (pid: 5950, ti=de7fe000 task=dd4ebed0 task.ti=de7fe000)
[ 1672.580036] Stack: e0c4ce6c 00000001 e0c4fc04 00000000 de7fff8c c0101120 00000000 00000000
[ 1672.580036] 00000111 00000000 00000000 00000000 00000000 00000000 00000000 e0c5d064
[ 1672.580036] 0000001a e0c4da8c 00000000 00000000 c014c604 00000000 00000000 e0c4da80
[ 1672.580036] Call Trace:
[ 1672.580036] [<c0101120>] ? _stext+0x30/0x160
[ 1672.580036] [<c014c604>] ? __blocking_notifier_call_chain+0x14/0x70
[ 1672.580036] [<c015c208>] ? sys_init_module+0x88/0x1b0
[ 1672.580036] [<c01aff3f>] ? sys_close+0x7f/0xd0
[ 1672.580036] [<c0103f7b>] ? sysenter_do_call+0x12/0x2f
[ 1672.580036] =======================
[ 1672.580036] Code: 00 e8 dc c5 3e 00 a1 04 da c4 e0 e8 e2 c4 3e 00 8b 15 04 fc c4 e0 85 d2 89 15 08 fc c4 e0 74 15 8b 82 e0 01 00 00 a3 00 fc c4 e0 <c7> 82 e0 01 00 00 10 c3 c4 e0 89 d8 83 c4 0c 5b 5d c3 c7 04 24
[ 1672.580036] EIP: [<e08600e9>] proc_watcher_init+0xe9/0x10c [proc_watcher_mod] SS:ESP 0068:de7fff0c
[ 1672.580036] ---[ end trace 2b123145b19e26a4 ]---


"BUG: unable to handle kernel paging request at c0385a60" — такое ощущение, что ядро имеет что то против того, чтобы таблица системных вызовов была модифицирована.


Товарищи, помогите пожалуйста! Может начиная с этой версии ядра что то изменилось касаемо таблицы системных вызовов? Может теперь их вообще подменять нельзя?

Спасибо! Надеюсь на помощь.
Re: Не могу подменить системный вызов
От: MShura  
Дата: 05.11.08 14:27
Оценка:
N>original_call_clone = sys_call_table[__NR_clone];
N>sys_call_table[__NR_clone] = my_sys_clone;

N>Товарищи, помогите пожалуйста! Может начиная с этой версии ядра что то изменилось касаемо таблицы системных вызовов? Может теперь их вообще подменять нельзя?


N>Спасибо! Надеюсь на помощь.


Попробуй вывести флаг vma->vm_flags

struct vm_area_struct* vma = find_vma(current->mm, (unsigned long)sys_call_table );

с учетом:
#define VM_READ   0x00000001
#define VM_WRITE  0x00000002
#define VM_EXEC   0x00000004
#define VM_SHARED 0x00000008


Может это ro область.
Re[2]: Не могу подменить системный вызов
От: nasekomoe  
Дата: 06.11.08 09:18
Оценка:
Здравствуйте, MShura, Вы писали:

N>>original_call_clone = sys_call_table[__NR_clone];

N>>sys_call_table[__NR_clone] = my_sys_clone;

N>>Товарищи, помогите пожалуйста! Может начиная с этой версии ядра что то изменилось касаемо таблицы системных вызовов? Может теперь их вообще подменять нельзя?


N>>Спасибо! Надеюсь на помощь.


MS>Попробуй вывести флаг vma->vm_flags


MS>
MS>struct vm_area_struct* vma = find_vma(current->mm, (unsigned long)sys_call_table );

MS>с учетом:
MS>#define VM_READ   0x00000001
MS>#define VM_WRITE  0x00000002
MS>#define VM_EXEC   0x00000004
MS>#define VM_SHARED 0x00000008
MS>


MS>Может это ro область.

--------------------------------------------------
Спасибо за отклик! Попробовал.

Код следующий:

static char* sct_addr_str = "0x00000000";
static unsigned int sct_addr = 0;
module_param(sct_addr_str, charp, S_IRUGO);
static void** sys_call_table = 0;
asmlinkage int (*original_call_clone)(struct pt_regs regs);

static int __init
module_init(void)
{

      printk(KERN_ALERT "---proc_watcher: Parameter sct_add_str = %s\n", sct_addr_str);
      sscanf(sct_addr_str, "%lx", &sct_addr);
      printk(KERN_ALERT "---proc_watcher: System call table address: %#lx\n", sct_addr);

      sys_call_table = sct_addr;

      if (sct_addr != 0)
      {  
        original_call_clone = sys_call_table[__NR_clone];
    struct vm_area_struct* vma = find_vma(current->mm, (unsigned long)sys_call_table);
        if (!vma)
       printk(KERN_ALERT "---proc_watcher: sys_call_table = %#lx, VM not found\n", 
              sys_call_table);
    else
       printk(KERN_ALERT "---proc_watcher: sys_call_table = %#lx, VM flags: %#lx\n", 
              sys_call_table, vma->vm_flags);
        sys_call_table[__NR_clone] = my_sys_clone;
        printk(KERN_ALERT "---proc_watcher: Original systen call replaced\n");
      }
}


Вот dmesg:

[90311.829332] ---proc_watcher: Parameter sct_add_str = c0325500
[90311.829642] ---proc_watcher: System call table address: 0xc0325500
[90311.834184] ---proc_watcher: sys_call_table = 0xc0325500, VM not found
ну и дальше то что в старте топика пишется сюда.


чтобы это значило... и куда дальше можно капнуть?
Re: Не могу подменить системный вызов
От: artem_korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 06.11.08 12:45
Оценка:
Здравствуйте, nasekomoe.

Насколько я помню, возможность подмены системных вызовов собирались убрать из ядра. Слышал я это года два назад. Может это оно?..
С уважением, Artem Korneev.
Re[2]: Не могу подменить системный вызов
От: nasekomoe  
Дата: 06.11.08 12:54
Оценка:
Здравствуйте, artem_korneev, Вы писали:

_>Здравствуйте, nasekomoe.


_>Насколько я помню, возможность подмены системных вызовов собирались убрать из ядра. Слышал я это года два назад. Может это оно?..


Хм... айайай. Это было бы плохо.
Уже читаю change-логи
Спасибо за мысль!
Re[2]: Не могу подменить системный вызов
От: nasekomoe  
Дата: 07.11.08 12:15
Оценка:
Здравствуйте, yowof, Вы писали:

Y>On Wed, 05 Nov 2008 12:09:22 GMT

Y>"nasekomoe" <78294@users.rsdn.ru> wrote:

>> День добрый всем!

>> Проблема с модулем ядра.Есть такой код:
>>

Y>http://www.epanastasi.com/docs/syscall_talk/syscall-talk.html


>> ......



Спасибо! Все получилсоь. Точно как там и написано. Перед изменением таблицы надо эту память сделать rw.
Способ, который в статье сработал для ядра 2.6.24, для 2.6.27 немного подругому (API поменялся): set_memory_rw/set_memory_ro

Еще раз спасибо большое!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.