Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
Ну и зачем это в статьи писать? 28.12.04 07:26 Число просмотров: 3365
Автор: AlexD <Alexander> Статус: Member
|
CSRSS - это кусок подсистемы win32, напрямую связанный с ее реализацией в ядре - win32k.sys. Он напрямую участвует в выводе на экран этого MessageBox. Естественно, никто при разработке не планировал, что туда полезет пользователь.
А с админскими правами можно даже диск отформатировать, железо программно попортить....странно, да?
|
<site updates>
|
BSOD из user mode: бывает и такое 26.12.04 19:27
Publisher: dl <Dmitry Leonov>
|
BSOD из user mode: бывает и такое YuraN
При написании программы, целью которой было спрятаться куда подальше от глаз пользователя, я сделал так, чтоб она пряталась в другом процессе. Для отладки созданный поток выводил сообщение с его PID и TID MessageBox'ом.
Когда программа уже была готова, я решил, что пора бы ей брать привилегию отладчика, дабы прятаться и в системых процессах (а-ля winlogon, svchost, etc). Сказано - сделано. Однако, забыв о том, что системному процессу вряд ли разрешено использовать GUI, а если и разрешено, то он может быть на другом десктопе, отладочные сообщения я не убрал. При первом же запуске вывалился BSOD.
В результате выяснил, что машина падает при вызове MessageBox в csrss.exe (стоит отметить, что это не первый BSOD, вызываемый этим процессом).
Избавиться от этой "возможности" можно, убрав права отладки
(secpol.msc -> Local Policies -> User Rights Assignment -> Debug Programs)
Исходник прилагается, для сборки использовался Visual C 6.
/*
************************************************************************...
Полный текст
|
|
Ну и зачем это в статьи писать? 28.12.04 07:26
Автор: AlexD <Alexander> Статус: Member
|
CSRSS - это кусок подсистемы win32, напрямую связанный с ее реализацией в ядре - win32k.sys. Он напрямую участвует в выводе на экран этого MessageBox. Естественно, никто при разработке не планировал, что туда полезет пользователь.
А с админскими правами можно даже диск отформатировать, железо программно попортить....странно, да?
|
| |
для коллекции преимущественно 28.12.04 17:29
Автор: dl <Dmitry Leonov>
|
Человек прислал пример кода, мне он показался любопытным и поучительным, я попросил оформить как статью. Если у кого-то из посчитавших этот пример слишком очевидным найдется время и желание расписать нечто более обобщенное, я буду только рад.
|
|
с debug priveleges можно и из своего процесса bsod вызвать. 27.12.04 09:29
Автор: r4dx Статус: Незарегистрированный пользователь
|
с debug priveleges можно и из своего процесса bsod вызвать.
например сделать WriteProcessMemory на winlogon'овсий eip (GetThreadContext+OpenThread) :P
ну или даже просто завершить winlogon (любой другой необходимый для нормальной работы сервис). даже сорс мой старый могу дать...
.data
token_priv dd 1
p_luid dq ?
szdp db "SeDebugPrivilege",0
p_token dd ?
szwin db "NDDEAgnt",0
dpid dd 0
.code
start:
invoke GetCurrentProcess
invoke OpenProcessToken, eax, 20h, o p_token
dec eax
jnz exit
invoke LookupPrivilegeValueA, eax, o szdp, o p_luid
dec eax
jnz exit
invoke AdjustTokenPrivileges, p_token, eax, o token_priv, 10h, eax, eax
invoke FindWindow, o szwin, 0
invoke GetWindowThreadProcessId, eax, o dpid
invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, dpid
invoke TerminateProcess, eax, 0
exit: invoke ExitProcess, 0
end start
|
| |
Согласен, еще один способ - SetContext 27.12.04 12:31
Автор: amirul <Serge> Статус: The Elderman
|
С его помощью можно установить ядерный контекст в котором винда уже не будет разбираться с виртуальной памятью и выпадет в бсод
|
| | |
неправда! 27.12.04 23:11
Автор: r4dx Статус: Незарегистрированный пользователь
|
> С его помощью можно установить ядерный контекст в котором > винда уже не будет разбираться с виртуальной памятью и > выпадет в бсод неправда!
нельзя установить еip в context, больший чем максимальный адрес user-mode режима.
тока щазз сорс написал - не работает (все ф-ии возвращают GetLastError=0)
.data
a dd 1
lu dq 0
aaaa db "SeDebugPrivilege",0
.code
kern: jmp $
start:
xor esi, esi
push esi
callx CreateThread, esi, esi, o kern, esi, CREATE_SUSPENDED, esp
mov edi, eax
call GetCurrentProcess
callx OpenProcessToken, eax, 20h, esp
pop ebx
dec eax
jnz exit
callx LookupPrivilegeValueA, esi, o aaaa, o lu
dec eax
jnz exit
callx AdjustTokenPrivileges, ebx, esi, o a, 10h, esi, esi
or eax, eax
jz exit
sub esp, sizeof(CONTEXT)
callx GetThreadContext, edi, esp
mov [esp+CONTEXT.regEip], 0FFFFFFFFh
callx SetThreadContext, edi, esp
callx ResumeThread, edi
exit: callx ExitProcess, esi
end start
кстати - может быть будет интересно узнать (я это узнал в ходе написания этого незаурядного сорца), что advapi ф-ии требуют, чтобы их аргументы, принимающие данные находились в секции данных (не в стэке и не в секции кода с атрибутом w), а ф-ии Get/SetThreadContext, чтобы данные были в стэке %)
|
| | | |
да уж на правду что-то непохоже 03.02.05 10:32
Автор: z0 <z0> Статус: Member
|
> кстати - может быть будет интересно узнать (я это узнал в > ходе написания этого незаурядного сорца), что advapi ф-ии > требуют, чтобы их аргументы, принимающие данные находились > в секции данных (не в стэке и не в секции кода с атрибутом > w), а ф-ии Get/SetThreadContext, чтобы данные были в стэке > %)
бред. кусок рабочего исходника - параметры и в стеке и в коде (/SECTION:.text,erw конечное)
.code
priv_name db 'SeDebugPrivilege',0
lib_name db '\test.dll',0
kernel_name db 'kernel32',0
proc_name db 'LoadLibraryA',0
entry:
;
var_hObject equ ebp-4
var_newstate equ ebp-14h
var_length equ ebp-18h
var_prevstate equ ebp-28h
var_procid equ ebp-128h
;
mov ebp,esp
sub esp,130h
xor ebx,ebx
lea eax,[var_hObject]
push eax
push ebx
push 28h ; TOKEN_QUERY or TOKEN_AJUST_PRIVILEGES
call GetCurrentThread
push eax
call OpenThreadToken
test eax,eax
jnz token_ok
call GetLastError
cmp eax,3f0h ; ERROR_NO_TOKEN
jne exit
lea eax,[var_hObject]
push eax
push 28h ; TOKEN_QUERY or TOKEN_AJUST_PRIVILEGES
call GetCurrentProcess
push eax
call OpenProcessToken
test eax,eax
jz exit
lea edx,[var_newstate]
lea eax,[edx+4]
push eax
push offset priv_name
push ebx
mov dword ptr [edx],1
mov dword ptr [edx+0ch],2
call LookupPrivilegeValueA
lea eax,[var_length]
push eax
lea eax,[var_prevstate]
push eax
push 10h
lea eax,[var_newstate]
push eax
push ebx
push dword ptr [var_hObject]
call AdjustTokenPrivileges
mov edi,eax
call GetLastError
cmp eax,514h
token_ok:
push dword ptr [var_hObject]
call CloseHandle
и т.д. и т.п. ...
либо руки у тебя кривые либо винда особая
|
|
|