【问题标题】:Is it possible to associate data with a running process?是否可以将数据与正在运行的进程相关联?
【发布时间】:2013-03-05 13:07:04
【问题描述】:

正如标题所说,我想将随机数据位 (ULONG) 与本地计算机上正在运行的进程相关联。我希望该数据与它关联的进程保持一致,而不是与读取和写入数据的进程保持一致。这在 Win32 中可能吗?

【问题讨论】:

  • 你能提供更多关于你想要做什么的信息吗?正如所写,我不知道你在想什么。
  • 你想做什么?我感觉这里有一个 XY 问题。
  • 为什么? (Only two to go.)
  • 如果您只想在两个进程之间共享内存,请考虑创建内存映射文件。 msdn.microsoft.com/en-us/library/ms810613.aspx

标签: windows winapi process


【解决方案1】:

是的,但这可能很棘手。您不能访问另一个进程的任意内存地址,也不能指望共享内存,因为您想对任意进程执行此操作。

棘手的方法

您可以做的是在您要装饰的进程中创建一个窗口(具有特殊且已知的名称)。请参阅帖子末尾的不带 Windows 的替代解决方案。

  • 首先,您必须使用OpenProcess 获得进程的句柄。
  • 在另一个进程中使用VirtualAllocEx 分配内存以保存一个短方法,该方法将创建一个具有特殊已知名称的(隐藏)窗口。
  • 使用 WriteProcessMemory 从您自己的代码中复制该函数。
  • CreateRemoteThread执行它。

现在您需要一种方法来识别并从创建该内存的进程之外的另一个进程读回该内存。为此,您只需找到具有该已知名称的窗口,并且您的 holder 用于一小块数据。

请注意,此技术可能用于在另一个进程中注入代码,因此某些防病毒软件可能会发出警告。

结语
如果地址空间随机化被禁用,您可能不需要在进程内存中注入代码,您可以使用具有相同参数的 Windows 内核函数的地址调用CreateRemoteThread(例如@ 987654328@)。您不能使用本机应用程序(未链接到 kernel32.dll)来执行此操作。
除非您拥有进程的调试权限(使用AdjustTokenPrivileges),否则您无法注入系统进程。

作为 假窗口 的替代方案,您可以创建一个挂起的线程,其中包含一个局部变量、一个 TLS 或用作数据块的堆栈条目。要找到这个话题,你必须给它一个名字,例如,this(但它很少适用)。

天真的方式

一个穷人的解决方案(但可能更容易实现,甚至更强大)可以使用ADS 为您要监控的每个进程隐藏一个小数据文件(当然是与其图像关联的 ADS那么它不适用于服务和rundll'ed 进程,除非你让它变得更复杂)。

  • 迭代所有进程,并为每个进程创建一个具有已知名称(和进程 ID)的 ADS。
  • 您必须在其中存储系统启动时间和您需要的所有数据。

要回读这些信息:

  • 迭代所有进程并检查该 ADS,读取它并比较系统启动时间(如果它们不匹配,则表示您找到了一个寡妇 ADS,应该将其删除。

当然,您必须照顾这些寡妇,因此您可能需要定期检查它们。当然,您可以避免将所有这些小数据块存储到众所周知的位置,您的“读者”可能每次都检查它们,删除不再与正在运行的进程关联的文件。

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多