最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

eBPF 修改系統(tǒng)調(diào)用read方法的返回值(字符串)信息

2023-06-04 19:22 作者:云知道B  | 我要投稿

一,本章介紹

????? - 本項(xiàng)目采用bpf core 特性編寫,其特點(diǎn)是程序性能較為優(yōu)異,當(dāng)然也可以采用普通的編寫方式一樣可以實(shí)現(xiàn)
????? - 當(dāng)應(yīng)用程序發(fā)生系統(tǒng)調(diào)用 read 方法時(shí),方法第二個(gè)參數(shù)將保存著讀取某個(gè)文件的所有數(shù)據(jù)的內(nèi)存地址,本章內(nèi)容將用于學(xué)習(xí)修改 buf 地址中指定字符串的數(shù)據(jù),可用于劫持一些敏感數(shù)據(jù)被應(yīng)用程序發(fā)現(xiàn)。

二,方法原型介紹

????? - fd : 通過 open 方法成功打開一個(gè)文件后的返回值
????? - buf : 程序自定義的內(nèi)存空間地址,用于保存最終讀取到的數(shù)據(jù)內(nèi)容字符串(需要修改的數(shù)據(jù))
????? - count : 程序自定義的地址的大小,用于保存最終讀取到的數(shù)據(jù)的總字節(jié)大小
????? - ssize_t : read 的返回值

三,思路實(shí)現(xiàn)

????? 1. hook openat 方法拿到open方法第二個(gè)參數(shù)的地址,地址中保存著目標(biāo)程序打開的本地文件路徑
????? 2. hook openat 方法拿到被打開的文件的 fd? (open 完成之后)
????? 3. hook read 方法拿到參數(shù) buf 的地址 (read 被調(diào)用時(shí)候)
????? 4. hook read 方法拿到 返回值信息(read 完成之后)
????? 5. 查找 buf 地址的數(shù)據(jù),找出我們要修改的相同的字符串
????? 6. 修改字符串

下面將對整個(gè)思路進(jìn)行一一介紹并實(shí)現(xiàn),考慮到linux(Android) 系統(tǒng)內(nèi)核版本差異,程序編寫的時(shí)候應(yīng)確認(rèn)好當(dāng)前應(yīng)用 是使用到了 open,openat,還是openat2? 這點(diǎn)很容易驗(yàn)證,無需反編譯程序,可以使用 bcc 提供的相關(guān)程序,或者自行編寫。

四,fd 的獲取

? 拿到 `openat` 第二個(gè)參數(shù),也就是目標(biāo)程序打開的文件路徑所保存的內(nèi)存地址。
?? 拿到目標(biāo)進(jìn)程打開的文件的 fd ,目標(biāo)進(jìn)程調(diào)用 read 方法時(shí) 會(huì)傳遞 fd 我們需要使用fd 進(jìn)行比較,達(dá)到確認(rèn)進(jìn)程是目標(biāo)進(jìn)程,當(dāng)然也有更多的方法實(shí)現(xiàn)。


代碼片段:

?? 代碼主要作用:拿到 `openat` 第二個(gè)參數(shù),并進(jìn)行過濾,得到正確的目標(biāo)文件 fd 最后將正確的 fd 保存到 maps 中供后面使用

五,buf 地址獲取

?????? 拿到 `read` 方法中的參數(shù) `buf` 的地址,地址會(huì)在 `read` 成功之后被填充數(shù)據(jù),也就是我們要修改的目標(biāo)

六,更改數(shù)據(jù)原理分析

buf 數(shù)據(jù)內(nèi)存空間示例圖:

接下來將對此圖進(jìn)行一一介紹,并分析清楚 更改 `buf` 數(shù)據(jù)的原理

? ? ? 以圖為例,read 方法的 `buf` 地址數(shù)據(jù)是 ` 'check_possible_addresses_frida'` 他在內(nèi)存中分布如圖所示,每一個(gè)字符占用一個(gè)地址格子,而 `buf ` 保存的是這一串?dāng)?shù)據(jù)的首地址。

? ? ? 是否可以通過遍歷 `buf` 的長度(也就是read 方法的第三個(gè)參數(shù)),去查找字符串 f 出現(xiàn)的位置(假設(shè)要修改`frida` 字符串) ,進(jìn)行初步設(shè)置有可能是我們需要修改的 字符串的地址,并保存 f 出現(xiàn)的地址到 maps 中。

?????? 確定好 f 出現(xiàn)的地址后,嘗試讀取地址長度為 5 以上的數(shù)據(jù),進(jìn)行字符串比較,確定真正的要被修改的內(nèi)存 f 所出現(xiàn)的地址。

?????? 聲明一個(gè)字符串,將字符串寫入到指定的地址中,達(dá)到修改數(shù)據(jù)(目前僅用戶態(tài))



修改思路已經(jīng)確定好,后面將進(jìn)行代碼的實(shí)現(xiàn)

七,buf 地址數(shù)據(jù)的初步處理

? ? ?? 接下來在 `read` 方法結(jié)束后,理論上我們可以拿到 `buf` 中保存的讀取到的數(shù)據(jù),并進(jìn)行處理,改寫等操作,但是事實(shí)上`ebpf 虛擬機(jī)`對每個(gè)程序模塊的 `ebpf字節(jié)碼` 做了100萬個(gè)大小的數(shù)據(jù)限制,如果將整個(gè)邏輯都寫到一個(gè)程序塊,那么程序?qū)o法通過 `ebpf 虛擬機(jī)`的檢測。

? ? ? ? 所以下方代碼段將對 `buf` 數(shù)據(jù)進(jìn)行預(yù)處理,找出`buf`數(shù)據(jù)中以我們要指定的要修改的字符,第一個(gè)字符相同的字符串的地址,并保存到`maps`中,提供后續(xù)處理。程序的邏輯可以靈活改變,下方僅僅是案例的一個(gè)選擇。

代碼段?:

八,buf 數(shù)據(jù)二次篩選

?????? 上方程序塊已經(jīng)篩選出相似的地址,接下來的內(nèi)容將對這些相似的地址進(jìn)行字符串比較,找到真正的要修改的數(shù)據(jù)


關(guān)鍵代碼段:

九,修改buf 中的目標(biāo)字符串

?????? 核心原理是,通過上方操作,確認(rèn)好被修改的字符串的地址后,使用 ebpf 程序提供的 api 進(jìn)行用戶態(tài)內(nèi)存數(shù)據(jù)的更改,read 方法返回被更改的數(shù)據(jù)給應(yīng)用之后,應(yīng)用程序就無法拿到我們不想讓他知道的一些數(shù)據(jù)。


示例代碼塊:

程序?qū)崿F(xiàn)原理到此分析完畢,代碼可以聯(lián)系 up 微信? vb2345qw?? 獲取,如果覺得有用記得分享點(diǎn)贊

eBPF 修改系統(tǒng)調(diào)用read方法的返回值(字符串)信息的評論 (共 條)

分享到微博請遵守國家法律
乌拉特后旗| 双城市| 华亭县| 甘孜| 军事| 湖口县| 巨鹿县| 靖边县| 那坡县| 黑山县| 陇南市| 广宁县| 绿春县| 来安县| 会昌县| 天长市| 彰化县| 甘德县| 昌江| 景泰县| 蓝田县| 邢台县| 清原| 射阳县| 洪江市| 广水市| 巴塘县| 甘德县| 三原县| 望谟县| 乐昌市| 若羌县| 密山市| 瑞金市| 嘉义市| 邵阳县| 菏泽市| 岳西县| 徐州市| 敖汉旗| 淳化县|