懒散了好几天了,网站也懒得更新了,今天下午整了R0层的进程强制关闭进程模块儿的编写,虽然蓝屏了好多次,但是最终也是成功完成了吧,这里小悠就跟大家分享一下其中的一个方法,插入线程APC的方式让进程自杀,完成对进程的关闭.
这里先说说APC是神马东西吧,APC (Asynchronous procedure call)异步过程调用,就是当一个操作结束后系统立刻回调一个之前指定的回调例程,就像Win32中的消息机制似的,系统捕获完消息之后马上调动我们指定的消息回调函数;就像你朋友对你说你吃完饭之后“叫”我一下,我们一起打球去.这个叫就是异步的回调.
每一个线程都会维护一个对应的APC队列,队列里存放这回调函数的信息,这样线程就能准确的调用回调函数了,然而,APC的回调函数要想被调用是需要条件的,只有线程处于警惕(Alert)状态的时候,线程才去查看APC队列执行回调函数。Win32API中有多个API可以使线程进入警惕状态,比如SleepEx,WaitForSingleObjectEx这个**Ex的函数等,这些函数都带有一个BOOL类型的bAlertable参数,当设置为TRUE的时候就能够进入警惕状态。
说到这里,我们就回到主题来说一下插入APC让进程“自杀”吧,其实说白了也就是插入一个APC回调函数,在函数内部调用TerminateProcess将自身关闭就好了,要知道这个回调函数可是属于你插入的那个进程~~所以自己关闭自己当然是合法的、、、
OK,下面闲话少说,直接贴上代码吧,后面我会把对应的.h,.cpp附加上去的:
//先导入一些我们需要的函数 //初始化APC的时候需要用到,具体的信息请Google typedef enum _KAPC_ENVIRONMENT { OriginalApcEnvironment, AttachedApcEnvironment, CurrentApcEnvironment, InsertApcEnvironment } KAPC_ENVIRONMENT; extern "C" VOID NTAPI KeInitializeApc( __in PKAPC Apc, __in PKTHREAD Thread, __in KAPC_ENVIRONMENT TargetEnvironment, __in PKKERNEL_ROUTINE KernelRoutine, __in_opt PKRUNDOWN_ROUTINE RundownRoutine, __in PKNORMAL_ROUTINE NormalRoutine, __in KPROCESSOR_MODE Mode, __in PVOID Context ); extern "C" BOOLEAN NTAPI KeInsertQueueApc(IN PKAPC Apc, IN PVOID SystemArgument1, IN PVOID SystemArgument2, IN KPRIORITY PriorityBoost); extern "C" PEPROCESS NTAPI IoThreadToProcess ( __in PETHREAD Thread );
我自定义了一个函数,你只需要将进程的PID传入即可,另外还有一个回调函数,其内部完成了对进程的关闭处理.
//插入APC终止
void KillByApc(ULONG pid);
还有就是,我用了PsLookupProcessByProcessId未导出的函数,所以需要自行获取,这里是这个函数的原型.
typedef NTSTATUS (*funPsLookupProcessByProcessId)(IN ULONG ID,OUT PEPROCESS *pProcess);
下面是小悠做的测试截图:
上面我终止了PID为2712的记事本程序,终止后的截图:
程序已经成功的自我终结了.
好了,下面我附加上对应的.h和.cpp文件
解压密码 yscode
百度网盘下载地址:http://pan.baidu.com/s/1mgHoSNu