Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск файла, в защищенной среде 
V
    Опции темы
ne0n
Дата 9.2.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



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

З.Ы. Перехват функций не предлагать т.к. перехватывать все подряд не есть гуд!
PM MAIL ICQ   Вверх
Alexeis
Дата 9.2.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



ne0n, Есть такой вариант, запустить программу с правами гостя при помощи функции 
CreateProcessAsUser(); Учетная запись гостя не позволяет редактировать реестр, кроме разве что маленького его сегмента и не может писать на системный диск. Хотя вообще это зависит от того как разграничены права указанной учетной записи.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ne0n
Дата 10.2.2007, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



А по подробней...
Блин нашел описание под С:
Код

BOOL CreateProcessAsUser(
  HANDLE hToken ,                             // дескриптор маркера пользователя
  LPCTSTR lpApplicationName ,                 // имя исполняемого модуля
  LPTSTR lpCommandLine,                       // командная строка
  LPSECURITY_ATTRIBUTES lpProcessAttributes , // SD (дескриптор безопасности)
  LPSECURITY_ATTRIBUTES lpThreadAttributes,   // SD
  BOOL bInheritHandles,                       // дескриптор параметра наследования
  DWORD dwCreationFlags,                      // флажки создания
  LPVOID lpEnvironment,                       // новый блок конфигурации
  LPCTSTR lpCurrentDirectory,                 // имя текущего каталога
  LPSTARTUPINFO lpStartupInfo,                // информация предустановки
  LPPROCESS_INFORMATION lpProcessInformation  // информация о процессе
); 

 На делфи нихт smile 
PM MAIL ICQ   Вверх
ldr12
Дата 10.2.2007, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.2.2007

Репутация: 1
Всего: 1



Товарищи, пользуйтесь MSDN smile
http://msdn.microsoft.com/library/default....ocessasuser.asp

Нашел описание на C++ - описание на Delphi найти еще проще, просто напиши название функции и сделай Ctrl+Left Click по ней smile

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

Код
function CreateProcessAsUser(hToken: THandle; lpApplicationName: PChar;
  lpCommandLine: PChar; lpProcessAttributes: PSecurityAttributes;
  lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL;
  dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar;
  const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; stdcall;


Первый параметр - результат выполнения функции LogonUser(), которая создает на компьютере сессию с правами указанного пользователя. Подробнее о ней в http://msdn.microsoft.com/library/default....ocessasuser.asp там все интуитивно понятно - юзернейм, домен, пароль и пара флажков.

Второй и третий параметры понятны, путь до приложения и аргументы командной строки.

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

Шестой - наследуем ли будет хендл твоего процесса, тоже можно поставить в False, если ничего страшного с ним делаться не будет.

Седьмой - http://msdn2.microsoft.com/en-us/library/ms684863.aspx - всякие экзотические флаги, которые тебе вряд ли потребуются. Ставь 0, но на всякий случай погляди ссылку smile

Восьмой - указатель на буфер с переменными окружения. Согласно MSDN, они находятся в формате имя=значение(нулевой символ)имя2=значение2(нулевой символ)... Если указать nil, то будут использоваться переменные окружения твоего процесса. Впрочем, ничего страшного не случится. Ведь, как правило, для всех юзеров переменные окружения одинаковы по умолчанию.

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

Десятый - структура TStartupInfo. http://msdn.microsoft.com/library/default....ocessasuser.asp Много экзотических параметров, мало из которых, как правило, требуется. Тем не менее, перед вызовом CreateProcessAsUser не забудь сделать StartupInfo.cb := SizeOf(TStartupInfo);

И, наконец, одиннадцатый - структура TProcessInformation, куда ты получишь PID своего процесса, его хендл с правами PROCESS_ALL_ACCESS и еще много чего интересного.

Надеюсь, помог разобраться smile
http://msdn.microsoft.com/library/default....ocessasuser.asp
Вот хороший пример, демонстрирующий, сколько параметров можно в самом деле опустить smile
PM MAIL   Вверх
ldr12
Дата 10.2.2007, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.2.2007

Репутация: 1
Всего: 1



А вот и код:

Код
function EnablePrivilege(Privilege: PChar): Boolean;
var
  hToken, Len: DWORD;
  NameValue: Int64;
  tkp: TOKEN_PRIVILEGES;

begin
  Result := False;

  if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  begin
    if LookupPrivilegeValue(nil, Privilege, NameValue) then
    begin
      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].Luid := NameValue;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

      AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, Len);
      if GetLastError = ERROR_SUCCESS then
        Result := True;
    end;

    CloseHandle(hToken);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hUser: DWORD;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;

