MS/C++

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

EinsteinPark 2013. 2. 14. 17:41

출처 : 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