IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)網(wǎng)絡(luò)安全安全防護(hù) → 高級(jí)Linux Kernel Inline Hook技術(shù)分析與實(shí)現(xiàn)

高級(jí)Linux Kernel Inline Hook技術(shù)分析與實(shí)現(xiàn)

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

一、簡(jiǎn)述

????目前流行和成熟的kernel inline hook技術(shù)就是修改內(nèi)核函數(shù)的opcode,通過(guò)寫(xiě)入jmp或push ret等指令跳轉(zhuǎn)到新的內(nèi)核函數(shù)中,從而達(dá)到修改或過(guò)濾的功能。這些技術(shù)的共同點(diǎn)就是都會(huì)覆蓋原有的指令,這樣很容易在函數(shù)中通過(guò)查找jmp,push ret等指令來(lái)查出來(lái),因此這種inline hook方式不夠隱蔽。本文將使用一種高級(jí)inline hook技術(shù)來(lái)實(shí)現(xiàn)更隱蔽的inline hook技術(shù)。


二、更改offset實(shí)現(xiàn)跳轉(zhuǎn)

????如何不給函數(shù)添加或覆蓋新指令,就能跳轉(zhuǎn)到我們新的內(nèi)核函數(shù)中去呢?我們知道實(shí)現(xiàn)一個(gè)系統(tǒng)調(diào)用的函數(shù)中不可能把所有功能都在這個(gè)函數(shù)中全部實(shí)現(xiàn),它必定要調(diào)用它的下層函數(shù)。如果這個(gè)下層函數(shù)也可以得到我們想要的過(guò)濾信息等內(nèi)容的話,就可以把下層函數(shù)在上層函數(shù)中的offset替換成我們新的函數(shù)的offset,這樣上層函數(shù)調(diào)用下層函數(shù)時(shí),就會(huì)跳到我們新的函數(shù)中,在新的函數(shù)中做過(guò)濾和劫持內(nèi)容的工作。原理是這樣的,具體來(lái)分析它該怎么實(shí)現(xiàn), 我們?nèi)タ纯磗ys_read的具體實(shí)現(xiàn):

linux-2.6.18/fs/read_write.c
asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
{
??struct file *file;
??ssize_t ret = -EBADF;
??int fput_needed;

??file = fget_light(fd, &fput_needed);
??if (file) {
????loff_t pos = file_pos_read(file);
????ret = vfs_read(file, buf, count, &pos);
????file_pos_write(file, pos);
????fput_light(file, fput_needed);
??}

??return ret;
}
EXPORT_SYMBOL_GPL(sys_read);

????我們看到sys_read最終是要調(diào)用下層函數(shù)vfs_read來(lái)完成讀取數(shù)據(jù)的操作,所以我們不需要給sys_read添加或覆蓋指令, 而是要更改vfs_read在sys_read代碼中的offset就可以跳
轉(zhuǎn)到我們新的new_vfs_read中去。如何修改vfs_read的offset呢?先反匯編下sys_read看看:

