想在驱动程序中终止某个进程;
如果在驱动程序中枚举进程名来获得进程的ID或HANDLE,将会使用好几个while和if或者for之类的循环体,占用内核资源不说,就实现上都相当麻烦(当然这是对于我这种莱鸟来说的);
于是就想在用户程序里先获得进程的ID或HANDLE,然后再传递给驱动程序,驱动程序再根据这ID或者HANDLE来结束进程,觉得这样比较轻松;
问题是: 用户程序里获得的进程ID是DWORD类型, 或者获得的是HANDLE, 而驱动程序里某些函数对进程或线程的操作是需要CLIENT_ID结构体(或EPROCESS进程块结构体),其中这个结构体定义如下:
typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;
例如,这个函数的最后一个参数就是 CLIENT_ID 型:
NTSTATUS
ZwOpenProcess (
__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__in_opt PCLIENT_ID ClientId
)
CLIENT_ID 有两个HANDLE, 好像一个是进程, 一个是线程; 而应用层程序中获得的HANDLE只有一个,这时我不知该怎么做了;
另外,我网上看过黑客防线发表的<在内核中结束冰刃进程>,我看了一下,觉得不是很"正宗"的,好象它只是在驱动中对一些系统函数Unhook,真正的结束进程操作还是在用户层?反正我在驱动中没看到它有任何的对进程操作;另外补上一句,某牛人说,别以为写个驱动就是内核了,差远了。
题外话不说了,我是莱鸟,刚学驱动不久,请大家指点我,以解疑惑,谢谢了!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)