본문 바로가기

MS/C++

보호된 프로세스로 설정하기

출처 : Devpia(http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8320&page=12)



ntdll.dll의 RtlSetProcessIsCritical로 크리티컬 프로세스로 설정하거나 상태를 알아볼 수 있습니다.

 

위의 API를 사용하려면 Privilege 권한을 획득해야 되는데 아래 링크 참조

 

Enabling and Disabling Privileges in C++

 

 

[원문] Protecting Your Process

 

[-] Collapse

#include <windows.h>
#include <stdio.h>

typedef LONG (*RtlSetProcessIsCritical) (
            IN BOOLEAN      NewValue,
            OUT PBOOLEAN    OldValue, // (optional)
            IN BOOLEAN      IsWinlogon );

BOOL EnablePriv(LPCSTR lpszPriv) // by Napalm
{
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkprivs;
    ZeroMemory(&tkprivs, sizeof(tkprivs));

    if (!OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), &hToken))
        return FALSE;

    if (!LookupPrivilegeValue(NULL, lpszPriv, &luid)) {
        CloseHandle(hToken); return FALSE;
    }

    tkprivs.PrivilegeCount = 1;
    tkprivs.Privileges[0].Luid = luid;
    tkprivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    BOOL bRet = AdjustTokenPrivileges(hToken, FALSE, &tkprivs, sizeof(tkprivs), NULL, NULL);
    CloseHandle(hToken);
    return bRet;
}

BOOL ProtectProcess() // by _FIL73R_
{
    HANDLE hDLL;
    RtlSetProcessIsCritical fSetCritical;

    hDLL = LoadLibraryA("ntdll.dll");
    if ( hDLL != NULL ) {
        EnablePriv(SE_DEBUG_NAME);
         (fSetCritical) = (RtlSetProcessIsCritical) GetProcAddress( (HINSTANCE)hDLL, "RtlSetProcessIsCritical" );
        if (!fSetCritical)
            return 0;
        fSetCritical(1, 0, 0);
        return 1;
   } else
        return 0;
}

int main (void)
{
    ProtectProcess();

    while(1) {
        // do your virus thingy -_-;;
    }

    return 0;
}

 

 

보호된 프로세스가 종료되면 잠깐 블루스크린 떳다가 리부팅 된다.

 

※ 첨부된 프로젝트는 정상 종료시 보호된 프로세스를 해제하도록 되어있음


CriticalProc.zip


'MS > C++' 카테고리의 다른 글

Jsoncpp 사용시 문제점  (0) 2015.01.29
_chkstk  (0) 2014.09.17
libcurl-7.19.3-win32-ssl-msvc dynamic dll 0xc000007b 문제  (3) 2013.06.10
curl - setopt 종류  (0) 2013.03.18
CTreeCtrl  (0) 2013.03.11
멀티바이트 --> 유니코드 (매크로)  (0) 2012.11.20
boost library 설치 방법  (0) 2012.08.10
특정 Thread가 종료 되었는지 대기중인지 알수 있는 코드  (0) 2012.08.10
OpenMP  (0) 2012.07.23
ms에서 dirent.h파일 사용 하기  (0) 2012.06.08