网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

插入APC,让进程“自杀”关闭


懒散了好几天了,网站也懒得更新了,今天下午整了R0层的进程强制关闭进程模块儿的编写,虽然蓝屏了好多次,但是最终也是成功完成了吧,这里小悠就跟大家分享一下其中的一个方法,插入线程APC的方式让进程自杀,完成对进程的关闭.

                                             

这里先说说APC是神马东西吧,APC (Asynchronous procedure call)异步过程调用,就是当一个操作结束后系统立刻回调一个之前指定的回调例程,就像Win32中的消息机制似的,系统捕获完消息之后马上调动我们指定的消息回调函数;就像你朋友对你说你吃完饭之后“叫”我一下,我们一起打球去.这个叫就是异步的回调.

 

每一个线程都会维护一个对应的APC队列,队列里存放这回调函数的信息,这样线程就能准确的调用回调函数了,然而APC的回调函数要想被调用是需要条件的,只有线程处于警惕(Alert)状态的时候,线程才去查看APC队列执行回调函数。Win32API中有多个API可以使线程进入警惕状态,比如SleepExWaitForSingleObjectEx这个**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);


 

 

下面是小悠做的测试截图:

上面我终止了PID2712的记事本程序,终止后的截图:

程序已经成功的自我终结了.

 

好了,下面我附加上对应的.h.cpp文件

解压密码 yscode

百度网盘下载地址:http://pan.baidu.com/s/1mgHoSNu



 

 


  • 标签:
  • 插入APC终止进程
  • 异步过程调用
  • R0 APC
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.