C# 如何共享流程?

C# 如何共享流程?,c#,winapi,processor,C#,Winapi,Processor,我怎样才能依偎在另一个过程中?比如,共享另一个进程的名称?所以,如果我的应用程序是griddemo.exe,并且我想紧贴在explorer.exe中,这可能吗?只需从kernel32阅读有关CreateRemoteThread()的内容。方向对吗?是否存在安全/UAC问题?如果您的意思是将代码注入另一个进程,那么dll注入是一种技术: 多年没有这样做了,所以不确定现代MS Windows操作系统(即XP后)对此会有多满意。如果您的意思是将代码注入另一个进程,那么dll注入就是一种技术: 多年

我怎样才能依偎在另一个过程中?比如,共享另一个进程的名称?所以,如果我的应用程序是griddemo.exe,并且我想紧贴在explorer.exe中,这可能吗?只需从kernel32阅读有关CreateRemoteThread()的内容。方向对吗?是否存在安全/UAC问题?

如果您的意思是将代码注入另一个进程,那么dll注入是一种技术:


多年没有这样做了,所以不确定现代MS Windows操作系统(即XP后)对此会有多满意。

如果您的意思是将代码注入另一个进程,那么dll注入就是一种技术:


多年没有这样做了,所以不确定现代MS Windows操作系统(即XP后)对此会有多满意。

DLL注入是进行此操作的传统方法。这是相当棘手的,尤其是因为病毒扫描器对这种做法不屑一顾。因此,即使你让它工作,诺顿/迈克菲可能会阻止你-或阻止你在未来

DLL注入的一种简单方法是。请注意,Microsoft保留删除此功能的权利(将来可能会这样做)

Microsoft批准的实现DLL注入的方法是许可


请注意,必须根据CLR 4.0版或更高版本构建DLL,才能安全地执行DLL注入,因为这是第一个在proc中并行支持的版本。

DLL注入是执行此操作的传统方法。这是相当棘手的,尤其是因为病毒扫描器对这种做法不屑一顾。因此,即使你让它工作,诺顿/迈克菲可能会阻止你-或阻止你在未来

DLL注入的一种简单方法是。请注意,Microsoft保留删除此功能的权利(将来可能会这样做)

Microsoft批准的实现DLL注入的方法是许可


请注意,您的DLL必须根据CLR 4.0或更高版本构建,才能安全地执行DLL注入,因为这是第一个在proc中并行支持的版本。

首先,很抱歉,但我的答案将与其他答案一样长

多年以来,我一直在不同版本的操作系统(从windows NT 4.0到windows 7)中使用DLL注入,我对任何病毒扫描程序(包括不同版本的Norton和McAfee)都没有任何问题。因此,在这方面,我不同意斯蒂芬·克利里(见他的答案)

使用
CreateRemoteThread()
实际上只是其中一种方法AppInit_DLLs是另一种方式。两者各有优缺点。AppInit_DLL的主要优点是可以在任何进程中简单地插入DLL。AppInit_DLLs方法的主要缺点如下:

  • 所有GUI应用程序都将加载DLL。如果只想在一个进程(如explorer.exe)中加载它,则无法执行此操作。因此,DLL将增加所有GUI进程的工作空间。DLL中的错误(尤其是
    DllMain
    内部或DLL的任何依赖项DLL中的错误)会使许多当前未知的进程崩溃
  • 您不能在控制台应用程序或任何与User32.DLL没有依赖关系的EXE中注入关于AppInit_DLL方法的DLL
  • DllMain
    内部,您应该非常小心,因为它将在User32.dll完全初始化之前被调用。因此,可以在DLL的
    DllMain
    内部使用的安全DLL是Kernel32.DLL
  • 关于
    CreateRemoteThread()
    可以在进程中启动额外的线程。
    CreateRemoteThread()
    的主要问题是其
    lpStartAddress
    参数必须是来自远程进程的地址。因此,必须使用函数
    OpenProcess
    VirtualAllocEx
    WriteProcessMemory
    将一些信息写入目标进程的内存中。要打开进程,必须启用调试权限。如果只想在目标进程内部执行2+2操作,可以将相应的二进制代码直接复制到目标进程中。所有真正有趣的工作都可以通过使用一些Windows API来完成。所以大部分人不会复制代码。而不是在目标进程内部调用加载库(“MyPath\\MyDll.dll”)。由于
    LoadLibrary
    的原型与
    CreateThread
    ThreadProc
    的原型相同,因此可以将
    LoadLibrary
    作为
    CreateRemoteThread()的
    ThreadProc
    调用。这种方式的名称为“DLL注入”

    我建议您仅在确实需要时使用此DLL注入。如果目标应用程序有其他方式(如插件)在进程内加载DLL,则应使用这种方式,而不是DLL注入

    有了DLL注入的工作示例后,您将不得不解决一些一般性问题。这些问题您在第一时间看不到,但在长期使用应用程序后,您将看到其重要性:

  • 在使用
    CreateRemoteThread()
    之前,您应该找到目标进程已经运行的时刻
  • 在调用
    CreateRemoteThread()
    之前,目标应用程序必须已经初始化。因此,您不应该过早地使用
    CreateRemoteThread()
    。对于explorer.exe,您可以从运行注册表项启动小触发器程序。目前explorer.exe已为DLL注入做好充分准备
  • 您应该考虑64位版本的Windows
  • 不要忘记在目标进程内部重新定位DLL。请注意,DLL可以在目标进程中的另一个地址加载,就像在进程中一样。大多数情况下,选择它是一个好主意