2012-02-17 40 views
1

我正在開發一個項目,以便在LD_PRELOAD程序中注入一個共享庫。注入LD_PRELOAD和線程安全的線程

我的注入庫在注入程序時創建一個新線程。所有的邏輯都發生在這個線程中(如分析網絡流量等)。

首先,您需要了解有關正在預加載的程序的情況。它是一個客戶端應用程序,它將每個數據包加密寫入靜態緩衝區,並將其發送到服務器。我發現了在客戶端加密和發送數據包的功能,我可以繞過它。所以現在我可以修改靜態緩衝區,並讓'send'函數加密緩衝區並將緩衝區發送到服務器。

enter image description here

但現在我有一個問題:如果我改變我的圖書館的線程靜態緩衝區的內容(這樣我就可以發送一個僞造的包),並在同一時間程序的線程更改靜態緩衝區呢?那會導致崩潰。

我需要某種同步。

所以我一直在想一些解決方案:

  1. 查找改變緩衝,繞路他們和互斥添加到呼叫或類似的東西程序的每個函數。會採取像年齡雖然...
  2. 找到一種方法來執行我的代碼塊,在一個塊中更改緩衝區。所以我的代碼實際上一次執行,沒有POSIX線程切換到其他線程。這甚至有可能嗎?
  3. 使我的應用程序同步和哭泣。

任何人都可以想出更好的解決方案嗎?或者你知道如何使解決方案2成爲可能?

由於提前, 吉利斯

+0

Injected線程和主線程都會調用Send函數嗎? – 2012-02-17 00:51:53

+0

是的。可能是他們在同一時間稱呼它。他們完全是獨立的線程。也可能是主線程組成一個數據包(寫入緩衝區),並且被注入的線程也同時組成一個數據包。 – 2012-02-17 10:33:14

回答

1

如果繞道「發送」功能,你必須在你的預加載庫中的「繞道送」的代碼,這意味着當主線程調用「發送」,您的'繞道發送'代碼將在主線程的內容中執行,您的線程此時無所作爲。如果您有多個可能稱爲「發送」的「主線程」,那麼您需要在「繞道發送」中同步。

或者,你真的要處理你的新「注入」線程就可以了一句:在你的「繞道送」 1)(從主線程的上下文中調用):將數據傳遞到您的線程 和等待,直到它完成處理數據(注意:主線程爲等待)。

+0

當主線程調用'繞道發送'時,它確實會被主線程的上下文執行。但這不是真的問題。問題實際上更多的是寫入'發送緩衝區'(也許我忘了在我的問題中強調這一點)。如果我的注入線程想發送一個帶有'send'的包,它將會改變'發送緩衝區'。但是如果同時主線程也在改變'發送緩衝區'呢?我不能添加鎖,因爲我不能將它們放到主線程中,除非我繞過每個改變'發送緩衝區'的函數。 – 2012-02-17 10:38:55