доброго времени суток! у меня такая проблема... я реализовывал алгоритм получения хендла процесса через дублирование одного их хендлов, хранящихся в csrss.exe... сделал, оттестировал на xp - все работает, как часы... стал тестировать на vista и бац)) "эксесденайд"... подумал, что можно что-нить с привилегиями покрутить, но ничего не вышло... стал копать по поводу доступа к процессам в vista, узнал, что "даже администраторы не имеют доступа к защищенным процессам"... фактически защищенные процессы не возможно открывать со следующими правами: PROCESS_ALL_ACCESS PROCESS_CREATE_PROCESS PROCESS_CREATE_THREAD PROCESS_DUP_HANDLE PROCESS_QUERY_INFORMATION PROCESS_SET_INFORMATION PROCESS_SET_QUOTA PROCESS_VM_OPERATION PROCESS_VM_READ PROCESS_VM_WRITE а мне то всего надо было открыть процесс на дублирование хендлов((( может кто-нить знает, как это обойти? а то я за вчера и за сегодняшнее утро уже "обгуглился"... ЗЫ на паре форумов наткнулся на темы о том, что в vista очень легко снимать и устанавливать флаг "защищенности" процесса, но кроме фраз "ах, какие же в майкрософт тупые кодеры" ничего интересного там не нашел((((
PROCESS_DUP_HANDLE – это далеко не "всего-то", ибо можно сдублировать псевдоописатель целевого процесса [HANDLE(-1)], указав в качестве целевых прав PROCESS_ALL_ACCESS, например. Мы полагаем, что один напоролся не на "защищённость" процесса, а всего лишь на Integrity Level. Integrity Level для csrss – "System", тогда как пользовательские процессы обыкновенно имеют уровни Low, Medium, High. Код (Text): cmd> windbg -kl lkd> !process 0 0 csrss.exe PROCESS fffffa80020e8c10 ; <------- (1) SessionId: 0 Cid: 0244 Peb: 7fffffdd000 ParentCid: 0238 DirBase: 69f26000 ObjectTable: fffff8800bb65800 HandleCount: 519. Image: csrss.exe PROCESS fffffa8002e65ae0 ; <------- (2) SessionId: 1 Cid: 0274 Peb: 7fffffd5000 ParentCid: 026c DirBase: 68c21000 ObjectTable: fffff8800bca2a80 HandleCount: 651. Image: csrss.exe lkd> !process 0 0 audiodg.exe PROCESS fffffa80033f7c10 ; <------- (3) SessionId: 0 Cid: 0524 Peb: 7fffffd5000 ParentCid: 00dc DirBase: 5bf28000 ObjectTable: fffff8800c034790 HandleCount: 131. Image: audiodg.exe lkd> dt _EPROCESS Prote* nt!_EPROCESS +0x36c ProtectedProcess : Pos 11, 1 Bit lkd> ?? ((_EPROCESS*)0xfffffa80020e8c10)->ProtectedProcess ; <– (1) csrss не протектед unsigned long 0 lkd> ?? ((_EPROCESS*)0xfffffa8002e65ae0)->ProtectedProcess ; <- (2) csrss не протектед unsigned long 0 lkd> ?? ((_EPROCESS*)0xfffffa80033f7c10)->ProtectedProcess ; <- (3) audiodg протектед unsigned long 1 lkd> ?? ((_EPROCESS*)0xfffffa80033f7c10)->ProtectedProcess = 0 ; <- (3) audiodg становится анпротектед unsigned long 0 Можно овладевать System Integrity Level, если сделать службу. Для эксперимента же может быть достаточно "psexec.exe -s -i your_application.exe" (psexec от Sysinternals).
да, ты прав... причем если мою программу запускать под админом (хай интегрити левел), то открыть хендл csrss.exe получается без проблем... спасибо, теперь хотя бы точно знаю проблему)) весь косяк в том, что надо все из под юзера делать... вчера гуглил на тему обхода Integrity Level и UAC, так ничего толком и не нашел(((
все! тема закрыта... нашел обходные пути... Sol_Ksacap, большой спасибо за указание на реальную проблему! а то, я думаю, я бы еще долго мучался))
ну смысл в том, что Виста ругается на OpenProcess с правами PROCESS_ALL_ACCESS, хоть процесс находится на одном Integrity Level с моей прогой... однако можно открыть сам целевой процесс (не csrss.exe, а именно целевой процесс) на PROCESS_DUP_HANDLE и скопировать хендл целевого процесса себе с теме же правами на него, что и в целевом процессе... таким образом мы получаем хендл процесса с полными правами на него, минуя Виставский контроль... это может быть просто, но работает без проблем (тестировалось на лицензионных Ultimate серии x32 и x64)... антивирь вроде тож молчит...
зачем он мне нужен по твоему? у меня все нужные мне процессы на одном Integrity Level с моим приложением, зачем мне в защищенные процессы лезть?