PIDのサービスSERVER.EXEプロセスへのアクセス(0クラッシュ)

#include " stdafx.hを" 
の#include <windows.hに>  
する#include <iostreamの> 
の#include <COMDEF.H>  
書式#include <stdio.hに>  
する#include <Tlhelp32.h>
 使用して 名前空間はstd; 


typedefは構造体_UNICODE_STRING { 
    ; USHORT長 
    USHORT MaximumLength; 
    PWSTRバッファー; 
} UNICODE_STRING、 * PUNICODE_STRING。

// SystemProcessInformation 
のtypedef 構造体_SYSTEM_PROCESS_INFORMATION 
{ 
    DWORD dwNextEntryOffset。
    DWORD dwNumberOfThreads; 
    LARGE_INTEGER qSpareLi1; 
    LARGE_INTEGER qSpareLi2; 
    LARGE_INTEGER qSpareLi3; 
    LARGE_INTEGER qCreateTime; 
    LARGE_INTEGER qUserTime; 
    LARGE_INTEGER qKernelTime; 
    UNICODE_STRING imagenameの; 
    int型                 nBasePriority; 
    DWORD dwProcessId; 
    DWORD dwInheritedFromUniqueProcessId; 
    DWORD dwHandleCount; 
    DWORD dwSessionId; 
    ULONG dwSpareUl3; 
    SIZE_T tPeakVirtualSize; 
    SIZE_T tVirtualSize; 
    DWORD dwPageFaultCount;
    DWORD dwPeakWorkingSetSize;
    DWORD dwWorkingSetSize; 
    SIZE_T tQuotaPeakPagedPoolUsage; 
    SIZE_T tQuotaPagedPoolUsage; 
    SIZE_T tQuotaPeakNonPagedPoolUsage; 
    SIZE_T tQuotaNonPagedPoolUsage; 
    SIZE_T tPagefileUsage; 
    SIZE_T tPeakPagefileUsage; 
    SIZE_T tPrivatePageCount; 
    LARGE_INTEGER qReadOperationCount; 
    LARGE_INTEGER qWriteOperationCount; 
    LARGE_INTEGER qOtherOperationCount; 
    LARGE_INTEGER qReadTransferCount; 
    LARGE_INTEGER qWriteTransferCount; 
    LARGE_INTEGER qOtherTransferCount;
} SYSTEM_PROCESS_INFORMATION。


/ * --------------------------------------------- ------- 
       機能の説明:動的動的ライブラリファイルの読み込み
           pDllNameライブラリファイル名、pProcNameエクスポート機能名:入力パラメータ
           出力パラメータ:なし
           戻り値:関数のアドレスを返します
----------- -------------------------------------------------- * / 

VOID * GetDllProc(のconst TCHAR * pDllName、CONST CHAR * pProcName)
{ 
    HMODULE HMOD; 
    HMODは = のLoadLibrary(pDllName)を、
     IF(HMOD == NULL)
         戻りNULL; 

    返す(HMOD、pProcName)のGetProcAddressを; 
} 

//宏定义函数的指针
typedefのLONG(WINAPI * Fun_NtQuerySystemInformation)(int型   SystemInformationClassを、
    OUT PVOID SystemInformation、
    ULONG SystemInformationLengthでは、
    ULONG OUT * pReturnLengthオプション)。

typedefをBYTE(WINAPI * Fun_WinStationGetProcessSid)(hServer、DWORD PROCESSID、HANDLE 

    FILETIME PROCESSSTARTTIME、PBYTE pProcessUserSid、PDWORD dwSidSizeを)。

typedef VOID(WINAPI * Fun_CachedGetUserFromSid)(PSIDとPSID、PWCHAR pUserName、PULONG cbUserName)。

#define STATUS_INFO_LENGTH_MISMATCH((LONG)0xC0000004L)の#define SystemProcessInformation 5 / *




-------------------------------------------------- ---------------- 
     機能説明:情報処理システムを取得
         SYSTEM_PROCESS_INFORMATIONの:入力パラメータ
         出力パラメータを:なし

