16,472
社区成员
发帖
与我相关
我的任务
分享
// 查找系统正在运行的进程
BOOL CProcess::EnablePrivilege(HANDLE hToken, LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;// 访问令牌权限结构变量
LUID luid;// 本地唯一标识符结构变量
// 查询SE_DEBUG_NAME权限所对应的luid值
if(!LookupPrivilegeValue(NULL,szPrivName,&luid))
{
AfxMessageBox("Lookup Privilege Value Failed...");
return 0;
}
// 填充Token_Privileges结构
tkp.PrivilegeCount=1;
tkp.Privileges[0].Luid=luid;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
// 提升权限
if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL))
{
AfxMessageBox("Adjust Token Privileges Failed...");
return 0;
}
return(GetLastError()==ERROR_SUCCESS);
}
DWORD CProcess::EnumAllProcess(CString SoftName1)
{
ENUMPROCESS pEnumProcess;
ENUMPROCESSMODULES pEnumProcessModules;
GETMODULEFILENAMEEX pGetModuleFileNameEx;
GETMODULEBASENAME pGetModuleBaseName;
HANDLE hToken;// 访问令牌句柄
DWORD dwPID[MAX_ID];// 接授进程ID的数组
DWORD cbReturn;// 返回的字节数
DWORD dwPCount;// 进程数
DWORD i;
char szFileName[MAX_PATH];// 文件名
char szPathName[MAX_PATH];// 路径名
memset(szFileName,'0',MAX_PATH);
memset(szPathName,'0',MAX_PATH);
char Id[]="ID",Pid[]="PID",Exe[]="ProcessName",Path[]="Path";
HANDLE hProcess; // 进程句柄
HMODULE hModule; // 模块句柄
HINSTANCE hPsDll;// 实例句柄
hPsDll=LoadLibrary("PSAPI.DLL");//获得DLL的实例
if(hPsDll==NULL)
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}
// 获得函数的地址
pEnumProcess=(ENUMPROCESS)GetProcAddress(hPsDll,"EnumProcesses");
pEnumProcessModules=(ENUMPROCESSMODULES)GetProcAddress(hPsDll,"EnumProcessModules");
pGetModuleFileNameEx=(GETMODULEFILENAMEEX)GetProcAddress(hPsDll,"GetModuleFileNameExA");
pGetModuleBaseName=(GETMODULEBASENAME)GetProcAddress(hPsDll,"GetModuleBaseNameA");
if(!(pEnumProcess && pEnumProcessModules && pGetModuleFileNameEx &&pGetModuleBaseName))
{
FreeLibrary(hPsDll);
AfxMessageBox("Get Processs Address Failed...");
}
CString* strName=new CString[50];
// 打开当前进程访问令牌
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
{
if(EnablePrivilege(hToken,SE_DEBUG_NAME))
{
pEnumProcess(dwPID,sizeof(dwPID),&cbReturn);// 枚举进程
dwPCount=cbReturn/sizeof(DWORD);// 计算线程总数
for(i=0;i<dwPCount-1;i++)
{
// 打开进程
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,// 访问权限
false,// 是否允许得到的进程句柄被后创建的子进程继承
dwPID[i]);//进程ID
if(hProcess)
{
// 枚举进程模块
pEnumProcessModules(hProcess,&hModule,sizeof(hModule),&cbReturn);
// 保存文件名
pGetModuleBaseName(hProcess,hModule,szFileName,sizeof(szFileName));
// printf("%-4d %-8u %-8s\n",i,dwPID[i],szFileName);
// 获得进程模块文件名(包含路径)
pGetModuleFileNameEx(hProcess,hModule,szPathName,sizeof(szPathName));
//printf("Path:%s\n\n",szPathName);
// 存数信息
//strName[i] = szFileName;
//CString str = strName[i];
if(strcmp(szFileName,SoftName1) == 0)
{
printf("123");
return dwPID[i];
}
}
}
}
}
// 关闭句柄和实例
::FindClose(hProcess);
::FindClose(hModule);
::FindClose(hToken);
::FreeLibrary(hPsDll);
return -1;
}