找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4862|回复: 0

【转帖】创建SYSTEM用户进程(三)(VB6.0)

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

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

本版积分规则

快速回复 返回顶部 返回列表