Выполнение кода в системных процессах

Тема в разделе "WASM.WIN32", создана пользователем Jerry, 25 апр 2006.

  1. Jerry

    Jerry New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2006
    Сообщения:
    13
    Ситуация следующая. Успешно инжектирую свой код во все процессы в системе через



    EnableDebug

    OpenProcess

    OpenThread

    SuspendThread

    VirtualAllocEx

    WriteProcessMemory

    GetThreadContext

    SetThreadContext

    ResumeThread



    Все эти функции нормально выполняются, однако мой код во внедренном процессе запускается только если это обычное приложение. Для системных процессов/сервисов, несмотря на то, что код в процесс внедрен и SetThreadContext благополучно завершилась и не вернула ошибку, он не выполняется :dntknw:(



    Почему так?!
     
  2. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    - проги и сервисы работают в разных DesktopStations ...
     
  3. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    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");
     
  4. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    То есть, надо для твоего треда установить WinSta0\Default
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    а может просто потоки в wait-е?

    сервисы все-таки суть серверы а не приложения

    ты в отладчике посмотри в каком состоянии находится поток чей контекст ты переписал...
     
  6. Jerry

    Jerry New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2006
    Сообщения:
    13




    Да, потоки в состоянии ожидания. Но, почему тогда пользовательские приложения находящиейся в Wait:UserRequest переключаются нормально? И вообще, если мы меняем конекст потока, разве имеет значение что он чего-то до этого ждал?



    делаю

    ResumeThread и ZwAlertThread
     
  7. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    посмотри в ProcessExplorer процессы сервиса и скажем программы обычной - у программы:

    \Windows\WindowStations\WinSta0



    а у сервиса:

    \Windows\WindowStations\Service-0x0-3e7$



    То есть, если твой код подразумевает какую-либо интерактивность или запуск юзермодных процессов - он обломается в силу несоответствия WinSta0

    (аналогичная проблема была в эксплойте на базе CreateRemoteThread в WinLogon'е - пока не сменили потоку WinStation он не хотел CreateProcess делать с правами сервиса, то есть LocalSystem)
     
  8. eugene_

    eugene_ New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2005
    Сообщения:
    93
    Адрес:
    Russia
    или другой вариант - поставь сервису галку "Allow service interaction with desktop"
     
  9. Jerry

    Jerry New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2006
    Сообщения:
    13
    2eugene_

    Большое спасибо! Сейчас капаю в указанном направлении.



    Но у тогда у меня задача не из сервиса получить десктоп юзера, а как обычному приложению получить станцию сервиса? Как узнать ее наименование? Или значение "Service-0x0-3e7$" будет актуально везде?
     
  10. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    для этого сделай это:


    и ничего узнавать не надо будет - сервис будет на WinSta0
     
  11. Jerry

    Jerry New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2006
    Сообщения:
    13




    У меня обратная задача, не из сервиса получить десктоп юзера, а из юзерской программы узнать десктоп сервиса.



    Искать ответ в ZwQuerySystemInformation или есть более простые варианты?
     
  12. Jerry

    Jerry New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2006
    Сообщения:
    13
    что-то совсем запутался :dntknw:



    почему в известных юзермодных руткитах, никто не поднимал эту проблему вообще?!