문제

여기서 궁금합니다. Windows XP/Vista에서 .NET 관리 코드를 사용하여 Windows 블루 스크린을 호출 할 수 있습니까? 그리고 가능하다면 예제 코드는 무엇 일 수 있습니까?

기록을 위해, 이것은 악의적 인 목적을위한 것이 아니라, 지정된대로 운영 체제를 실제로 죽이는 데 어떤 종류의 코드가 필요한지 궁금합니다.

도움이 되었습니까?

해결책

키보드는 아마도 좋은 옵션 일 것입니다. 그러나 코드로해야한다면 계속 읽으십시오 ...

당신은 실제로 바프에 아무것도 필요하지 않습니다.

http://msdn.microsoft.com/en-us/library/ms801640.aspx http://msdn.microsoft.com/en-us/library/ms801645.aspx

수동으로 시작된 충돌의 경우 버그 확인 코드로 0xe2 (manually_initiated_crash) 또는 0xdeaddead (manually_initiated_crash1)를 사용하려고합니다. 그들은 그 용도를 위해 명시 적으로 예약되어 있습니다.

그러나 기능을 찾는 것은 약간 까다로울 수 있습니다. Windows DDK가 도움이 될 수 있습니다 (ntddk.h check) - 지금은 사용할 수 없으며 지금은 결정적인 정보를 찾을 수없는 것 같습니다. 생각한다 ntoskrnl.exe 또는 ntkrnlpa.exe에 있지만 확실하지 않으며 현재 확인할 도구가 없습니다.

간단한 C ++ 앱이나 기능을 호출하는 무언가를 작성한 다음 실행하는 것이 더 쉬울 수 있습니다.

당신을 생각합니다 가정합니다 이 Windows는 사용자 공간에서 기능에 액세스하는 것을 차단하지 않습니다 (.NET은 특별한 조항이있을 수 있음). 나는 그것을 직접 테스트하지 않았다.

다른 팁

그것이 실제로 작동하는지 모르겠습니다. 관리 권한이 필요하다고 확신하지만 CrashOnctrlScroll 레지스트리 키를 설정 한 다음 SendKeys를 사용하여 Ctrl+Scroll Lock+Scroll Lock을 보낼 수 있습니다.

그러나 나는 이것이 키보드 드라이버에서 나와야한다고 생각하기 때문에 간단한 sendkeys 만 충분하지 않아서 키보드 드라이버에 어떻게 든 연결해야 할 것입니다 (정말 지저분한 소리). P/호출로 호출됩니다.

http://support.microsoft.com/kb/244139

hkey_local_machine system currentControlset Services i8042Prt 매개 변수
이름 : CrashOnctrlScroll
데이터 유형 : reg_dword
가치 : 1
재시작

나는 거절해야 할 것이다. 커널 공간에 사는 드라이버 또는 기타 코드와 P/호출 및 상호 작용해야합니다. .NET 코드는 미래의 Windows 버전에서 관리되는 드라이버에 대한 이야기가 있었지만이 영역에서 멀리 떨어진 삶은 살아 있습니다. 몇 년을 더 기다리면 관리되지 않는 친구들처럼 사고 할 수 있습니다.

내가 아는 한 실제 BSOD는 커널 모드 코드에서 실패가 필요합니다. Vista는 여전히 BSOD를 가지고 있지만 새로운 드라이버 모델은 커널 모드에서 드라이버가 적기 때문에 덜 빈번합니다. 모든 사용자 모드 실패로 인해 응용 프로그램이 사망합니다.

커널 모드에서 관리 코드를 실행할 수 없습니다. 따라서 BSOD를 원한다면 Pinvoke를 사용해야합니다. 그러나 이것은 심지어 매우 어렵습니다. 커널 모드로 Barf에 무언가를 얻으려면 정말 멋진 핀 보크를해야합니다.

그러나 수천 명의 SO 사용자들 중에는 아마도 이것을 한 사람이있을 것입니다 :-)

커널 충돌을 유발하는 OSR Online 도구를 사용할 수 있습니다. 나는 그것을 직접 시도한 적이 없지만 표준 .NET 프로세스 클래스를 통해 실행할 수 있다고 생각합니다.

