ebpf 隱藏 Android 任意進(jìn)程或任意文件實(shí)現(xiàn)連載 (一)
一,介紹
本文圍繞著 linux 系統(tǒng) ls 命令,并實(shí)現(xiàn) ebpf 內(nèi)核命令攔截修改 ls 后最終效果等功能
演示視頻被投訴下架,說是涉嫌抄襲,所以寫了這么一個文字的內(nèi)容,來講解下項(xiàng)目的思想出處,和關(guān)鍵代碼的分析,并提供源碼給各位。

二、案例設(shè)計思路:
1. 分析linux系統(tǒng)下 ls 命令底層調(diào)用原理
2. 對 ls 命令內(nèi)部關(guān)鍵系統(tǒng)調(diào)用進(jìn)行hook攔截
3. 劫持并修改關(guān)鍵系統(tǒng)調(diào)用的返回值
三、分析 ls 工具底層實(shí)現(xiàn)

下面是對截圖中部分信息的解釋
四、eBPF關(guān)鍵代碼實(shí)現(xiàn)原理分析 (sys_enter_getdents64 探測)
ebpf 程序代碼實(shí)現(xiàn)僅分析內(nèi)核態(tài)程序模塊,代碼塊中將會對關(guān)鍵部分內(nèi)容進(jìn)行注釋說明,下方程序模塊主要目的是獲取 getdents64 方法的 dirp 地址為后續(xù)工作準(zhǔn)備
三步
- 確定發(fā)生 getdents64 系統(tǒng)調(diào)用的進(jìn)程是我需要的
- 獲取當(dāng)前目錄下所有文件對象的 dirp (可以理解為,目錄下每個文件都是一個結(jié)構(gòu)體,當(dāng)前獲取的 dirp 是所有文件的 連續(xù)的結(jié)構(gòu)體首地址)
- 將 dirp 地址保存到 maps 中提供給其他程序使用
getdents64? 方法原型可在命令行處使用 `man 2 getdents64` 查看 ,我會在劫持?jǐn)?shù)據(jù)章節(jié)中對他進(jìn)行深度的分析
五,eBPF關(guān)鍵代碼實(shí)現(xiàn)原理分析(sys_exit_getdents64 探測)
我們知道在 c 語言開發(fā)程序時候是經(jīng)常使用指針的,也就意味著有時候,當(dāng)使用 c 語言去獲取一些數(shù)據(jù)時,會提前傳入一個空的地址,當(dāng)數(shù)據(jù)獲取成功后在往這個地址中填充數(shù)據(jù),getdents64? 方法也是如此,所以這里使用到了探測點(diǎn)? `sys_exit_getdents64`。
以下程序模塊將會在 getdents64 方法拿到當(dāng)前目錄下所有文件信息后進(jìn)行一個處理工作,主要用于遍歷出當(dāng)前目錄下所有的文件的 dirp 結(jié)構(gòu)體地址,供后面的程序?qū)@些結(jié)構(gòu)體進(jìn)行操作,達(dá)到隱藏文件的目的。
當(dāng)前代碼塊主要工作 是找出我要隱藏的目標(biāo)文件的地址,找到后停止繼續(xù)查找,在這個過程中他會不斷的對 map_to_patch 進(jìn)行賦值,而 map_to_patch 結(jié)構(gòu)體中保存的永遠(yuǎn)是目標(biāo)文件的上一個文件,這樣在發(fā)生尾調(diào)用時候,被調(diào)用的程序?qū)玫侥繕?biāo)文件的上一個文件結(jié)構(gòu)體的地址,并進(jìn)行算法處理,更改內(nèi)存達(dá)到隱藏目標(biāo)的目的
六,下一個章節(jié),將會對隱藏文件的具體實(shí)現(xiàn)思路進(jìn)行詳細(xì)分析
源碼公開提供,需要的聯(lián)系我
感謝? https://github.com/pathtofile