释放驱动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
相关推荐
【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案
方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。
错误模块名称: ntdll.dll 导致SQLSERVER服务停止
根据系统日志提示:错误模块名称: ntdll.dll,C:Windows\SYSTEM32\ntdll.dll 造成错误,操作系统的这个动态链接库出现问题。根据网上查找的资料分析,如果这个 ntdll.dll 没问题,那就是系统里面某些其他的 dll 损坏了。解决办法:ntdll.dll模块出问题,或者其他dll 损坏,单纯解决这些dll 文件,未必能根本上解决我呢提。建议将数据库文件备份,服务器中其他重要文件备份,重新安装数据服务器系统。有可能是 windows update 出错或者宕机造成的。
TIA PORTAL V17硬件支持包HSP(2025.04最新)
TIA PORTAL是西门子公司推出的一款集成了多种功能的自动化工程软件平台,V17版本的硬件支持包更新至2025年4月的最新版本,意味着其中包含了该时间点之前所有兼容硬件设备的支持文件、驱动程序以及相关固件等重要资料,有助于确保硬件与TIA PORTAL软件之间的正常通信和高效协作。;适合人群:从事工业自动化领域工作的工程师或技术人员,尤其是那些正在使用或者计划使用TIA PORTAL V17进行项目开发、维护的人士。;使用场景及目标:①当需要将新的硬件设备接入到基于TIA PORTAL V17构建的系统时,可以利用此硬件支持包来安装相应的驱动程序和支持文件;②对于已经存在的项目,若遇到硬件兼容性问题,也可以尝试更新硬件支持包以解决这些问题。;
内核级结束进程c代码
#include #include #include #include #pragma comment (lib,"ntdll.lib") // Copy From DDK #pragma comment (lib,"Kernel32.lib") #pragma comment (lib,"Advapi32.l
NtTerminateProcess 终止进程
用NtTerminateProcess真正终止进程. 首先,要使用Native API,要对它进行声名: typedef DWORD (CALLBACK* NTTERMINATEPROCESS)(HANDLE,UINT);NTTERMINATEPROCESS NtTerminateProcess;HMODULE hNtdll = NULL; hNtdll = LoadLibrary( "...
杀进程方法大全
Windows下杀进程22种方法: '1.结束进程 (参数:进程ID) Sub KillProcess(ByVal dwProcessId As Long) SetDebug '提权 Dim hProcess As Long '方法1,使用普通API hProcess = OpenProcess(PROCESS_TE...
Android结束进程的几种方法
结束进程的几种方法
Android 结束进程的几种方法
转自:http://www.cnblogs.com/sunjialiang/articles/2132410.html 第一种方法: 主要适合api Level ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE); am.restartPackage("com.andro
C# 结束进程或程序的几种方法
正常情况下不需要为C#的程序写结束语句的。除非在特殊情情下才需要强制退出程序,像程序开了几个互不隶属的窗口,或是创建了几个线程。但一般也不推荐强制终止,容易引发不可预测的错误。 这里有几种方法可以实现: Application.Exit()是比较彻底的终止,会结束当前的进程,但也只结束当前的进程。 this.close()是关闭语句所在的窗口。进程有可能没有结束,当然如果程序只有一个窗口的话...
QTP 结束进程的几种方法
1. Function KillProcess(ProcessName) strComputer = "." Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colProcessList = objWMIService.ExecQuery("Select * from Win32_
用系统命令结束可疑进程的几种方法
教大家不使用任何进程管理工具,只使用系统命令来结束可疑进程的几种方法。 一、用强大的ntsd命令,ntsd命令可用来结束一些常规情况下结束不了的进程。 首先要查看可疑进程的pid值,这个可以在windows任务管理器中查看到,也可以使用CMD下的tasklist命令或wmic下的process list brief命令进行查看。假如可疑进程的pid值是666和888,可疑进程或病毒进程
java安卓结束进程_Android 杀死进程几种方法详细介绍
Android 杀死进程:对于进程结束在开发APP应用当中还是有必要的,这里整理了三种方法,大家可以根据需求选用。当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用:第一种方法:首先获取当前进程的id,然后杀死该进程。android.os.Process.killProcess(android.os.Process.myPid())接下来实践一下:xmlns:tools...
如何保护进程 不被结束_如何保护隐私,Windows中你可能不知道的几种方法
如何保护隐私,Windows中你可能不知道的几种方法 7SIZE丨部分插图内容来自于网络侵权删随着电脑的普及,我们越来越习惯于将自己的文件、照片等资料放到电脑中存储,但是隐私是一个必须要考虑的问题。因为这些文件中,往往有某些东西是不想让别人看到的,也是不能共享的。而这个时候可能会有同学或者亲友要借用你的电脑,不借不合适,借给他们的话又担心自己电脑里的小秘密被发现,那么怎么办呢?没错,加密!本期,小...
【转】利用NtProtectVirtualMemory结束进程
标题:【原创】利用NtProtectVirtualMemory结束进程 作者:KiDebug 时间:2011-07-13,09:37:08 链接:http://bbs.pediy.com/showthread.php?t=137067 原理很简单,用PROCESS_VM_OPERATION打开目标进程(没必要PROCESS_ALL...
浅析360在系统的进程自保护及突破
自从改行玩硬件后,就很少关注病毒和反病毒之间的斗争了。某天在中关村论坛听到一 名网友说 360在WIN64 上有了进程自我保护,万分牛逼,连微软的Process Explorer都不 能结束呢!我听后心里十分好奇,于是重操旧业,下载了最新版本的360 安全卫士7.7版本 (2011-5-6),安装在64位 Windows 7虚拟机上来测试。 首先拿“任务管理器”...
windbg内核模式调试用户态程序
使用内核调试会话也可以执行一些用户态调试任务,比如向位于用户态的模块设置断点。但这样做与使用用户态调试器有什么不同呢?我们就以向NTDLL.dll模块的ZwTerminateProcess函数(Stub)为例谈谈二者的区别。 区别一、在内核调试会话中设置这个断点的“难度”略大些。这是因为NTDLL不属于内核态的模块,所以内核会话通常不会加载这个模块(的符号),因此当执行bp命令时很可能被自动蜕化为bu命令。 0: kd> bp ntdll!ZwTerminateProcess ..
驱动开发:内核强制结束进程运行
内核态,但有时我们不得不想办法结束掉这些特殊的进程,当然某些正常进程在特殊状态下也会无法被正常结束,此时使用驱动前行在内核态将其结束掉就变得很有用了,驱动结束进程有多种方法。存在时则可以看到结束效果,当然这种方式只是在内核层面调用了结束进程函数,其本质上还是正常结束,只是这种方式权限要大一些仅此而已。没有被导出,所以我们需要动态的这个内存地址,然后动态调用即可,这个寻找方法可以总结为以下步骤。第二种方法,其原理就是将进程内的线程全部结束掉从而让进程自动结束,由于。首先是第一种方法结束进程,封装实现。
SSDT Hook (HookZwTerminateProcess)—— 实现任务管理器无法关闭进程
本节的目的是通过驱动程序修改 ntoskrnl.exe 程序的 SSDT 表中的函数地址表,以实现 SSDT Hook 。本次的测试函数为 R3 API 函数 ZwTerminateProcess ,通过 Hook 该函数,以实现任务管理器无法强制关闭进程,只有通过进程的关闭方法才可以正常结束进程。 Hook 该函数的关键是判断 ZwTerminateProcess 函数中的进程句柄 hProcess 。当进程是通过自身的关闭方法关闭的话,该句柄的值应为 0xffffffff 或 0x00 ,而通过其他进
KeStackAttachProcess+ZwTerminateProcess结束进程的分析
某些ARK会用以下代码来结束进程,对于很多有进程保护的程序都很有效: PsLookupProcessByProcessId(); KeStackAttachProcess(); ZwTerminateProcess(0,0); 注意ZwTerminateProcess函数的第一个参数,这是要结束进程的句柄。对于进程句柄来说,-1表示当前进程,而在这里为什么用0呢?我们来分析下
6813




被折叠的 条评论
为什么被折叠?