http://www.osronline.com/article.cfm?article=153

한 번은 .NET 1.1에서 system.net.sockets를 사용하여 Windows XP에서 BSOD를 생성했습니다. 나는 그것을 정기적으로 반복 할 수 있었지만 불행히도 그것은 몇 년 전이었고 어떻게 그것을 트리거했는지 정확히 기억하지 못하거나 더 이상 소스 코드를 가지고 있습니다.

DirectX8 또는 DirectX9에서 DirectShow를 사용하여 Live VideoInput을 사용해보십시오. 대부분의 통화는 커널 모드 비디오 드라이버로 이동합니다. 라이브 비디오 포획 소스에서 콜백 절차를 실행할 때 많은 파란색 화면으로 성공했습니다. 콜백이 오랜 시간이 걸리면 전체 커널 드라이버를 중단 할 수 있습니다.

결함이있는 커널 드라이버에 액세스 할 때 관리되는 코드가 버그 체크를 유발할 수 있습니다. 그러나 BSOD를 직접 일으키는 커널 드라이버입니다 (예 : Uffe의 DirectShow BSOD, Terence Lewis의 소켓 BSOD 또는 특정 네트워크 어댑터와 함께 BitTorrent를 사용할 때 보이는 BSOD).

권한이있는 저급 리소스에 대한 직접 사용자 모드 액세스는 버그 체크를 유발할 수 있습니다 (예 : Scribbling Device\PhysicalMemory, 먼저 하드 디스크를 손상시키지 않으면; Vista는 사용자 모드가 물리적 메모리에 액세스 할 수 없습니다).

덤프 파일 만 원한다면 Mendelt의 WindBG 사용 제안은 커널 드라이버에서 버그를 악용하는 것보다 훨씬 더 나은 아이디어입니다. 불행히도, .dump 로컬 커널 디버깅에는 명령이 지원되지 않으므로 직렬 또는 1394에 연결된 두 번째 PC 또는 가상 직렬 포트에 연결된 VM이 필요합니다. LiveKD 메모리 덤프 상태가 완전히 일관되게되기 위해 단일 PC 옵션 일 수 있습니다.

이것은 커널 모드 드라이버가 필요하지 않고 Sedebugprivilege 만 필요합니다. 프로세스를 중요하게 설정할 수 있습니다 NtSetInformationProcess, 또는 RtlSetProcessIsCritical 그리고 그냥 당신의 과정을 죽여라. 프로세스에서 동일한 "중요한"플래그를 설정하기 때문에 CSRSS.EXE를 죽이는 것과 동일한 버그 체크 코드가 표시됩니다.

불행히도, 서버에서 .NET 서비스 로이 작업을 수행하는 방법을 알고 있습니다. (참고 : XP/Vista가 아닌 Windows Server 2008 R2).

.NET 프로그램이 범인이라고 믿을 수는 없었지만 그랬습니다. 또한 가상 컴퓨터에서 BSOD를 복제했습니다.

불쾌한 코드는 0x00000F4를 유발합니다.

string name = string.Empty; // This is the cause of the problem, should check for IsNullOrWhiteSpace

foreach (Process process in Process.GetProcesses().Where(p => p.ProcessName.StartsWith(name, StringComparison.OrdinalIgnoreCase)))
{
    Check.Logging.Write("FindAndKillProcess THIS SHOULD BLUE SCREEN " + process.ProcessName);
    process.Kill();
    r = true;
}

왜 내가 왜 블루 스크린을 복제하고 싶은지 궁금해한다면 악의적 인 것은 아닙니다. 나는 로깅 클래스를 수정하여 디스크에 직접 쓰십시오 .flush () 호출에도 불구하고 BSOD 이전의 조치가 로그에 나타나지 않았습니다. 로깅 변경을 테스트하기 위해 서버 충돌을 복제했습니다. VM은 정식으로 추락했지만 벌목은 작동했습니다.

편집 : 살인 csrss.exe 블루 스크린의 원인 인 것 같습니다. 의견에 따라 커널 코드에서 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top