Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Запуск программ...


Автор: V.Turecky 26.7.2002, 18:18
Ещё раз здравствуйте.

Мне нужно организовать запуск программ своими силами. Обычно программы запускаються, если в определенном ключе реестра есть значение ("%1" %*"), а если нет, или там себя прописывает вирус, тогда глына... Так вот - хочу сделать в своей программе командную строку, с помощью которой можно запускать программы своими силами. Но как организовать такой запуск? В это, собсвенно, мой вопрос.

Вот часть реестра, которую бомбят некторые вирусы:
 
Код
REGEDIT4

[HKEY_CLASSES_ROOT\exefile\shell\open\command]
@="\"%1\" %*"

Автор: Mikel 26.7.2002, 18:22
Если про запуск программ, то WinExec, ShellExecute. Но что-то я не совсеи понял.

Автор: V.Turecky 26.7.2002, 18:25
Если в реестре не будет этой херни - ("%1" %*"), то никакой
WinExec или ShellExecute не запустит программу!

Автор: Mikel 26.7.2002, 18:28
WinExec должен запустить, т.к. он использует сам Windows, а не Shell. Можешь попробовать проверить

Автор: Vit 26.7.2002, 18:53
CreateProcess - запустит что угодно при любых ключах реестра (причём именно так как ты хочешь), собственно WinExec и ShellExecute при своём выполнении используют CreateProcess. Только с вирусами сложнее - кто твою программу будет загружать? Может тоже вирус?


Автор: Baa 26.7.2002, 19:12
Наерно он хочет сделать так, что при запуске любой проги запускалась сначала его прога, а потом токо прога, которая должна была запуститься или я не так понял? (сделал вывод из ключа реестра)

Автор: dr.ZmeY 27.7.2002, 18:14
Цитата(Guest @ 26.7.2002, 19:25)
Если в реестре не будет этой херни - ("%1" %*"), то никакой
WinExec или ShellExecute не запустит программу!

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

Или ты хочешь сделать универсальный кряк, который бы запускал любую не регерную прогу?

Автор: Vit 27.7.2002, 18:26
Думаю что речь идёт о вирусах подобных SirCom - они переадресуют все запуски програм на себя(путем переправления реестра), и товарищ хочет сделать запуск программы в обход указаний реестра, только тут возникает такой проблем - хорошо, такая программа написана, как она сама будет запускаться?

Автор: dr.ZmeY 27.7.2002, 18:33
САМА???
Если не руками, то автозапуском, вместе с системой или по счётчику...
Или я не понял.
Можно проверять уже запущенные процессы, и один из них, типа taskmgr.exe :) и станет причиной запуска, какая разница как заставить прогу запуститься...

Автор: Vit 27.7.2002, 18:53
Там не так всё просто - вирус ассоциирует себя с расширением exe и все файлы запускает из себя, даже таск-менеджер, возможно и можно как-то запустить программу "чисто", как системный сервис или драйвер, но простое прописывание в автозапуск ничего не даст. Я на зараженной системе "чисто" запускал файлы переименовывая их в .сом, но скорее всего появятся клоны вирусов, если уже не появились, которые учтут и эту ситуацию...

Автор: dr.ZmeY 28.7.2002, 13:17
Так, он хочет написать такой вирь, или запустить антивирус
Что конкретно ему надо?

Автор: V.Turecky 30.7.2002, 15:31
Ребята, всем огромное спасибо!!!

WinExec запускает даже, когда реестр поврежден тем способом, о котором я упоминал ранее. Но я решил воспользоваться советом Vit'а и применить функцию CreateProcess, что даже лучше, она тоже запускает без проблем.

Вся хитрость моей программы в том, что у нее расширение не EXE, а CPL, и при ранее упомянутом повреждении реестра там есть такая функция, которая восстанавливает некоторые ассоциации. Можно выбрать какие именно. Пока только три.

Автор: Vit 30.7.2002, 16:04
CPL запускается посредством RunDLL.exe, так что возвращаемся на круги своя.

Автор: V.Turecky 30.7.2002, 16:13
Цитата
CPL запускается посредством RunDLL.exe, так что возвращаемся на круги своя.


Точно! Только сейчас дошло. Блин, что же делать???

Автор: Vit 30.7.2002, 16:23
Цитата(Guest @ 30.7.2002, 08:13)
Блин, что же делать???

Возможные варианты:

1) Запуск программы как драйвера, системного сервиса и т.п. при старте системы
2) Запуск программы как графической среды по умолчанию
3) Написать программу под ДОС и загружать с дискетты.

Автор: V.Turecky 30.7.2002, 16:53
А может лучше написать запускалочку для своей CPL'ки с расширением COM и запускать с помощью CreateProcess или вообще воспользоваться услугами BAT файла?

Автор: Vit 30.7.2002, 17:08
Цитата(Guest @ 30.7.2002, 08:53)
А может лучше написать запускалочку для своей CPL'ки с расширением COM и запускать с помощью CreateProcess или вообще воспользоваться услугами BAT файла?

BAT работает через тот же ShellExecute

COM - в принципе возможно, но кто поручится, что и это расширение ассоциированно с вирусом?

Автор: V.Turecky 30.7.2002, 17:30
Для открытия файлов BAT, COM, EXE в реестре прописано одно и тоже - "%1" %*.

Вот ещё один вариант: написать, как я уже упоминал ранее, запускалочку, но только с любым другим расширением, а в реестре прописать для её открытия - "%1" %* и всё. Как идея?

Кстати, а какой метод запуска CPL файлов у RunDLL.exe? Я могу воспользоваться CreateProcess?

Автор: Vit 30.7.2002, 20:48
Цитата(Guest @ 30.7.2002, 09:30)
Кстати, а какой метод запуска CPL файлов у RunDLL.exe?

Rundll32.exe shell32.dll,Control_RunDLL <AppletName>

Автор: Monty 26.7.2004, 03:58
Код
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID:
 PDWORD): Longword;
var
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
begin
 FillChar(StartupInfo, SizeOf(StartupInfo), #0);
 StartupInfo.cb := SizeOf(StartupInfo);
 StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
 StartupInfo.wShowWindow := ShowCmd;
 if not CreateProcess(nil,
   @Filename[1],
   nil,
   nil,
   False,
   CREATE_NEW_CONSOLE or
   NORMAL_PRIORITY_CLASS,
   nil,
   nil,
   StartupInfo,
   ProcessInfo)
   then
   Result := WAIT_FAILED
 else
 begin
   if wait = FALSE then
   begin
     if ProcID <> nil then
       ProcID^ := ProcessInfo.dwProcessId;
     result := WAIT_FAILED;
     exit;
   end;
   WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
   GetExitCodeProcess(ProcessInfo.hProcess, Result);
 end;
 if ProcessInfo.hProcess <> 0 then
   CloseHandle(ProcessInfo.hProcess);
 if ProcessInfo.hThread <> 0 then
   CloseHandle(ProcessInfo.hThread);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 ProcID: Cardinal;
begin
 ProcID := 0;
 if OpenDialog1.Execute then
   RunProcess(OpenDialog1.FileName, SW_SHOW, CheckBox1.Checked, @ProcID);
 ShowMessage(IntToStr(ProcID));
end;


by Michael Puff

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)