• 블루스크린 출력 함수
    프로그래밍/C# + Unity 2019. 3. 22. 23:14
    728x90

    소스 코드

    [DllImport("ntdll.dll", SetLastError = true)]//bluescreen
    private static extern int NtSetInformationProcess(IntPtr hProcess, int processInformationClass, ref int processInformation, int processInformationLength);
    
    public void Callbulescreen() {
        int isCritical = 1;
        int BreakOnTermination = 0x1D;
        Process.EnterDebugMode();
        NtSetInformationProcess(Process.GetCurrentProcess().Handle, BreakOnTermination, ref isCritical, sizeof(int));
    
    }

     

    설명

    이 코드는 C#에서 Windows 운영 체제의 ntdll.dll 라이브러리의 NtSetInformationProcess 함수를 호출하여 시스템 레벨의 작업을 수행하는 기능을 제공한다.

    1. DllImport를 사용하여 ntdll.dll에서 NtSetInformationProcess 함수를 가져옵니다. 이 함수는 Windows 내부에서 사용되는 함수로, 일반적으로 직접 호출되지 않는 함수이다. 여기서 SetLastError 플래그가 true로 설정되어 있고 오류가 발생할 경우 GetLastError 함수를 사용하여 오류 코드를 가져온다.
    2. NtSetInformationProcess 함수는 IntPtr hProcess, int processInformationClass, ref int processInformation, int processInformationLength 네 개의 매개변수를 가진다.
      • hProcess: 프로세스 핸들을 나타내는 포인터
      • processInformationClass: 설정하려는 프로세스 정보의 종류
      • processInformation: 설정할 프로세스 정보에 대한 데이터
      • processInformationLength: 프로세스 정보 데이터의 길이
    3. Callbulescreen 메서드는 먼저 isCritical 변수를 1로 설정한다. 이 변수는 프로세스를 임계 상태로 설정하는 데 사용된다.
    4. BreakOnTermination 변수는 프로세스 종료 시 디버깅을 중단할지 여부를 지정하는데 사용된다. 여기서는 0x1D라는 특정한 값으로 설정되는데, 이 값은 Windows 내부적으로 프로세스를 종료할 때 디버깅을 중단하도록 지정하는 상수이다.
    5. Process.EnterDebugMode()를 호출하여 현재 프로세스를 디버깅 모드로 설정한다.
    6. NtSetInformationProcess 함수를 호출하여 현재 프로세스의 정보를 설정한다. 여기서는 프로세스가 임계 상태로 설정하고 프로세스가 종료될 때도 디버깅이 중단도록 설정된다.

    결론

    위의 코드는 프로세스의 종료 시 디버깅을 중단하도록 설정하는 기능을 제공한다. 이는 해당 프로세스에 디버깅 모드로 진입하려고 함에도 디버깅할 수 없어 블루스크린이 발생한다.


    728x90

    댓글

Copyright ⓒ syudal.tistory.com