------------------ -------------------------------------------------- * / 
BOOL GetSysProcInfo(SYSTEM_PROCESS_INFORMATION * ppSysProcInfo)
{ 
    Fun_NtQuerySystemInformation _NtQuerySystemInformation; 
    _NtQuerySystemInformation =(Fun_NtQuerySystemInformation):: GetDllProc(TEXT(" NTDLL.DLL ")、" NtQuerySystemInformation " );
     IF(_NtQuerySystemInformation == NULL)
         リターンFALSE; 

    DWORD dwSize = 1024 * 1024 ; 
    VOID * PBUF = NULL; 
    LONG lRetVal; 

    一方、
    { 
        場合(PBUF)
             フリー(PBUF)。

        PBUF =(ボイド*)のmalloc (dwSize)。

        lRetVal = _NtQuerySystemInformation(SystemProcessInformation、PBUF、dwSize、NULL); 

        もし(!STATUS_INFO_LENGTH_MISMATCH = lRetVal)
             ブレーク
        dwSize * = 2 ; 
    } 

    場合(lRetVal == 0 
    {
         * ppSysProcInfo =(SYSTEM_PROCESS_INFORMATION * )PBUF。
        返すTRUE; 
    } 
    フリー(PBUF)。
    返すFALSE; 
} 



BOOL GetProcessUser(DWORD dwPid、_bstr_t * pbStrUser)
{ 
    Fun_WinStationGetProcessSid _WinStationGetProcessSid。
    Fun_CachedGetUserFromSid _CachedGetUserFromSid; 

    _WinStationGetProcessSid = (Fun_WinStationGetProcessSid)
        GetDllProc(TEXT(" Winsta.dll ")、" WinStationGetProcessSid ")。
    _CachedGetUserFromSid = (Fun_CachedGetUserFromSid)
        GetDllProc(TEXT(" utildll.dll ")、" CachedGetUserFromSid " )。

    もし(_WinStationGetProcessSid == NULL || _CachedGetUserFromSid == NULL)
         を返すFALSE; 

    BYTE cRetVal; 
    FILETIME ftStartTime; 
    DWORD dwSize; 
    BYTEの *のPSID。
    BOOL bRetVal、bFind。
    SYSTEM_PROCESS_INFORMATION * pProcInfo、* pCurProcInfo。

    bRetVal = GetSysProcInfo(&pProcInfo)。
    もし(bRetVal == FALSE || pProcInfo == NULL)を
         返すFALSE。

    bFind = FALSE; 
    pCurProcInfo = pProcInfo。
    (;;)
    { 
        場合(pCurProcInfo-> dwProcessId == dwPid)
        { 
            のmemcpy(&ftStartTime、&pCurProcInfo-> qCreateTime、はsizeof (ftStartTime))。
            bFind = TRUE;
            破ります; 
        } 

        であれば(pCurProcInfo-> dwNextEntryOffset == 0 ブレーク
        pCurProcInfo=(SYSTEM_PROCESS_INFORMATION *)((BYTE *)pCurProcInfo + 
            pCurProcInfo - > dwNextEntryOffset)を、
    } 
    であれば(bFind == FALSE)
    { 
        フリー(pProcInfo)。
        返すFALSE; 
    } 

    
    cRetVal = _WinStationGetProcessSid(NULL、dwPid、ftStartTime、NULL、&dwSize)。
    もし(!cRetVal = 0 を返すFALSE; 

    PSID = 新しいBYTE [dwSize]。
    cRetVal = _WinStationGetProcessSid(NULL、dwPid、ftStartTime、PSID、&dwSize)。
    もし(cRetVal == 0
    { 
        削除[] PSIDと、
        返すFALSE; 
    } 

    WCHAR szUserName [ 1024 ]。
    
    _CachedGetUserFromSid(PSID、szUserName、 dwSize)。
    削除[] PSIDを。
    もし(dwSizeの== 0 を返すFALSE; 

    * pbStrUser = szUserName。
    返すTRUE; 
} 

ボイドAdjustPrivilege()
{ 

    hTokenをハンドルと 

    もし(!OpenProcessToken(GetCurrentProcess()、TOKEN_ADJUST_PRIVILEGES、&hToken))
    { 
        のprintf("OpenProcessTokenエラーの\ n " );
         リターン; 
    } 
    LUID myLUID; 
    LookupPrivilegeValue(NULL、SE_DEBUG_NAME、 myLUID); 
    TOKEN_PRIVILEGESのTP = { はsizeof (TP)}; 
    tp.PrivilegeCount = 1 ; 
    tp.Privileges [ 0 ] .Luid = myLUID。
    tp.Privileges [ 0 ] .Attributes = SE_PRIVILEGE_ENABLED;
     もし(AdjustTokenPrivileges(hToken、FALSE、&TP、はsizeof (TP)、NULL、NULL))
    { 
        / * メッセージボックス(NULL、TEXT( "权限提升成功")、TEXT(」 「)、0); * / 
    }
    CloseHandleを(hToken)。
} 

int型のmain()
{ 
 
    TCHAR szProcessName [] = TEXT(" SERVICES.EXE " )。
    BOOL bFind = FALSE; 
    TCHARのCH [ 256 ] = { 0 }。
    _bstr_t BS。
    memcpy(&BS、CH、はsizeof (BS))。

    PROCESSENTRY32のPE32; 
    pe32.dwSize = はsizeof (PE32)。
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS、0); // 获取进程快照
    場合(hProcessSnap ==INVALID_HANDLE_VALUE)
         リターン falseに
    BOOL bResult = Process32First(hProcessSnap、およびPE32); 
    AdjustPrivilege(); 
    一方(bResult)
    { 
          GetProcessUser(804、&BS); 
          bResult = Process32Next(hProcessSnap、およびPE32); 
    }     


        //     GetProcessUser(PI。 th32ProcessID、&BS); // 最初のパラメータが書かれている、あなたのプロセスID 
            
}

 

おすすめ

転載: www.cnblogs.com/hshy/p/11599633.html