黑基Web安全攻防班
安基网 首页 IT技术 安全攻防 查看内容

结束进程的N种方法(RING0 AND RING3)

2009-2-22 12:46| 投稿: security

摘要: 释放驱动HOOK了SSDT表中的NtOpenProcess,但是对参数过滤不严密,只过滤   PROCESS_TERMINATE, PROCESS_WRITE, XXXX(忘记了)...
释放驱动HOOK了SSDT表中的NtOpenProcess,但是对参数过滤不严密,只过滤   PROCESS_TERMINATE, PROCESS_WRITE, XXXX(忘记了),,三种.然后比较的PID是放在全局变量中,可以通过发送 DeviceIoControl 改变这个值~ 所以我们还是可以以其他的参数打开这个进程的(只要不含有那三个参数)~ 不过大家似乎都不感兴趣这个题目,于是代码就不放了,想要可以直接给我消息.顺便要求刀客公开他的方法~~ 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了. 我的方法都较普通,跟你差不多驱动中只用了4种方法方法11:在驱动中NtOpenProcess取得句柄, 然后在驱动中TerminateProcess 方法12:PsLookupProcessByProcessId取得Process,然后切换到进程空间,最后ZwTerminateProcess(NULL, 0); 方法13:通过ObOpenObjectByPointer获取句柄,然后Terminate 方法14:恢复SSDT(ZwOpenProcess),然后在应用层直接OpenProcess并Terminate

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部