{ if(S_OK==ifop->DeleteItem(pIstdel, 0)) i f op->PerformOperat i ons(); if(pIstdel) pIstdel->Release() if(pIstdes) pIstdes->Release() if(pIstdes) pIstdes->Release() if(ifop) ifop->Release(); } break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; return TRUE; 这时在cryptbase.dll中,我们就拥有管理员权限。本示例中,myCRYPTBASE.dll 启动12.exe的测试程序,这个测试程序试图在system32目录下创建hack.txt文件。由于cryptbase.dll是我们自己编写的dll, sysprep在加载后,会弹框提示用户加载错误,所以在启动12. exe后DLL_PROCESS_ATTACH 返回前调用 ExitProcess 来结束sysprep. exe。由于sysprep.exe是以管理员权限运行的,而由于WIN7的特性,参考上面的第4点,所以DLL也是管理员权限,dll执行createprocess创建的子进程也是管理员权限GPl2.exe)。 下面是演示效果,由于杀软都拦截了createremotethread这个函数,所以在创建远程线程的时候,杀软会有提示。将myCRYPTBASE.dll放在e盘的根目录下,将测试程序12.exe放在c盘的根目录下。之后运行此uacpass2.exe (确保mydll.dll与uacpass2在同一个目录下)。 在UAC开启的情况下,直接运行12.exe是会提示打开失败: ![]() 现在运行uacpass2.exe,看效果: mydll.dll 201V6/2114:00 应用程序扩展 34 KB uacpass2.exe 201V6/22 2L55 应用程序 33 KB uacpass2.pdb 20U./6/22 21:55 Program Debug... 563 KB L新建文本文档-txt 201V6/2112:56 文本文档 0 KB ![]() 总结 微软下面的几点导致这个UAC突破方法的产生。 1.对6乂口1(«^:等进程的特殊照顾,否则注入explorere创建IFileoperation会弹出uac提示。 2.对CRYPTBASE.dll的疏忽,因为这个dll不在”know dlls”目录中,才会让人有机可乘。 3. UAC需要提权时候的检测不严格,uac中有跟宿主一样的权限。 当然微软做的这些都是因为减少UAC的提示次数,否则大家将会用对待vista的态度来对 WIN7,关闭uac。 本文的所有代码在vs2010中通过编译,在win7(旗舰版,专业版)通过测试。 |