win10下驱动进程保护
网上可以查到很多WIN7下的驱动后台进程保护代码而那些代码在WIN10下并不适用故写此篇来文章来总结我在编写WIN10下后台进程保护驱动程序的过程与经验,因为源码文件结构比较杂乱在此文章里我粘部分代码在最后再给出完整项目的github地址。首先说进程关闭通常会用三种方法1.利用进程管理器关闭2.打开CMD调用taskkill指令关闭3.调用taskkill加上-t参数进行强行进程关闭在代码方面与网上其他大神在win7下的进程保护驱动的代码与思路完全一致都是调用 ObRegisterCallbacks()回调函数OB_CALLBACK_REGISTRATION obReg;OB_OPERATION_REGISTRATION opReg;memset(obReg,0,sizeof(obReg));obReg.VersionObGetFilterVersion();obReg.OperationRegistrationCount1;obReg.RegistrationContextNULL;RtlInitUnicodeString(obReg.Altitude,L321000);memset(opReg,0,sizeof(opReg));//初始化结构体变量//下面请注意这个结构体的成员字段的设置opReg.ObjectTypePsProcessType;opReg.OperationsOB_OPERATION_HANDLE_CREATE|OB_OPERATION_HANDLE_DUPLICATE;opReg.PreOperation(POB_PRE_OPERATION_CALLBACK)preCall;//在这里注册一个回调函数指针obReg.OperationRegistrationopReg;//注意这一条语句returnObRegisterCallbacks(obReg,obHandle);//在这里注册回调函数preCall回调函数定义为OB_PREOP_CALLBACK_STATUSpreCall(PVOID RegistrationContext,POB_PRE_OPERATION_INFORMATION pOperationInformation){//获取pid,这里的HANDLE保存的其实是一个进程pidHANDLE pidPsGetProcessId((PEPROCESS)pOperationInformation-Object);charszProcName[16]{0};UNREFERENCED_PARAMETER(RegistrationContext);strcpy(szProcName,GetProcessImageNameByProcessID((ULONG)pid));//比较字符串返回0则字符串相同if(!_stricmp(szProcName,Project1.exe)){//如果创建句柄if(pOperationInformation-OperationOB_OPERATION_HANDLE_CREATE){//OriginalDesiredAccess为原本权限DesiredAccess为即将要更改的新权限//如果要结束进程,进程管理器结束进程发送0x1001taskkill指令结束进程发送0x0001taskkil加/f参数结束进程发送0x1401intcodepOperationInformation-Parameters-CreateHandleInformation.OriginalDesiredAccess;if((codePROCESS_TERMINATE_0)||(codePROCESS_TERMINATE_1)||(codePROCESS_KILL_F))//给进程赋予新权限pOperationInformation-Parameters-CreateHandleInformation.DesiredAccess0;//DbgPrint(hello %x, pOperationInformation-Parameters-CreateHandleInformation.OriginalDesiredAccess);}}returnOB_PREOP_SUCCESS;}要注意的是在这里负责获取进程名称以用于比较的函数GetProcessImageNameByProcessID为自定义的·我会在结尾贴上代码的github地址。看到这就会有人发现我这里的代码与网上win7下的代码别无二致其实两者区别的关键就是三个值PROCESS_TERMINATE_0PROCESS_TERMINATE_1PROCESS_KILL_F这三个值在我的自定义头文件myhead.h里是这样定义的//进程管理器结束代码#definePROCESS_TERMINATE_00x1001//taskkill指令结束代码#definePROCESS_TERMINATE_10x0001//taskkill指令加/f参数强杀进程结束码#definePROCESS_KILL_F0x1401这就是我与网上win7下的代码不一样的地方如果照搬网上win7下的代码编译后在win10下运行可能会出现被保护进程连打都打不开的现象最后程序虽然有了一定成果但是还有不足有待后续的改正首先说说成果1.可以成功防止cmd指令taskkill -pid xxx以及taskkill -f -pid xxx来关闭进程(pid为9912效果图从此可以看出虽然指令行反馈为成功实际上后台进程依然在运行再看看taskkill -f -pid从此可以看出加上-f参数的强制关闭直接反馈拒绝访问进程管理器的后台进程也是依然在运行的说明没有问题再看看进程管理器结束进程的效果在这里我要分成两种情况一种是直接打开win10下的进程管理器显示给我们的界面也就是进程管理器菜单栏那一栏显示“进程”的那个页面还有一种情况则是菜单栏显示“详细信息“的那一栏为什么我要分为两种情况因为我刚刚提到的不足就在这里再“详细信息”一栏关闭程序驱动可以正常拦截并阻止进程的关闭而在“进程”一栏的界面直接结束进程则会出现被保护的用户层程序突然出现CPU占用爆炸的情况CPU占用甚至可能会出现90%以上的现象到底是为什么我也还没有搞清楚如果有大神可以指点一二小弟感激不尽我在后续也会继续进行调试研究然后看效果图在”详细信息“一栏可以看到弹出的拒绝访问的错误弹窗说明是没问题的。在“进程“一栏CPU占用会高达90%我用这个驱动程序去保护Qt编写的运行在后台的窗口程序被保护的窗口程序也无法继续在前台正常运行最后崩溃停止运行事实上这种情况感觉就好像是随机发生的有时会出现这种情况有时又不会让人摸不着头脑。补充在Windows进程管理器下会出现CPU调用过高导致程序崩溃的原因是内存资源已被强制释放而进程又没被关闭进程又没有任何读写权限导致程序崩溃解决此问题的办法是先捕获结束进程返回码0x1001 捕获到此值后先将进程权限变为0阻止进程被关闭再进行捕获返回码0x1041如果捕获到说明就是在是在“进程”页面结束进程所以在捕获到0x1041后再恢复进程的本来所有权限就能完美解决问题了。代码地址github
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2430502.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!