正如标题所说,我想将一个随机数据位(ULONG)与本地计算机上正在运行的进程相关联。我希望这些数据与其关联的过程持续存在,而不是读取和处理的过程。写数据。这在Win32中可能吗?
答案 0 :(得分:0)
是的,但这可能很棘手。您无法访问另一个进程的任意内存地址,也无法依赖共享内存,因为您希望使用任意进程执行此操作。
您可以做的是在要装饰的流程中创建窗口(带有特殊且已知的名称)。有关没有窗口的替代解决方案,请参阅帖子的结尾。
OpenProcess
来处理流程。VirtualAllocEx
分配内存以保存一个简短的方法,该方法将创建一个具有特殊已知名称的(隐藏)窗口。WriteProcessMemory
从您自己的代码中复制该功能。CreateRemoteThread
执行。现在您需要一种方法来识别和回读除了创建该内存之外的其他进程的内存。为此,您只需找到具有该已知名称的窗口,并获得一小部分数据的 holder 。
请注意,此技术可用于在另一个进程中注入代码,因此某些防病毒软件可能会对此进行警告。
最后的笔记
如果禁用地址空间随机化,则可能不需要在进程内存中注入代码,可以使用具有相同参数的Windows内核函数的地址调用CreateRemoteThread
(例如LoadLibrary
)。您无法使用本机应用程序(未链接到kernel32.dll)执行此操作。
除非您具有进程的调试权限(使用AdjustTokenPrivileges
),否则无法注入系统进程。
作为假窗口的替代方法,您可以使用本地变量,TLS或用作数据块的堆栈条目创建挂起的线程。要查找此主题,您必须使用例如this为其命名(但它很少适用)。
穷人解决方案(但可能更容易实现,并且在某种程度上更加健壮)可以使用ADS为要监视的每个进程隐藏一个小数据文件(当然是与之关联的ADS)它的图像然后它不适用于服务和rundll
'ed过程,除非你把它变得更复杂)。
回读这些信息:
当然你必须照顾这些寡妇,所以你可能需要定期检查它们。当然,您可以避免将所有这些小块数据存储到一个众所周知的位置,您的“读者”可能每次都会检查它们,删除不再与正在运行的进程相关联的文件。