使用LD_PRELOAD和线程安全性注入一个线程

时间:2012-02-17 00:44:11

标签: multithreading thread-safety pthreads posix ld-preload

我正在开发一个项目,用LD_PRELOAD在程序中注入共享库。

我注入的库在注入程序时会创建一个新线程。所有逻辑都发生在这个线程中(比如分析网络流量等)。

首先,您需要了解正在预加载的程序。它是一个客户端应用程序,用于加密写入静态缓冲区的每个数据包,并将其发送到服务器。我找到了在客户端加密和发送数据包的功能,我可以绕道而行。所以现在我可以修改静态缓冲区,让'send'函数加密缓冲区并将缓冲区发送到服务器。

enter image description here

但现在我遇到了一个问题:如果我在库的线程中更改静态缓冲区的内容(这样我可以发送一个假数据包),同时程序的线程也会更改静态缓冲区怎么办?这会导致崩溃。

我需要某种同步。

所以我一直在考虑一些解决方案:

  1. 查找程序中更改缓冲区的所有函数,绕过它们并为该调用添加互斥锁或类似的东西。虽然会花费相同的年龄......
  2. 找到一种方法来执行我的代码片段,在一个块中更改缓冲区。所以我的代码实际上立即被执行,没有POSIX线程切换到其他线程。这甚至可能吗?
  3. 让我的应用程序同步并哭泣。
  4. 有人能提出更好的解决方案吗?或者您知道如何使解决方案2成为可能吗?

    提前致谢, Gillis的

1 个答案:

答案 0 :(得分:1)

如果您绕过'发送'功能并且在预装的库中有'绕道发送'的代码,则意味着当主线程调用'发送'时,您的'绕道发送'代码将被执行在主线程的上下文中,你的线程在那一刻什么都不做。如果您有多个可能称为“发送”的“主线程”,那么您需要在“绕道发送”中进行同步。

或者,你真的想要在新的'注入'线程中处理一些东西,你可以: 1)在你的'绕道发送'中(从主线程的上下文调用):将数据传递给你的线程 并等待它直到它完成处理数据(注意:主线程等待)。