调整进程特权
回忆一下稍早讨论过的有关EnumProcessModules所需的进程句柄 。通常,你首先得到的是进程ID---可能是EnumProcesses返回的进程ID集中的一个 。Win32 API OpenProcess()可通过进程ID来获取其句柄 。这个函数期望一个访问标志符作为其第一个参数 。假定进程ID存放在一个DWORD类型的变量dId中,你以最大访问权限来调用OpenProcess,如下:
OpenProcess(PROCESS_ALL_ACCESS,FALSE,dId)
以获取该进程的句柄,此时你会收到一个针对几个低ID进程的错误代码 。这并不是bug---这是安全特性!这些进程都是保持系统活动的系统服务 。一个普通用户进程不允许执行针对系统服务的所有操作 。例如,允许所有进程都可以杀死系统中其余进程并不是个好主意 。如果一个程序意外终止了一个系统服务,那么整个系统都将崩溃 。因此,一个进程只有拥有确切的访问权限才会有适当的特权 。
由于多种原因,调试器必须拥有大量的权限来完成他的工作 。改变进程的特权可通过以下三个简单的基本步骤:
1.首先,必须打开进程的访问令牌(access token),使用advapi32.dll中的函数OpenProcessToken() 。
2.如果上一步正确完成,接下来就是准备TOKEN_PRIVILEGES结构,该结构包含有关要请求的特权的信息 。这个工作需要advapi32.dll中的另一个函数LookupPrivilegeValue()的帮助 。特权通过名称来指定 。SDK文档winnt.h定义了27中特权名称和其对应的符号名称 。例如,调试权限的符号名称为:SE_DEBUG_NAME,该名称和字符串“SeDebugPrivilege”等效 。
3.如果上一步正确完成,就可以使用进程的令牌句柄(Token Handle)来调用AdjustTokenPrivileges()函数以初始化TOKEN_PRIVILEGES结构 。该函数也是advapi32.dll导出的 。
如果OpenProcessToken()调用成功,要记得关闭其返回的令牌句柄(Token Handle) 。w2k_dbg.dll包含一个dbgPrivilegeSet()函数,该函数合并了这几个步骤,下面的列表1-8列出了该函数和w2k_dbg.dll中的另一个函数:dbgPrivilegeDebug() 。此函数是dbgPrivilegeSet()的一个外包函数,为了便于设定调试特权 。顺便说一下,Windows NT Server资源工具集中的kill.exe也使用了同样的技巧 。Kill.exe需要调试特权来剔除内存中饿死的服务(starved services) 。这是NT Server管理员不可缺少的一个工具,这对于重起一个挂掉的系统服务十分有用,而且可以避免不必要的系统重启 。对于使用IIS(Internet Information Server)的人,在他们的紧急工具箱中可能都有这个工具,以便重起偶尔挂掉的inerinfo.exe 。
BOOL WINAPI dbgPrivilegeSet(PWORD pwName)
{
HANDLEhToken;
TOKEN_PRIVILEGES tp;
BOOL;;fOk = FALSE;
if ( (pwName != NULL) &&
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken) )
{
if ( LookupPrivilegeValue(NULL,pwName,&tp,Privileges->Luid) )
{
;;;;tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
tp.PrivilegeCount = 1;
fOk = AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL)
; && (GetLastError() == ERROR_SUCCESS);
}
CloseHandle(hToken);
}
return fOk;
}
//------------------------------------------------------------------------------------
BOOL WINAPI dbgPrivilegeDebug(void)
{
return dbgPrivilegeSet(SE_DEBGU_NAME);
}
列表1-8; Requesting a Privilege for a Process
推荐阅读
- Windows2000的日志文件详述及删除方法
- 命令篇 Windows 2000/XP的CMD命令教程 (3)
- 2 《Undocumented Windows 2000 Secrets》翻译 --- 第三章
- 如何安装/卸载 Windows 2000 的公钥证书颁发机构
- 使用 Windows 2000 备份程序备份和还原系统状态
- 8 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- 佐助见到秽土鼬是哪集
- Windows 2000 上配置和应用安全模板
- 如何在 Windows 2000 中启用自动登录
- 2 《Undocumented Windows 2000 Secrets》翻译 --- 第四章