當服務(wù)程序需要使用某些功能時(shí),由于用戶(hù)的關(guān)系而受到限制,比如訪(fǎng)問(wèn)注冊表的HKEY_CURRENT_USER鍵,使用網(wǎng)絡(luò )等等,這時(shí)候就需要以當前登陸用戶(hù)的身份去進(jìn)行操作,通常會(huì )創(chuàng )建一個(gè)進(jìn)程來(lái)完成需要的功能。如果使用CreateProcess來(lái)創(chuàng )建進(jìn)程的話(huà),新創(chuàng )建的進(jìn)程和服務(wù)程序依然是相同的用戶(hù)身份,還是無(wú)法達到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一個(gè)參數是HANDLE hToken,該參數通常應該用LogonUser來(lái)獲得,但是LogonUser又需要用戶(hù)名和用戶(hù)密碼,這樣就很不現實(shí)。那應該怎么辦呢?一個(gè)方法可以繞過(guò)LogonUser直接獲得hToken。因為用戶(hù)已經(jīng)登陸,那么肯定有Shell(就是EXPLORER.EXE)運行了,我們可以通過(guò)遍歷進(jìn)程來(lái)取得Shell的hToken來(lái)運行進(jìn)程。下面就是示例代碼:
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
if(!lpName)
{
return FALSE;
}
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;
CloseHandle (hProcessSnap);
return (bRet);
}
BOOL RunProcess(LPCSTR lpImage)
{
if(!lpImage)
{
return FALSE;
}
HANDLE hToken;
if(!GetTokenByName(hToken, "EXPLORER.EXE "))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = TEXT( "winsta0\\default ");
BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
CloseHandle(hToken);
if(bResult)
{
OutputDebugString( "CreateProcessAsUser ok!\r\n ");
}
else
{
OutputDebugString( "CreateProcessAsUser false!\r\n ");
}
return bResult;
}
這樣就可以以登陸用戶(hù)的身份來(lái)運行程序了,呵呵。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。