HanDs
管理员

[Visual Studio文章] N种终止进程的方法 





学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

       原文地址和作者我已经不记得了,请作者见谅。

        看之前请先看下“终止进程的内幕”

        http://tieba.baidu.com/f?kz=13745064

      1.使用 FindWindow 的方法,然后想窗口发送 WM_CLOSE 的消息

       2.找到进程的线程, PostThreadMessage 发送 WM_QUIT 消息结束主线程

       3.OpenThread ---> TerminateThread

       4.RemoteExitProcess,以 PROCESS_CREATE_THREAD|VM_OPERATION方式打开进程,然后创建个远程线程,线程开始地址是 ExitProcess 参数0 ,程序自行了断.

       5.首先确保进程能被打开(8和9介绍),然后创建一个线程去 DebugActiveProcess 他,然后什么也不做退出线程,程序无人接管,于是挂掉~

       6.以 VM_OPERATION方式打开进程, 然后调用 NtUnmapViewOfSection 卸载掉他的ntdll.dll 这个时候程序还未崩溃,然后再随意发送个消息给它,它的程序一经调用直接就会异常,但是ntdll已经挂掉,无法用户空间异常处理,自行了断~(我认为这个方法应和往进程空间写垃圾数据属于同一方法)

       7.发送键盘 ESC 单击的消息(这个和发送窗口消息不能算同一个的).

       8.下面是重点要介绍的:-----------------------------
由于CrackMeApp打开了驱动的文件句柄,所以直接不能卸载驱动的.因此需要把这个句柄给关闭.
于是怎么去获取远程的文件句柄呢?首先想到的是 DuplicateHandle ,
BOOL DuplicateHandle(
   HANDLE hSourceProcessHandle,   // handle to source process
   HANDLE hSourceHandle,       // handle to duplicate
   HANDLE hTargetProcessHandle,   // handle to target process
   LPHANDLE lpTargetHandle,    // duplicate handle
   DWORD dwDesiredAccess,        // requested access
   BOOL bInheritHandle,       // handle inheritance option
   DWORD dwOptions             // optional actions
);

先看最后一个参数:
DUPLICATE_CLOSE_SOURCE
Closes the source handle. This occurs regardless of any error status returned.
DUPLICATE_SAME_ACCESS
Ignores the dwDesiredAccess parameter. The duplicate handle has the same access as the source handle.

也就是说当我们选择DUPLICATE_CLOSE_SOURCE时,远程的句柄就会自动关闭了

第一个参数,我们可以直接OpenProcess(PROCESS_DUP_HANDLE ,XXX)获得,
第二个参数比较难找,就是CrackMeApp进程里打开驱动的句柄,要想获得这个我们得借助个ntdll.dll中的一个 API, ZwQuerySystemInformation 这个可以获得整个系统中所有的句柄信息,我们可以全部找出来,然后判断哪些句柄是属于 CrackMeApp进程的,并且ObjectTypeNumber类型为文件类型的.关于这个的具体实现可以看我的实现代码.

typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
   ULONG ProcessId;
   UCHAR ObjectTypeNumber;
   UCHAR Flags;   // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
   USHORT Handle;
   PVOID Object;
   ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

这样CrackMeApp进程中通过CreateFile打开的句柄就全找到了,一般有三个,我们可以把它全部都关闭,也可以只关闭最后一个(因为最后就是打开驱动的句柄,打开驱动是最后一次调用CreateFile).


这个我就得到了第二个参数,下面的参数都很简单了~

于是一调用这个 DuplicateHandle ,我们不仅关闭了远程的句柄,而且还获得了驱动的句柄,为所欲为了~~

于是我的第8个方法就是发送IO请求到CrackMeApp的驱动里,请求它修改被保护的进程PID为0,这样我们就可以用常规方法结束它了(Open+Terminate)

       9.上面方法的远程句柄关闭了,我们就自然可以去卸载驱动了~于是这个就是去 ZwUnloadDriver或者停止了它的Service.这样再用常规方法结束~~

       10.所有的win32子系统的进程都会有一个句柄在csrss.exe进程里面,CrackMeApp.exe自然也在,于是我们就可以把 csrss.exe 里面的句柄给 dup 过来自己使用,DUP过来的方法大致和上面相同,不过判断的进程该为csrss,类型要该为5(进程句柄的类型),然后呢对每个进程句柄做一个ZwQueryInformationProcess() 参数为 BASIC_INFORMATION=0 的查询,看看这个句柄是不是CrackMeApp的 ,如果是就直接拿来用,TerminateProcess之~

