一種登錄檔沙箱的思路 實現

2021-06-07 01:31:35 字數 1352 閱讀 1471

在作業系統中,我們對乙個物件(檔案、登錄檔鍵等)的操作存在「建立」、「開啟」、「關閉」、「修改」、「刪除」和「查詢」等。這些操作的源便是那個物件,「重定向」思路就是針對這個物件「作手腳」。說得通俗點,就是通過「狸貓換太子」的方式達到欺騙上層的目的。以後有什麼操作,我們便是對這個「狸貓」去作,從而達到保護「太子」的目的。說的「程式化」點,就是比如create(apath) 要試圖建立apath路徑的物件(檔案,登錄檔鍵等),我們通過hook到create的底層函式,獲取apath,通過一定的規則將apath轉換為bpath,同時建立bpath上的物件,將建立結果返回。當然以上只是最最簡單的情況,而實際的思路則比這個要複雜的多。

要達到「狸貓換太子」的目的,我們必須要在外界第一次接觸到「太子」之前就下手做點事。於是這就涉及到下手早晚的問題。總得來說存在兩種方案:

一種方法是把「太子」的胚胎取出換到貓的肚子裡培育,將「狸貓」的胚胎換到皇后(當然可能是其他女性)的肚子裡培育。這種方案的優點是:我們在之前任何乙個沒人注意的時刻完成以上操作,從此就不用管啥了。但是缺點是:太不穩定,如果出問題了,那就是「胎死腹中」,對好壞哪方都沒個交代。

一種是把剛出生的「太子」抱走,再抱來乙隻「狸貓」。這種方案優點是:安全穩定,兩種不同物種培育自己的胚胎問題不大。問題是:在「太子」出生這個萬眾矚目的時刻,我們如何安全的將「太子」抱走,在把「狸貓」抱過來。

貌似**中都是使用第二種方案,我想可能是因為科技還不夠發達,不能讓不同dna的動物之間相互培育胚胎。同樣,針對我們這個專案,我們同樣秉承乙個準則:「能在ring3做的,我們就在ring3層做」,因為ring0層我們還沒足夠的把握去保證穩定性,而且一旦出了問題就是大問題——藍屏(胎死腹中)。於是我們要hook的函式是ring3層ntdll中ntcreatekey、ntopenkey和ntdeletekey等函式。

以上的討論我們可以通過「狸貓和太子」的關係來描述。因為「狸貓」和「太子」都是乙個完整的個體,所以描述非常方便。然而實際操作中,完整的將「狸貓」塑造成乙個人樣的「太子」形象是非常不現實的,因為整容費用太大。同樣針對我們的專案,我們不可能將所有操作的物件都創造乙個一樣的真實的「對映」物件。打個比方,乙個操作要列舉classes root登錄檔鍵,難道我們要將成千上萬子鍵的classes root拷貝到我們重定向的鍵下麼?或許這是一種一勞永逸的方法,但是誰也不願意去當第一次觸發「拷貝」操作的倒霉小孩。於是定下以下規則:

原始物件不能修改(修改值,屬性,刪除)

建立,我會在重定向登錄檔(其實就是真實登錄檔乙個子鍵)中建立它。

列舉、查詢、開啟、關閉,我會綜合原始登錄檔和重定向表之後去操作。

修改,我會在對應的重定向登錄檔中修改它

刪除,我優先在重定向表中刪除,其次再「操作」原始登錄檔(不是真刪除,而是找個位置做標記)

基於以上的原則和規則,就可以開始我們的開發之旅了。

一種計算留存的思路

在一些統計系統中,為了觀察使用者的粘度,我們會計算一系列的叫做留存的指標 次日註冊留存 2日註冊留存.n日註冊留存,比如昨天註冊了1000名使用者中,在今天有300名使用者又登入了,那麼對應於昨天的註冊留存就是30 如果再去細究,還可以去計算活躍使用者的留存情況,比如昨天登入的1000名使用者中,在...

學習知識的一種思路

昨天看到王垠博士的思維導圖,裡面有個很重要的概念就是學習知識分類,然後不斷的細化下去。聽說寫作也是一樣,作家也是先寫好提綱,然後一點點填充內容。看到這個讓我想起了禪與電單車裡作者對科學,對文學的學習方法,其實就是分類,然後再對子節點進行分類。其實大多數人都是在做別人早都研究出來的東西,用生活大 裡的...

一種加密,解密的思路

加密的一種思路 1.客戶端有個初始key,這個key先加密 異或 4個位元組內容,生成4個位元組的密文 2.根據4個位元組的密文,演算法產生新key2,使用key2解密下一段 4個位元組的內容,以此類推 對應的解密 1.伺服器本身知道初始key 2.伺服器先根據4個位元組的密文,使用客戶端相同的演算...