提升权限获取其他系统进程的路径(转)
2007-03-20 20:31
495 查看
源代码下载地址:http://timw_web.home4u.china.com/myzhuowen/propath/showprocesspath2.zip
一:程序说明:
最近整理文档,发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决:原文中的程序无法获取系统进程的路径,如:csrss.exe。记得VCKBASE上有位网友说过一个方法:“给枚举的进程增加SE_DEBUG_NAME权限即可”,于是在网上找了些资料,解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友!
我自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):
//////////////////////////////////////////////////////////////////////
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
return( (GetLastError()==ERROR_SUCCESS) );
}
//////////////////////////////////////////////////////////////////////
通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。
二:具体实践:
//////////////////////////////////////////////////////////////////////////////////
/*
* ShowProcessPath 2.0
* 版权所有 (C) 2005 赵春生
* 2005.09.02
* http://timw.yeah.net * http://timw.126.com * 本程序适用于:WinNT
* 代码在Win2000P+SP4 + VC6+SP6测试通过
*/
#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )
//自定义函数:赋予指定特权。这里用来提升程序权限。
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);
int main(void)
{
DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];
HANDLE hToken;
printf("ShowProcessPath 2.0 with [Process Status API]/n/n");
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{
if (EnablePrivilege(hToken,SE_DEBUG_NAME))
{
EnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);
for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
GetShortPathName(path,path,256);
itoa(processid[i],temp,10);
printf("%s --- %s/n",path,temp);
}
else
printf("Failed!!!/n");
}
}
}
CloseHandle(hProcess);
CloseHandle(hModule);
itoa(processcount,temp,10);
printf("/nProcess Count:%s/n/n",temp);
return 0;
}
//////////////////////////////////////////////////////////////////////
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
return( (GetLastError()==ERROR_SUCCESS) );
}
三:以上代码在Win2000P+SP4 + VC6+SP6测试通过。
源码可从我的个人主页下载。
http://timw.yeah.net
http://timw.126.com
一:程序说明:
最近整理文档,发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决:原文中的程序无法获取系统进程的路径,如:csrss.exe。记得VCKBASE上有位网友说过一个方法:“给枚举的进程增加SE_DEBUG_NAME权限即可”,于是在网上找了些资料,解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友!
我自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):
//////////////////////////////////////////////////////////////////////
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
return( (GetLastError()==ERROR_SUCCESS) );
}
//////////////////////////////////////////////////////////////////////
通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。
二:具体实践:
//////////////////////////////////////////////////////////////////////////////////
/*
* ShowProcessPath 2.0
* 版权所有 (C) 2005 赵春生
* 2005.09.02
* http://timw.yeah.net * http://timw.126.com * 本程序适用于:WinNT
* 代码在Win2000P+SP4 + VC6+SP6测试通过
*/
#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )
//自定义函数:赋予指定特权。这里用来提升程序权限。
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);
int main(void)
{
DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];
HANDLE hToken;
printf("ShowProcessPath 2.0 with [Process Status API]/n/n");
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{
if (EnablePrivilege(hToken,SE_DEBUG_NAME))
{
EnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);
for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
GetShortPathName(path,path,256);
itoa(processid[i],temp,10);
printf("%s --- %s/n",path,temp);
}
else
printf("Failed!!!/n");
}
}
}
CloseHandle(hProcess);
CloseHandle(hModule);
itoa(processcount,temp,10);
printf("/nProcess Count:%s/n/n",temp);
return 0;
}
//////////////////////////////////////////////////////////////////////
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
return( (GetLastError()==ERROR_SUCCESS) );
}
三:以上代码在Win2000P+SP4 + VC6+SP6测试通过。
源码可从我的个人主页下载。
http://timw.yeah.net
http://timw.126.com
相关文章推荐
- 提升权限获取其他系统进程的路径(转)
- 《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
- 提升权限并枚举系统进程
- 读取其他进程的内存-让程序提升Debug权限
- 64位系统下C++获取当前所有进程的完整路径
- 获取NT中系统进程的路径
- 进程系统权限的提升
- 《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
- 通过获取系统进程快照获取进程pid以及杀进程(win下获取进程名和linux下获取进程路径)
- 获取Windows系统的进程运行信息
- 使用wmic获取运行中进程的路径
- Delphi获取系统特殊路径
- C#获取用户桌面等特殊系统路径
- 获取SAP系统sap_all权限
- Delphi 获取系统相关路径 -- SHGetSpecialFolderLocation
- windows8 系统获取超级管理员权限
- 防火墙普遍存在的设计缺陷--关于进程路径的获取
- 管理员组获取系统权限的完美解决方案
- C#获取当前活动窗口进程、进程ID、程序路径
- 14、Android开发基础之通过系统提供的方法获取到保存文件的路径