---------------以下是用借助驱动来结束的-----------

       11.用驱动patch了它的保护的PID值,然后用户空间里常规方法~

       12.用驱动恢复SSDT中ZwOpenProcess,这里我偷懒直接硬编码,调用那个驱动自身的恢复SSDT的函数,嘿嘿~~之后用户空间里常规方法(这个和11不算一种的)

       13.直接在驱动里调用 NtOpenProcess绕过它的SSDT HOOK就可以了,不过应该注意的是需要先把 KTHREAD 结构体里的 PreviousMode 值改为KernelMode,否则有可能会失败的~
获取句柄后调用ZwTerminateProcess,这个不需要修改PreviousMode,直接用就可以~

       14.和13的方法不同的是打开句柄的方法,使用了 PsLookupProcessByProcessId+ObOpenObjectByPointer的方法,然后还是调用 ZwTerminateProcess~(这个也要算不同的,,因为规则上曾经说过ObXXX和NtXX算不同的API的)

       15.最后一种了,首先获取CrackMeApp线程的TID,然后根据 PsLookupThreadByThreadId 获取 EThread 指针,然后向这个线程插入APC调用,在APC过程函数中,主要是执行的 ZwTerminateProcess( 0xffffffff, 0 );这个东西就是结束自己的意思(嘿嘿,,这个方法是我从IceSword里面抠出来的)~~本来想去调用Nt/ZwTerminateThread,结果那个函数没导出还得自己找,于是索性就简单点ZwTerminateProcess了.

       16 内存清零大法

       http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4/blog/item/255cd583fe406698f603a6f2.html

       17 作业方式终止

     ZwOpenProcess->ZwCreateJobObject->ZwAssignProcessToJobObject->ZwTerminateJobObject

二 枚举进程

      转自V大http://hi.baidu.com/killvxk这是V大的空间,请自己查找

      killvxk的驱动查进程:
      1.native api获得进程表a
      2.通过activelist获得进程表b
      3.通过pspCidTable获得进程表c
      4.通过handletablelisthead获得进程表d
      5.通过csrss的handletable用2种方法枚举获得进程表e和f
      6.通过扫描当前进程的handletable获得进程表g
      7.遍历表c的每一个进程的SessionProcessLinks获得进程表h
      8.遍历表c的每一个进程Vm.WorkingSetExpansionLinks获得进程表i
      9.通过Typelist分别取process和thread的表j和表k
      10.通过表k得到进程表l
      11.搜索内存中的threadobject和processobject得到进程表m
      12.通过Wait/Dispatch得到进程表n
      13.如果系统是Win2003以上遍历表c的每一个进程的MmProcessLinks得到表o
      14.综合上面的进程表得到表p
      15.对表p每一个进程做HandleTable,Vm.WorkXX,MmProcessXX,SessionProcessList扫描得到表q
      16.枚举HWNDHandle得到进程表r
      17.枚举JobObject得到表s
      18.综合得表t,此时枚举结束~~

动态部分:
KiReadyThread
和KiSwapContext的钩子
还有KiService钩子
还有CreateProcessNotifyRoutine和CreateThreadNotifyRoutine
NtCreateThread钩子
动态维护一张表,静态枚举结束后综合两表~


三 进程隐藏

         转自http://hi.baidu.com/sudami/blog/item/96f1f245db0e2c25cffca385.html

         1 HOOK SSDT---> ZwQuerySystemInformation

          2 在EPROCESS中的ActiveProcessLinks 里摘除自身,也就是操作链表,摘除一个结点.

          3 从csrss.exe进程的句柄表中摘除自身    参看 futo_enhaced 从http://hi.baidu.com/sudami/搜索下载

          4 挂钩SwapContext,自己实现线程调度

          参考地址:http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4/blog/item/8852b4c58b5b72a18226ac17.html

           5 从PspCidTable表中摘除自身        参看     futo_enhaced      从http://hi.baidu.com/sudami/搜索下载

           6 清除标志 防止暴力搜索内存

四 进程防杀

(貌似只有思路,其实代码网上都有,请自行GOOGLE吧)

           HOOK法:

           1 HOOK HOOK NtTerminateProcess

           2 HOOK ZWOpenProcess/ ObReferenceObjectByHandle    

           参考:http://hi.baidu.com/%C3%F7%ED%F8%B5%C4%D0%C4/blog/item/6a4486f8a5c82d51242df253.html     

           3 HOOK hook KiInsertQueueApc/KeInsertQueueApc

           其实从上到下可HOOK的地方很多,请发挥想象力。

           DKOM法:

           5 kernel apc disable

           6 抹去PspCidTable

           7 thread terminated

           8 thread cross thread flags


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
N 种终止进程的方法
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复