Author: sinister
Email: sinister@whitecell.org
Homepage:http://www.whitecell.org
Date: 2006-02-12
/*****************************************************************
文件名 : wssrun.c
描述 : 創(chuàng)建高權(quán)限進(jìn)程
作者 : sinister
最后修改日期 : 2006.2.09
*****************************************************************/
//
// 寫這個初衷是為了讓 Windows 任務(wù)管理器可以結(jié)束掉一些服務(wù)
// 和僵死進(jìn)程,用 pslist/pskill 之類工具無法獲得象任務(wù)管理
// 器那樣豐富的信息,還得來回切換,麻煩的很。最初想寫個驅(qū)動
// 監(jiān)視任務(wù)管理器運(yùn)行,使用 SYSTEM 進(jìn)程 TOKEN 替換來達(dá)到目的。
// 后來覺得通用性不好,就改用了這種方法。此方法還可使 regedit
// 查看、編輯 SAM 等注冊表鍵,何樂而不為。
//
// wssrun taskmgr.exe
// wssrun regedit.exe
//
C++代碼
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
- #pragma comment(lib,”Shlwapi.lib”)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- BOOL
- EnableDebugPriv( LPCTSTR szPrivilege )
- {
- HANDLE hToken;
- LUID sedebugnameValue;
- TOKEN_PRIVILEGES tkp;
-
- if ( !OpenProcessToken( GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
- &hToken ) )
- {
- return FALSE;
- }
- if ( !LookupPrivilegeValue( NULL, szPrivilege, &sedebugnameValue ) )
- {
- CloseHandle( hToken );
- return FALSE;
- }
-
- tkp.PrivilegeCount = 1;
- tkp.Privileges[0].Luid = sedebugnameValue;
- tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-
- if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
- {
- CloseHandle( hToken );
- return FALSE;
- }
-
- return TRUE;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- DWORD
- GetProcessId( LPCTSTR szProcName )
- {
- PROCESSENTRY32 pe;
- DWORD dwPid;
- DWORD dwRet;
- BOOL bFound = FALSE;
-
-
-
-
-
- HANDLE hSP = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
- if ( hSP )
- {
- pe.dwSize = sizeof( pe );
-
- for ( dwRet = Process32First( hSP, &pe );
- dwRet;
- dwRet = Process32Next( hSP, &pe ) )
- {
-
-
-
- if ( StrCmpNI( szProcName, pe.szExeFile, strlen( szProcName ) ) == 0 )
- {
- dwPid = pe.th32ProcessID;
- bFound = TRUE;
- break;
- }
- }
-
- CloseHandle( hSP );
-
- if ( bFound == TRUE )
- {
- return dwPid;
- }
- }
-
- return NULL;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- BOOL
- CreateSystemProcess( LPTSTR szProcessName )
- {
- HANDLE hProcess;
- HANDLE hToken, hNewToken;
- DWORD dwPid;
-
- PACL pOldDAcl = NULL;
- PACL pNewDAcl = NULL;
- BOOL bDAcl;
- BOOL bDefDAcl;
- DWORD dwRet;
-
- PACL pSacl = NULL;
- PSID pSidOwner = NULL;
- PSID pSidPrimary = NULL;
- DWORD dwAclSize = 0;
- DWORD dwSaclSize = 0;
- DWORD dwSidOwnLen = 0;
- DWORD dwSidPrimLen = 0;
-
- DWORD dwSDLen;
- EXPLICIT_ACCESS ea;
- PSECURITY_DESCRIPTOR pOrigSd = NULL;
- PSECURITY_DESCRIPTOR pNewSd = NULL;
-
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
-
- BOOL bError;
-
- if ( !EnableDebugPriv( “SeDebugPrivilege” ) )
- {
- printf( “EnableDebugPriv() to failed!\n” );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- if ( ( dwPid = GetProcessId( “WINLOGON.EXE” ) ) == NULL )
- {
- printf( “GetProcessId() to failed!\n” );
-
- bError = TRUE;
- goto Cleanup;
- }
-
- hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPid );
- if ( hProcess == NULL )
- {
- printf( “OpenProcess() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
- if ( !OpenProcessToken( hProcess, READ_CONTROL | WRITE_DAC, &hToken ) )
- {
- printf( “OpenProcessToken() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- ZeroMemory( &ea, sizeof( EXPLICIT_ACCESS ) );
- BuildExplicitAccessWithName( &ea,
- “Everyone”,
- TOKEN_ALL_ACCESS,
- GRANT_ACCESS,
- 0 );
-
- if ( !GetKernelObjectSecurity( hToken,
- DACL_SECURITY_INFORMATION,
- pOrigSd,
- 0,
- &dwSDLen ) )
- {
-
-
-
-
- if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
- {
- pOrigSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- dwSDLen );
- if ( pOrigSd == NULL )
- {
- printf( “Allocate pSd memory to failed!\n” );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- if ( !GetKernelObjectSecurity( hToken,
- DACL_SECURITY_INFORMATION,
- pOrigSd,
- dwSDLen,
- &dwSDLen ) )
- {
- printf( “GetKernelObjectSecurity() = %d\n”, GetLastError() );
- bError = TRUE;
- goto Cleanup;
- }
- }
- else
- {
- printf( “GetKernelObjectSecurity() = %d\n”, GetLastError() );
- bError = TRUE;
- goto Cleanup;
- }
- }
-
-
-
-
- if ( !GetSecurityDescriptorDacl( pOrigSd, &bDAcl, &pOldDAcl, &bDefDAcl ) )
- {
- printf( “GetSecurityDescriptorDacl() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- dwRet = SetEntriesInAcl( 1, &ea, pOldDAcl, &pNewDAcl );
- if ( dwRet != ERROR_SUCCESS )
- {
- printf( “SetEntriesInAcl() = %d\n”, GetLastError() );
- pNewDAcl = NULL;
-
- bError = TRUE;
- goto Cleanup;
- }
-
- if ( !MakeAbsoluteSD( pOrigSd,
- pNewSd,
- &dwSDLen,
- pOldDAcl,
- &dwAclSize,
- pSacl,
- &dwSaclSize,
- pSidOwner,
- &dwSidOwnLen,
- pSidPrimary,
- &dwSidPrimLen ) )
- {
-
-
-
-
- if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
- {
- pOldDAcl = ( PACL ) HeapAlloc( GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- dwAclSize );
- pSacl = ( PACL ) HeapAlloc( GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- dwSaclSize );
- pSidOwner = ( PSID ) HeapAlloc( GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- dwSidOwnLen );
- pSidPrimary = ( PSID ) HeapAlloc( GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- dwSidPrimLen );
- pNewSd = ( PSECURITY_DESCRIPTOR ) HeapAlloc( GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- dwSDLen );
-
- if ( pOldDAcl == NULL ||
- pSacl == NULL ||
- pSidOwner == NULL ||
- pSidPrimary == NULL ||
- pNewSd == NULL )
- {
- printf( “Allocate SID or ACL to failed!\n” );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
-
- if ( !MakeAbsoluteSD( pOrigSd,
- pNewSd,
- &dwSDLen,
- pOldDAcl,
- &dwAclSize,
- pSacl,
- &dwSaclSize,
- pSidOwner,
- &dwSidOwnLen,
- pSidPrimary,
- &dwSidPrimLen ) )
- {
- printf( “MakeAbsoluteSD() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
- }
- else
- {
- printf( “MakeAbsoluteSD() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
- }
-
-
-
-
-
- if ( !SetSecurityDescriptorDacl( pNewSd, bDAcl, pNewDAcl, bDefDAcl ) )
- {
- printf( “SetSecurityDescriptorDacl() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- if ( !SetKernelObjectSecurity( hToken, DACL_SECURITY_INFORMATION, pNewSd ) )
- {
- printf( “SetKernelObjectSecurity() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- if ( !OpenProcessToken( hProcess, TOKEN_ALL_ACCESS, &hToken ) )
- {
- printf( “OpenProcessToken() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
-
-
- if ( !DuplicateTokenEx( hToken,
- TOKEN_ALL_ACCESS,
- NULL,
- SecurityImpersonation,
- TokenPrimary,
- &hNewToken ) )
- {
- printf( “DuplicateTokenEx() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
-
- ZeroMemory( &si, sizeof( STARTUPINFO ) );
- si.cb = sizeof( STARTUPINFO );
-
-
-
-
-
- ImpersonateLoggedOnUser( hNewToken );
-
-
-
-
-
-
-
-
-
-
-
- if ( !CreateProcessAsUser( hNewToken,
- NULL,
- szProcessName,
- NULL,
- NULL,
- FALSE,
- NULL,
- NULL,
- NULL,
- &si,
- π ) )
- {
- printf( “CreateProcessAsUser() = %d\n”, GetLastError() );
-
- bError = TRUE;
- goto Cleanup;
- }
-
- bError = FALSE;
-
- Cleanup:
- if ( pOrigSd )
- {
- HeapFree( GetProcessHeap(), 0, pOrigSd );
- }
- if ( pNewSd )
- {
- HeapFree( GetProcessHeap(), 0, pNewSd );
- }
- if ( pSidPrimary )
- {
- HeapFree( GetProcessHeap(), 0, pSidPrimary );
- }
- if ( pSidOwner )
- {
- HeapFree( GetProcessHeap(), 0, pSidOwner );
- }
- if ( pSacl )
- {
- HeapFree( GetProcessHeap(), 0, pSacl );
- }
- if ( pOldDAcl )
- {
- HeapFree( GetProcessHeap(), 0, pOldDAcl );
- }
-
- CloseHandle( pi.hProcess );
- CloseHandle( pi.hThread );
- CloseHandle( hToken );
- CloseHandle( hNewToken );
- CloseHandle( hProcess );
-
- if ( bError )
- {
- return FALSE;
- }
-
- return TRUE;
- }
-
-
- void
- main( int argc, char** argv )
- {
- if ( argc < 2 )
- {
- printf( “Usage: wssrun \n” );
- return ;
- }
-
- if ( CreateSystemProcess( argv[1] ) == FALSE )
- {
- printf( “wssrun: CreateSystemProcess() to failed!\n” );
- return ;
- }
- }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。