0

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

4

1 回答 1

0

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

棘手的方法

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

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

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

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

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

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

天真的方式

一个穷人的解决方案(但可能更容易实现,并且以某种方式更健壮)可以使用ADS为您要监控的每个进程隐藏一个小数据文件(当然,与其图像关联的 ADS 然后它不适用于services 和rundll'ed 进程,除非你让它变得更复杂)。

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

要回读该信息:

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

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

于 2013-03-05T14:21:35.107 回答