C# 进程问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 进程问题相关的知识,希望对你有一定的参考价值。

如何将自己写的程序注入到系统进程里。

或者用C#隐藏自己程序进程

也可以写注册表设为系统进程

本人写的监控程序。

所以需要。

希望有具体事例。

不要说用哪个用哪个。

这个谁都会说。

被采纳问题加分处理
我要具体的实例.

不是所谓的怎么去做.

再重申一遍.说怎么去做谁都会.

有能力的写个例子出来.

粘贴复制的闪一闪.

被采纳继续加分.

线程注入 。首先创建调用使用的api函数类。
using System.Runtime.InteropServices;

namespace Inject


class modDeclareAPI


public const PROCESS_VM_READ = 16;
public const TH32CS_SNAPPROCESS = 2;
public const MEM_COMMIT = 4096;
public const PAGE_READWRITE = 4;
public const PROCESS_CREATE_THREAD = (2);
public const PROCESS_VM_OPERATION = (8);
public const PROCESS_VM_WRITE = (32);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int ReadProcessMemory(int hProcess, int lpBaseAddress, string lpBuffer, int nSize, ref int lpNumberOfBytesWritten);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetLastError();
[DllImport("kernel32", EntryPoint = "LoadLibraryA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int LoadLibrary(string lpLibFileName);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int VirtualAllocEx(int hProcess, int lpAddress, int dwSize, int flAllocationType, int flProtect);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int WriteProcessMemory(int hProcess, int lpBaseAddress, string lpBuffer, int nSize, ref int lpNumberOfBytesWritten);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetProcAddress(int hModule, string lpProcName);
[DllImport("kernel32", EntryPoint = "GetModuleHandleA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetModuleHandle(string lpModuleName);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int CreateRemoteThread(int hProcess, int lpThreadAttributes, int dwStackSize, int lpStartAddress, int lpParameter, int dwCreationFlags, ref int lpThreadId);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int OpenProcess(int dwDesiredAccess, int bInheritHandle, int dwProcessId);
[DllImport("user32", EntryPoint = "FindWindowA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32", EntryPoint = "GetWindowThreadProcessId", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetWindowThreadProcessId(int hwnd, ref int lpdwProcessId);




其次创建测试窗体。
连个文本框,一个线程注入按钮。第一个文本框是要注入的dll文件全路径。第二个文本框是被注入exe文件(该文件必须事先运行)。
private void btnInject_Click(object sender, System.EventArgs e)

System.Diagnostics.Process[] sProcesses;
System.Diagnostics.Process sProcess;
string strProTmp;

// ERROR: Not supported in C#: OnErrorStatement
lblMessage.Text = "";
lblMessage.ForeColor = Color.SaddleBrown;

sProcesses = System.Diagnostics.Process.GetProcesses();

foreach ( sProcess in sProcesses)
strProTmp = strProTmp + "," + sProcess.Id + sProcess.ProcessName;
if (sProcess.ProcessName.ToUpper == Strings.Trim(txtTarget.Text).ToUpper)
Inject.clsInject objInject = new Inject.clsInject();
if (objInject.Fun_Inject(sProcess.Id, Strings.Trim(txtInject.Text)) != true)
lblMessage.ForeColor = Color.Red;
lblMessage.Text = "Can't inject the " + txtTarget.Text + " process ! ";

else
lblMessage.Text = "";
lblMessage.ForeColor = Color.Green;
lblMessage.Text = "Inject process successful! ";

break; // TODO: might not be correct. Was : Exit For

else
lblMessage.ForeColor = Color.Red;
lblMessage.Text = "Can't find the " + txtTarget.Text + " process ! ";



return; // TODO: might not be correct. Was : Exit Sub
ErrorHandler:
Interaction.MsgBox("Unexpected Error occurred");

第三编写自己的dll就是你的木马程序。
木马程序建议用vc编写,因为c#编写的Dll没有dllmain方法,不能自动执行。用vc编写的用上面的代码就可以直接在内存中运行了。

dll代码
#include <windows.h>
#include <tchar.h>

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )

switch ( fdwReason )

case DLL_PROCESS_ATTACH:

MessageBox( NULL, _T("DLL已进入目标进程。"), _T("信息"), MB_ICONINFORMATION );

break;
case DLL_PROCESS_DETACH:

MessageBox( NULL, _T("DLL已从目标进程卸载。"), _T("信息"), MB_ICONINFORMATION );

break;

return TRUE;
参考技术A 看楼主的意思是想做类似“病毒”的东西了。
注入到系统进程或.NET进程,这是“病毒”或“木马”的高级“隐身”技能。很难查杀,如果结束进程的话,系统的东西也不能用了。
这样吧。你学吧。学好了教教我。
不过我可以给楼主指一条道路,从安全的角度来将,CLR将程序使用VES载入。这个时候CLR会使用“代码组”的安全性。别说别的,你程序可能连操作硬盘的权限都没有。当然这可以设置,如果非要避开VES的话,请楼主使用VC++.NET,因为VC++.NET可以调用VC++的东西。它相对C#来说,是比较混合的,只有VC++.NET可以逃开VES的“安全性”。
呵呵,我瞎猜的。
说句实话,你给1W分,也没人给你写。不信你看着。
参考技术B using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;

using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Management;
using System.ServiceProcess;
using System.Net;
using System.Drawing;

namespace SocketServer

public partial class frmProcess : Form

public frmProcess()

InitializeComponent();


private void but_1_Click(object sender, EventArgs e)

GetProcess();

button2.Enabled = false;
but_2.Enabled = true;


private void GetProcess()
//private DataTable setProcess()

DataTable dt = new DataTable();
dt.Columns.Add("进程名称");
dt.Columns.Add("开始时间");
dt.Columns.Add("程序标题");
dt.Columns.Add("内存占用");
dt.Columns.Add("唯一标识");
dt.Columns.Add("CPU时间");
Process[] processes;
processes = Process.GetProcesses();
try

foreach (Process p in processes)

if (p.ProcessName != "Idle")

DataRow dr = dt.NewRow();
dr[0] = p.ProcessName;
dr[1] = p.StartTime.ToString("h:m:s");
dr[2] = p.MainWindowTitle;
dr[3] = p.WorkingSet.ToString();
dr[4] = p.Id.ToString();
dr[5] = p.PrivilegedProcessorTime.ToString();

dt.Rows.Add(dr);
//this.lstboxall.Items.Add(string.Format("0,-301:h:m:s", p.ProcessName, p.StartTime,));




catch (Exception ex)

MessageBox.Show(ex.ToString());

finally

this.dtgrideview.DataSource = dt;

//return dt;


private void but_3_Click(object sender, EventArgs e)

Application.Exit();


private void but_2_Click(object sender, EventArgs e)

Process process;
if(this.dtgrideview.SelectedCells.Count>0)

process = Process.GetProcessById(int.Parse(this.dtgrideview.SelectedCells[4].Value.ToString()));
if (MessageBox.Show("是否要结束" + process.ProcessName + "进程?", "进程管理", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly) == DialogResult.Yes)

try


process.WaitForExit(1000);
process.CloseMainWindow();
process.Kill();
MessageBox.Show(process.ProcessName + "进程已经成功结束", "进程管理", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
process.Dispose();
this.GetProcess();


catch (Exception ex)




else

process.Dispose();
this.GetProcess();


//MessageBox.Show(process.);

参考技术C 看看这个里面10楼的也许会有所启发o(∩_∩)o... http://bbs.bc-cn.net/viewthread.php?tid=125633&page=1 参考技术D 不如咱们申请个黑客板块吧。。。。。

C# 检测衍生进程

【中文标题】C# 检测衍生进程【英文标题】:C# Detecting Spawned Processes 【发布时间】:2011-01-14 15:12:26 【问题描述】:

我正在编写一段 c# 代码来启动安装程序并等待它返回,然后再继续执行其他操作。

我在安装某些安装程序时遇到问题,这些安装程序会在安装实际完成之前生成其他进程,而原始进程会返回。 有什么方法可以等到所有流程都完成吗?

为了澄清我遇到问题的场景:

    启动安装程序1 Installer1 生成/启动另一个安装程序 (Installer2) 安装程序 1 返回 应用程序认为安装已完成,但 Installer2 仍在运行。这会导致应用中的工作流程出现问题。

这是我目前正在使用的代码:

// launch installer
Process process = windowsApplicationLauncher.LaunchApplication(_localFilePath);

// wait for process to return
do

    if (!process.HasExited)
    
    

while (!process.WaitForExit(1000));

if (process.ExitCode == 0)

    _fileService.MoveFile(_localFilePath, _postInstallFilePath);

    _notification.SetComplete(false);

    return true;

return false;

【问题讨论】:

您拥有衍生的进程吗?例如。如果这样可以让您更容易检测到完成,您可以修改 Installer2 吗?或者 Installer2 是由其他人提供的,或者您甚至不知道可能会产生哪些额外的进程并且需要处理任意产生的进程? 我们确实拥有相关的特定安装程序。但是,我们也希望能够处理任意生成的进程。 【参考方案1】:

您有没有想过使用 WMI 来解决这个问题?

您可以使用 WMI 来侦听进程创建和删除事件。问题967668 有一个很好的例子。

当您收到进程创建事件时,您可以发出 WMI 查询以确定该进程是否是根安装程序的子进程(或子进程的子进程等),如下所示:

"SELECT * FROM Win32_Process WHERE ParentProcessId=".

【讨论】:

对此要非常小心(我发现很难)。 Windows 中的根级进程往往是孤立的(wininit.exe、cs-s-rss.exe),但仍具有父 ID。父进程不再存在,因此其 ID 用于新进程。在查询进程的子进程时,也会返回那些孤立的根级别进程。解决方案,检查子进程的启动时间,确保它们是在父进程之后启动的。【参考方案2】:

do / while 循环中这样做可能会更好:

System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName, Environment.MachineName);

然后遍历procs 以找出仍在运行的...通过使用HasExited 属性...

逻辑是进程的子进程归你的代码所有,所以你可以先检查它们是否退出,如果没有,继续循环......

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

这为我提供了与我启动的进程 (setup.exe) 同名的进程列表。我对该设置产生的 msiexec.exe 进程感兴趣。跨度>

以上是关于C# 进程问题的主要内容,如果未能解决你的问题,请参考以下文章

C# 检测衍生进程

帮忙写一个C#例子:两个进程间通信的问题.

c#:具有多个应用程序域的单个进程 VS 多个进程

如何从 C# 启动进程?

C# 根据进程ID获取进程主窗口句柄

使用 C# 将 dll 注入当前进程