System.Diagnostics.Process.Start()
是否会挂钩它开始的过程?
我想找到一种方法从C#app 运行流程,而该流程知道它是由C#应用程序启动的。这是Process.Start()
的默认行为,还是我需要做任何不同/额外的事情?
换句话说,正在启动的进程是否有任何方法可以告诉它是从C#应用程序运行的,还是就像其他任何文件被打开一样?
答案 0 :(得分:3)
我想找到一种从C#应用程序运行进程的方法,而不知道它是由C#应用程序启动的进程
换句话说,正在启动的进程是否有任何方法可以告诉它是从C#应用程序运行的,还是就像其他任何文件被打开一样?
C#应用程序作为Window的进程运行,由于这一事实,生成的进程可能使用Win32函数Process32First()
来查询有关父进程的信息,特别是parent process ID。现在完全有可能的是,当子进程获得此信息时,父进程可能已终止,并且Windows重新使用进程ID进行完全不同的进程。无论如何,子进程可以测试“父”进程以了解它是否是.NET。
如果你想阻止子进程学习你的进程(在这种情况下是否是.NET),那么你可以通过代理生成它。
在下图中, A 是您的流程; Z 是您的衍生过程。 --->是一个产卵手术。
变化:
A ---> Z
...为:
A ---> P --->的ž强>
...其中 P 是代表您运行 Z 的中间代理流程。 P 在创建流程后立即退出。 Z 非常不可能追溯到 A 。
制作代理原生代码
我想找到一种从C#应用程序运行进程的方法,而不知道它是由C#应用程序启动的进程
为了进一步隐藏直接父级不是.NET的事实,请考虑使用本机代码生成代理。
使代理服务器为进程外COM服务器
与c#或本机代码中的先前中间代理示例不同,仍然存在可以将流程沿袭学习回到.NET应用程序的可能性。
但是,如果 A 进程实例化OoP COM服务器 P 中托管的COM对象,则生成的进程将无法将其追溯到您,因为我我很确定COM激活与产生新进程不同,因此可能不会继承。特别是如果COM服务器长时间运行并且在A 之前运行。
---> **P**...
|
|
V
**Z**...
------> **A**...