Вы находитесь на странице: 1из 3

СКРЫ ТЫ Е СЛУЖ БЫ WINDOWS

П. Г. Шадамов
(Курган, КГУ, nekkurol@gmail.com)

Службы Windows (Windows Service) - это особый класс при­


ложений, запускающийся автоматически при запуске системы и не
зависящий от статуса пользователя. Как правило, службы не име­
ют GUI, вследствие чего их обычная работа не заметна для поль­
зователя.
При стандартной установке Windows ХР в систему инсталлиру­
ется порядка 80 разнообразных служб. Нередко вместе с установ­
кой стороннего программного обеспечения устанавливаются и до­
полнительные службы.
Важно отметить, что по умолчанию службы запускаются от име­
ни пользователя «LocalSystem». Этот пользователь обладает пол­
ными правами внутри системы, ею права превосходят даже учет­
ную запись «Administrator».
При таких условиях работы службы являются отличным мес­
том для хранения и сокрытия вредоносного кода. Ситуацию облег­
чает лишь то, что список служб не является скрытым и легко про­
сматривается стандартными средствами системы (рис. 1).

---


3LA9JCTStatafcr- feMÜBf-

44 «І Мм*Им»AIM
0КХ & - Pnw W ««- I
ЗОНО-оми*
'4 Evwtf U f Wrfcti fM ta lo g - P«fr
ТМімміс- P«ta
aiM tanCtntam ot- M w je u P«A

Cih<*R)P«OWW. Ммспі.
iL lnt«W0 P*OSta/W_ P m M a it.
Я, W*K>« O W W .. Pj

taa
U,Micro«*Ш Mkran*-

■АМмпнА.ИРЬ- МааяЛ-

Рис. 1. Список служб


207
Однако что произойдет, если скрыть службу? Для начала сто­
ит разобраться, возможно ли это сделать в принципе, и как вообще
службы хранятся в системе?
Можно выделить два места хранения служб: реестр и ядро.
Найти службы в реестре несложно, все они хранятся в ветке
«HKEY_LOCAL__MACHlNE\SYSTEM\CurrentControlSet\Services»
(рис. 2). Реестр представляет такие же возможности работы со служ­
бами, как и стандартные утилиты Windows (например, services.msc),
а значит, не позволит нам скрыть службу или обнаружить скрытую.

ЦЛртшюл
•Jii SOFTWARE Имя Тем
X SYSTEM Qj
^КПоуыолчагмю) REG.SZ
OmtfolSefflOl
^DüplayName REG.SZ 1384 O H O Comphant Host Contidle
C. ContnrtSetOW
DnverPadcag dd REG.SZ 1394.inf_amd64_ne\rtrat_e7fb486a975&e3d8
CncwntControlSel
^EnorControl REG.DW0 RD OxCOOOOOOl а)
о Control
•*JIm»9«PaÖi REGJXPAND.SZ \SystcrnRoot\*ystem32\drtvefs\1394ohci.r)'s
»-ji Emim
£§ Start REG.DWORO ОхОООООООЗСЗ)
о I! Hardware Profile
|— Poficies gjType REG.DWORO «
services
fr-ji Л Е Т a R Data
» - £ Л Е Т а я Networking
» Л . N E T a R NrtwortcmgAODß
t-js Л Е Т Data Providerfar Oracle
Л Е Т Data Provider for SqKerrer
> - £ Л Е Т Memory Cache 4.0
JffTFramewort
>-^1 {29873C A A -*048-445^-8^60-657965663683
> - X Р О О О Р Ю 1-84СА-4РИ-9АЕЭ-0AF4F3CÄ)74.'
> - X {A721A 28C-494E-4905-9680-8DEA8SC50LÜ
& - X {И6СЯЗЭ-77А*-4Ш - в 166-С40£ » 2?87вО
ь X (6615B6A5-13AC-4S0 -B9F8-978880A 2A 1P.
І-ЦИИОІЮІ
2GBUpcUteSarvice

Рис. 2. Службы в реестре

Как же службы хранятся в памяти? Для того, чтобы выяснить


это, нам придется обратиться к средствам отладки операционной
системы Windows, например, можно использовать windbg. Внутри
ядра службы хранятся в виде двусвязного списка, который можно
представить в виде структуры SERVICE RECORD (рис. 3).
Наиболее интересными для нас являются поля Previous, Next -
они хранят указатели на предыдущий и последующий элементы
списка. Изменяя значения этих полей (изменяя ссылки на следую­
щий/предыдущий элемент), мы сможем скрывать службы, а впо­
следствии, зная размер этой структуры, искать скрытые службы.
typedef struct SC_SERVICE_RECORO
{
PSC_SERVICE_RECORD Previous;
P « T s ERVICe ” r ECORD Next;
WCHAR *ServiceNaiae;
WCHAR "DisplayMaae;
DWORD Index;
DWORD UnknowO;
DWORD sErv;
DWORD ControlCount;
DWORD Unknowl;
PSC_SERVICE_PROCESS Process;
SERVICE_STATUS Status;
DWORD StartType;
DWORD ErrorControl;
DWORD Tagld;
PSC_DEPEND_SERVICE DependOn;
PSC~D£PENO~SERVICE Depended;
>
Рис. 3. Описание структуры SERVICE RECORD

Допустим, мы хотим скрыть службу с номером (в списке) N,


для этого нам надо у службы с номером N - 1 в поле Next поста­
вить ссылку на службу с номером N + 1, а у N + 1 аналогичным об­
разом изменить поле Previous. Для нахождения скрытой службы
достаточно идти от начала списка и отслеживать значение указате­
ля там, где значение превышает размер структуры, явно прослежи­
ваются изменения списка.
Чтобы не выполнять подобные операции каждый раз в ядре,
можно разработать программу. Алгоритм ее работы будет следую­
щий:
1. Найти ID процесса «services.exe».
2. Перейти в рабочее пространство процесса «services.exe».
3. По метке «sErv» найти начало списка служб.
4. Пройти по списку, ища скрытые службы.
5. Сигнализировать о найденных службах.
Данный алгоритм позволяет без труда как скрывать службы,
так и обнаруживать ранее скрытые, что может в некоторых случа­
ях существенно повысить надежность системы.

Вам также может понравиться