【问题标题】:Inject a thread with LD_PRELOAD and thread-safety使用 LD_PRELOAD 和线程安全注入线程
【发布时间】:2023-03-15 14:38:01
【问题描述】:

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

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

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

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

我需要某种同步。

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

  1. 在程序中查找更改缓冲区的每个函数,绕过它们并在该调用中添加一个互斥锁或类似的东西。不过需要很长时间...
  2. 找到一种方法来执行我的一段代码,即在一个块中更改缓冲区。所以我的一段代码实际上是立即执行的,没有 POSIX 线程切换到其他线程。这甚至可能吗?
  3. 让我的应用程序同步并哭泣。

谁能提出更好的解决方案?或者您知道如何使解决方案 2 成为可能吗?

提前致谢, 吉利斯

【问题讨论】:

  • Injected 线程和 Main 线程都会调用 Send 函数吗?
  • 是的。可能是他们同时调用它。它们是完全独立的线程。也可能是主线程组成了一个数据包(写入缓冲区),同时注入的线程也组成了一个数据包。

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


【解决方案1】:

如果你绕过了'send'函数并且你的预加载库中有'detoured send'的代码,这意味着当主线程调用'send'时,你的'detoured send'代码将被执行在主线程的上下文中,您的线程此时什么都不做。如果您有多个可能调用“发送”的“主线程”,那么您需要在“迂回发送”中进行同步。

或者,如果您真的想在新的“注入”线程中处理某些内容,您可以: 1)在您的“迂回发送”(从主线程的上下文中调用):将数据传递给您的线程 并等到它处理完数据(注意:主线程正在等待)。

【讨论】:

  • 当主线程调用'detoured send'时,它确实会被主线程的上下文执行。但这并不是真正的问题。问题实际上更多在于写入“发送缓冲区”(也许我忘了在我的问题中强调这一点)。如果我注入的线程想要发送一个带有“发送”的数据包,它将改变“发送缓冲区”。但是如果同时主线程也在改变“发送缓冲区”呢?我无法添加锁,因为我无法将它们放入主线程,除非我绕过每个更改“发送缓冲区”的函数。
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2011-11-04
  • 2019-10-18
相关资源
最近更新 更多