[root@xsec linux-2.6.18]# gdb -q vmlinux
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) disass sys_read
Dump of assembler code for function sys_read:
0xc106dc5a :??push?? %ebp
0xc106dc5b :??mov????%esp,%ebp
0xc106dc5d :??push?? %esi
0xc106dc5e :??mov????$0xfffffff7,%esi
0xc106dc63 :??push?? %ebx
0xc106dc64 : sub????$0xc,%esp
0xc106dc67 : mov????0x8(%ebp),%eax
0xc106dc6a : lea????0xfffffff4(%ebp),%edx
0xc106dc6d : call?? 0xc106e16c
0xc106dc72 : test?? %eax,%eax
0xc106dc74 : mov????%eax,%ebx
0xc106dc76 : je???? 0xc106dcb1
0xc106dc78 : mov????0x24(%ebx),%edx
0xc106dc7b : mov????0x20(%eax),%eax
0xc106dc7e : mov????0x10(%ebp),%ecx
0xc106dc81 : mov????%edx,0xfffffff0(%ebp)
0xc106dc84 : mov????0xc(%ebp),%edx
0xc106dc87 : mov????%eax,0xffffffec(%ebp)
0xc106dc8a : lea????0xffffffec(%ebp),%eax
0xc106dc8d : push?? %eax
0xc106dc8e : mov????%ebx,%eax
0xc106dc90 : call?? 0xc106d75c
0xc106dc95 : mov????0xfffffff0(%ebp),%edx
0xc106dc98 : mov????%eax,%esi
0xc106dc9a : mov????0xffffffec(%ebp),%eax
0xc106dc9d : mov????%edx,0x24(%ebx)
0xc106dca0 : mov????%eax,0x20(%ebx)
0xc106dca3 : cmpl?? $0x0,0xfffffff4(%ebp)
0xc106dca7 : pop????%eax
0xc106dca8 : je???? 0xc106dcb1
0xc106dcaa : mov????%ebx,%eax
0xc106dcac : call?? 0xc106e107
0xc106dcb1 : lea????0xfffffff8(%ebp),%esp
0xc106dcb4 : mov????%esi,%eax
0xc106dcb6 : pop????%ebx
0xc106dcb7 : pop????%esi
0xc106dcb8 : pop????%ebp
0xc106dcb9 : ret????
End of assembler dump.
(gdb)

0xc106dc90 : call?? 0xc106d75c

????通過(guò)call指令來(lái)跳轉(zhuǎn)到vfs_read中去。0xc106d75c是vfs_read的內(nèi)存地址。所以只要把這個(gè)地址替換成我們的新函數(shù)地址,當(dāng)sys_read執(zhí)行這塊的時(shí)候,就會(huì)跳轉(zhuǎn)到我們的函數(shù)來(lái)了。

????下面給出我寫(xiě)的一個(gè)hook引擎,來(lái)完成查找和替換offset的功能。原理就是搜索sys_read的opcode,如果發(fā)現(xiàn)是call指令,根據(jù)call后面的offset重新計(jì)算要跳轉(zhuǎn)的地址是不是我們要hook的函數(shù)地址,如果是就重新計(jì)算新函數(shù)的offset,用新的offset替換原來(lái)的offset。從而完成跳轉(zhuǎn)功能。

????參數(shù)handler是上層函數(shù)的地址,這里就是sys_read的地址,old_func是要替換的函數(shù)地址,這里就是vfs_read, new_func是新函數(shù)的地址,這里就是new_vfs_read的地址。

unsigned int patch_kernel_func(unsigned int handler, unsigned int old_func,
?&n

關(guān)鍵詞標(biāo)簽:Linux

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 火絨安全軟件開(kāi)啟懸浮窗的方法-怎么限制和設(shè)置軟件網(wǎng)速 火絨安全軟件開(kāi)啟懸浮窗的方法-怎么限制和設(shè)置軟件網(wǎng)速 火絨安全軟件怎么攔截廣告-火絨設(shè)置廣告攔截的方法 火絨安全軟件怎么攔截廣告-火絨設(shè)置廣告攔截的方法 網(wǎng)絡(luò)安全管理軟件-PCHunter使用教程 網(wǎng)絡(luò)安全管理軟件-PCHunter使用教程 騰訊QQ密碼防盜十大建議 騰訊QQ密碼防盜十大建議

相關(guān)下載

    人氣排行 火絨安全軟件開(kāi)啟懸浮窗的方法-怎么限制和設(shè)置軟件網(wǎng)速 火絨安全軟件怎么攔截廣告-火絨設(shè)置廣告攔截的方法 網(wǎng)絡(luò)安全管理軟件-PCHunter使用教程 xp系統(tǒng)關(guān)閉445端口方法_ 教你如何關(guān)閉xp系統(tǒng)445端口 什么是IPS(入侵防御系統(tǒng)) 企業(yè)網(wǎng)絡(luò)安全事件應(yīng)急響應(yīng)方案 ARP協(xié)議的反向和代理 Windows Server 2008利用組策略的安全設(shè)置