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
День добрый всем!
Проблема с модулем ядра.Есть такой код:
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 e
0 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" — такое ощущение, что ядро имеет что то против того, чтобы таблица системных вызовов была модифицирована.
Товарищи, помогите пожалуйста! Может начиная с этой версии ядра что то изменилось касаемо таблицы системных вызовов? Может теперь их вообще подменять нельзя?
Спасибо! Надеюсь на помощь.
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 область.
Здравствуйте, 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
ну и дальше то что в старте топика пишется сюда.
чтобы это значило... и куда дальше можно капнуть?
Здравствуйте, nasekomoe.
Насколько я помню, возможность подмены системных вызовов собирались убрать из ядра. Слышал я это года два назад. Может это оно?..
Здравствуйте, 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
Еще раз спасибо большое!