관리 코드를 사용하여 사망의 블루 스크린을 호출하십시오
-
07-07-2019 - |
문제
여기서 궁금합니다. 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 프로세스 클래스를 통해 실행할 수 있다고 생각합니다.
한 번은 .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 블루 스크린의 원인 인 것 같습니다. 의견에 따라 커널 코드에서 발생할 수 있습니다.