begin
  if EnablePrivilege('SeTcbPrivilege') then
    if LogonUser('Guest', nil, 'pjuflrf',
      LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, hUser) then
    begin
      StartupInfo.cb := SizeOf(TStartupInfo);
      CreateProcessAsUser(hUser, 'c:\winnt\calc.exe', nil, nil, nil, False,
        0, nil, nil, StartupInfo, ProcessInfo);
    end;        
end;


Это сообщение отредактировал(а) ldr12 - 10.2.2007, 03:53
PM MAIL   Вверх
ne0n
Дата 10.2.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



ldr12, большое спасибо, т.е. эта фича сработает только в том случаи если на П.К. есть гостевая
учетная запись, я правильно понял? а что делать если на компе всего один пользователь?
Цитата

Нашел описание на C++ - описание на Delphi найти еще проще, просто напиши название функции и сделай Ctrl+Left Click по ней 

Чето я не совсем понял  smile 

Это сообщение отредактировал(а) ne0n - 10.2.2007, 10:34
PM MAIL ICQ   Вверх
W4FhLF
Дата 10.2.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(ne0n @  10.2.2007,  10:30 Найти цитируемый пост)
а что делать если на компе всего один пользователь?


NET_API_STATUS NetUserAdd(
  LMSTR servername,
  DWORD level,
  LPBYTE buf,
  LPDWORD parm_err
);




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ne0n
Дата 10.2.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



Цитата(W4FhLF @  10.2.2007,  10:50 Найти цитируемый пост)
NET_API_STATUS NetUserAdd(
  LMSTR servername,
  DWORD level,
  LPBYTE buf,
  LPDWORD parm_err
);


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

PM MAIL ICQ   Вверх
Snowy
Дата 10.2.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(ne0n @  9.2.2007,  22:38 Найти цитируемый пост)
Возможно ли запустить программу в "защищенной среде"
Цитата
В Windows 2000 введен новый объект ядра — задание (job). Он позволяет группировать процессы и помещать их в нечто вроде песочницы, которая определенным образом ограничивает их действия. Относитесь к этому объекту как к контейнеру процессов. Кстати, очень полезно создавать задание и с одним процессом — это позволяет налагать на процесс ограничения, которые иначе указать нельзя.
Джеффри рихтер - создание эффективных Win32 приложений
Часть вторая - глава 5 - - Задания
Качать здесь: http://snowy.delphist.com/books/#richter
Там всё подробно описано.
PM MAIL   Вверх
ne0n
Дата 10.2.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



Snowy,  спасибо посмотрю.
PM MAIL ICQ   Вверх
W4FhLF
Дата 10.2.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Snowy, я тоже сразу про задания подумал, но там нет нужных ограничений(доступ к реестру, фс), по-крайней я в своё время не нашёл.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Snowy
Дата 10.2.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(W4FhLF @  10.2.2007,  11:36 Найти цитируемый пост)
но там нет нужных ограничений(доступ к реестру, фс)

Цитата
- ограничения, связанные с защитой, — перекрывают процессам в задании доступ к защищенным ресурсам (файлам, подразделам реестра и т.д.). 
Ограничения, связанные с защитой: JobObjectSecurityLimitInformation JOBOBJECT_SECURITY_LIMIT_INFORMATION

PM MAIL   Вверх
ne0n
Дата 10.2.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



Вроде похоже на то что надо, только в C я почти нуль, ладно буду разбираться.
PM MAIL ICQ   Вверх
ne0n
Дата 12.2.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 4
Всего: 11



Блин, че ж сразу не сказали, что Делфя об этих заданиях ничего не знаетsmile
Ну вроде кое как перевел, пока возникло несколько заминок:
1 как с си перевести это:

Код

#define THREAD_ALL_ACCESS         (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ 0x3FF)



И еще вопросик какая разница между:

Код

#define Some_Flag          0x001


и

Код

#define Some_Flag2          0x0000001




Это сообщение отредактировал(а) ne0n - 12.2.2007, 18:24
PM MAIL ICQ   Вверх
Alexeis
Дата 12.2.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



ne0n, срочно учить С smile

Цитата(ne0n @  12.2.2007,  18:23 Найти цитируемый пост)
И еще вопросик какая разница между:

В размерах типа данных.

Цитата(ne0n @  12.2.2007,  18:23 Найти цитируемый пост)
1 как с си перевести это:

ничего не перепутал? Там "\" как будто бы лишний...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.