2013-12-18 137 views
2

我正在使用Jprobe來監視內核函數,最終目標是在某些情況下暫停函數。我得到了Jprobe沒有問題,我暫停功能。暫停Linux內核函數

目前我試圖暫停pid,由於進程暫停,但內核函數不會暫停,因此pid失敗。它仍然完成了我不想要的工作。

我最大的希望就是劫持內核函數,這樣我就可以對函數做任何我喜歡的事情。我發現了一些關於這方面的文章,但其中大多數都過時了,內核在2.6之後發生了很大變化。我知道我應該找到函數的地址,並將第一部分字節更改爲跳到我的新函數。我有問題找到這個地址。有人知道怎麼做嗎?還是有另一種更簡單的方法來暫停功能?

編輯:我試圖使用從System.map或/ proc/kallsyms中找到的結果相同的地址,但出現錯誤。內核2.6之後似乎這樣做並不容易,任何人都知道如何做到這一點?

+0

爲什麼不System.map中???? – Jeyaram

+0

System.map和/ proc/kallsyms是一回事嗎?對不起,我是內核新手。 – HomeworkGT

+0

我強烈建議使用虛擬化設置或硬件支持的遠程調試來做到這一點(與JTag一樣)。 –

回答

0

如果目標是簡單地暫停和檢查內核函數,那麼用戶模式linux可能是合適的。無可否認它是一個較老的機制,但是使用uml來做這樣簡單的事情是有據可查的。這裏有幾個鏈接,讓你開始:

這個答案還討論了使用UML以及一些替代品(包括額外的鏈接):

+0

我想用普通的linux來實現這個目標。 「以下是UML的一些用途: 託管虛擬服務器, 內核開發, 試驗新的內核和分佈, 教育, 沙盒。 – HomeworkGT

0
I am having problem finding this address. Anyone know how to do this? 

Kprobes的實施,

static kprobe_opcode_t __kprobes *kprobe_addr(struct kprobe *p) 
1355 { 
1356   kprobe_opcode_t *addr = p->addr; 
1357 
1358   if ((p->symbol_name && p->addr) || 
1359    (!p->symbol_name && !p->addr)) 
1360     goto invalid; 
1361 
1362   if (p->symbol_name) { 
1363     kprobe_lookup_name(p->symbol_name, addr); 
1364     if (!addr) 
1365       return ERR_PTR(-ENOENT); 
1366   } 
1367 
1368   addr = (kprobe_opcode_t *)(((char *)addr) + p->offset); 
1369   if (addr) 
1370     return addr; 
1371 
1372 invalid: 
1373   return ERR_PTR(-EINVAL); 
1374 } 

這肯定會幫助你。

通常p->symbol_name將與內核符號一起傳遞。例如,p->symbol_name = "kmalloc"

這個函數kprobe_addr()會給出相應的地址。

http://lxr.free-electrons.com/source/kernel/kprobes.c?a=arm#L1354