Ситуация следующая. Успешно инжектирую свой код во все процессы в системе через EnableDebug OpenProcess OpenThread SuspendThread VirtualAllocEx WriteProcessMemory GetThreadContext SetThreadContext ResumeThread Все эти функции нормально выполняются, однако мой код во внедренном процессе запускается только если это обычное приложение. Для системных процессов/сервисов, несмотря на то, что код в процесс внедрен и SetThreadContext благополучно завершилась и не вернула ошибку, он не выполняется ( Почему так?!
HDESK hdesk = NULL; HWINSTA hwinsta = NULL; // // Obtain a handle to WinSta0 - service must be running // in the LocalSystem account // if(!(hwinsta = OpenWindowStation("winsta0", FALSE, WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | WINSTA_CREATEDESKTOP | WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | WINSTA_READATTRIBUTES | WINSTA_READSCREEN | WINSTA_WRITEATTRIBUTES))) throw("OpenWindowStation - winsta0"); // // Set the windowstation to be winsta0 // if(!SetProcessWindowStation(hwinsta)) throw(0); // // Get the default desktop on winsta0 // if(!(hdesk = OpenDesktop("default", 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS))) throw("OpenDesktop - default"); // // Set the desktop to be "default" // if(!SetThreadDesktop(hdesk)) throw("SetThreadDesktop");
а может просто потоки в wait-е? сервисы все-таки суть серверы а не приложения ты в отладчике посмотри в каком состоянии находится поток чей контекст ты переписал...
Да, потоки в состоянии ожидания. Но, почему тогда пользовательские приложения находящиейся в Wait:UserRequest переключаются нормально? И вообще, если мы меняем конекст потока, разве имеет значение что он чего-то до этого ждал? делаю ResumeThread и ZwAlertThread
посмотри в ProcessExplorer процессы сервиса и скажем программы обычной - у программы: \Windows\WindowStations\WinSta0 а у сервиса: \Windows\WindowStations\Service-0x0-3e7$ То есть, если твой код подразумевает какую-либо интерактивность или запуск юзермодных процессов - он обломается в силу несоответствия WinSta0 (аналогичная проблема была в эксплойте на базе CreateRemoteThread в WinLogon'е - пока не сменили потоку WinStation он не хотел CreateProcess делать с правами сервиса, то есть LocalSystem)
2eugene_ Большое спасибо! Сейчас капаю в указанном направлении. Но у тогда у меня задача не из сервиса получить десктоп юзера, а как обычному приложению получить станцию сервиса? Как узнать ее наименование? Или значение "Service-0x0-3e7$" будет актуально везде?
У меня обратная задача, не из сервиса получить десктоп юзера, а из юзерской программы узнать десктоп сервиса. Искать ответ в ZwQuerySystemInformation или есть более простые варианты?
что-то совсем запутался почему в известных юзермодных руткитах, никто не поднимал эту проблему вообще?!