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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2015, 15:30   #1
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию Срабатывание антивирусов на механизм обновления проекта

Доброго времени суток всем!
У меня появилась такая проблема:
Сделал в проекте механизм самообновления через загрузчик программы. То есть запускается RegistratorLoader.exe, который проверяет наличие обновлений и запускает потом RegistratorFOG.exe - основную программу. Так вот антивирусы на машинах клиентов (в частности Аваст, Касперский, Nod, AVG) завопили, что RegistratorLoader.exe - это вирус HEUR:Trojan-Downloader.Win32.Generic (по Касперскому)
Подскажите, пожалуйста, как можно попробовать изменить код, чтобы параноики перестали ругаться? С проблемами подобного типа никогда не разбирался, видимо поэтому даже не знаю в какую сторону думать...
Среда Delphi XE7
код:
Код:
program RegistratorLoader;

uses
  WinInet, shellapi, windows, sysutils;

function AppVersion: string;
var
  dwHandle: THandle;
  dwSize: DWORD;
  lpData, lpData2: Pointer;
  uiSize: UINT;
begin
  Result:= '';
  dwSize:= GetFileVersionInfoSize(PChar('RegistratorFOG.exe'), dwSize);
  dwHandle:= 0;
  if dwSize <> 0 then
  begin
    GetMem(lpData, dwSize);
    if GetFileVersionInfo(PChar('RegistratorFOG.exe'), dwHandle, dwSize, lpData)
    then
    begin
      uiSize:= Sizeof(TVSFixedFileInfo);
      VerQueryValue(lpData, '\', lpData2, uiSize);
      with PVSFixedFileInfo(lpData2)^ do
        Result:= Format('%d.%02d.%02d.%02d', [HiWord(dwFileVersionMS),
          LoWord(dwFileVersionMS), HiWord(dwFileVersionLS),
          LoWord(dwFileVersionLS)]);
    end;
    FreeMem(lpData, dwSize);
  end;
end;

function GetInetFile(const fileURL, FileName: String): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array [1 .. BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
  function ExtractFileName(const FileName: string): string;
  var
    I: Integer;
  begin
    for I:= High(FileName) downto Low(FileName) do
      if FileName[I] = '\' then
        break;
    Result:= Copy(FileName, I + 1, length(FileName) - I);
  end;

begin
  Result:= False;
  sAppName:= ExtractFileName(paramstr(0));
  hSession:= InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  try
    hURL:= InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      AssignFile(f, FileName);
      Rewrite(f, 1);
      repeat
        InternetReadFile(hURL, @Buffer, Sizeof(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      CloseFile(f);
      Result:= True;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;

var
  NewVer, isCritical, message_: string;
  T: Text;
  AcceptUpd: Integer;
  uTyp: Cardinal;
  fl: boolean;

begin
  GetInetFile('https://dl.dropboxusercontent.com/###/version', 'version');
  AssignFile(T, 'version');
  ReSet(T);
  ReadLn(T, NewVer);
  ReadLn(T, isCritical);
  CloseFile(T);
  deletefile('version');
  fl:= False;
  if NewVer <> AppVersion then
  begin
    if isCritical = 'Critical' then
    begin
      uTyp:= MB_ICONWARNING + MB_YESNO;
      message_:= 'Доступно критическое обновление программы. Обновить?';
      fl:= True;
    end
    else
    begin
      uTyp:= MB_ICONQUESTION + MB_YESNO;
      message_:= 'Доступно обновление программы. Обновить?';
      fl:= True;
    end;
    if fl then
      if messagebox(0, PChar(message_), PChar('Обновление RegistratorFOG'),
        uTyp) = idYes then
      begin
        if GetInetFile
          ('https://dl.dropboxusercontent.com/###/RegistratorFOG.exe',
          'RegistratorFOG.new') then
        begin
          deletefile('RegistratorFOG.exe');
          RenameFile('RegistratorFOG.new', 'RegistratorFOG.exe');
        end;
      end;
  end;
  ShellExecute(0, 'open', 'RegistratorFOG.exe', nil, nil, 1);

end.
Nostra Sunt

Последний раз редактировалось Daemvil; 26.03.2015 в 15:39.
Daemvil вне форума Ответить с цитированием
Старый 26.03.2015, 16:16   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Качаешь напрямую exe
Человек_Борща вне форума Ответить с цитированием
Старый 26.03.2015, 16:37   #3
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Качаешь напрямую exe
в архив запихать с паролем? так антивирус уже на стадии компиляции его ловит!
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Старый 26.03.2015, 16:59   #4
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Вот тут уж как повезет. Антивирусы не имеют логического сканирования, они просто сравнивает куски кода из проверяемого файла с кусками кода в своих базах. Цена, которой должны расплачиватся нормальные программисты за проделки школотни и прочих, откровенно говоря, пидорасов.
Попробуй скачивать файлы обновления в память, а уже от туда устанавливать. Так ты получишь максимум оптимизации при скачивание. Только не забудь спросить у пользователя разрешения на закачку, иначе он потом тебя ещё заебет жалобами.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 26.03.2015, 17:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты в исключения эту программу добавь.
Если конечно уверен что Делфи твоя не заражена.
Цитата:
Антивирусы не имеют логического сканирования
Сам то понял что сказанул?
Цитата:
Попробуй скачивать файлы обновления в память, а уже от туда устанавливать.
Супер! Это шедевр.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.03.2015, 17:44   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сам то понял что сказанул?
С некоторых пор я считаю его ботом в какой-то тролль-сети что ли. Происки доктора?

Цитата:
в архив запихать с паролем? так антивирус уже на стадии компиляции его ловит!
Можно, попробовать и так. Вообще вы качаете по прямой ссылке, а это плохо.
Человек_Борща вне форума Ответить с цитированием
Старый 26.03.2015, 21:36   #7
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Вообще вы качаете по прямой ссылке, а это плохо.
Имеется ввиду, что ссылка должна генерироваться?
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Старый 28.03.2015, 15:13   #8
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 56
По умолчанию

Решил проблему следующим образом: программа-апдейтер в случае наличия обновлений скачивает главный .exe, изменив расширение на .update. Затем запускает основную программу, которая проверяет наличие файла с расширением .update, и в случае нахождения оного подменяет свой .exe этим обновлением и перезапускается. Антивирусы вроде теперь молчат ))
Код:
program RegistratorLoader;

uses
  WinInet, shellapi, windows, sysutils;

function AppVersion: string;
var
  dwHandle: THandle;
  dwSize: DWORD;
  lpData, lpData2: Pointer;
  uiSize: UINT;
begin
  Result:= '';
  dwSize:= GetFileVersionInfoSize(PChar('RegistratorFOG.exe'), dwSize);
  dwHandle:= 0;
  if dwSize <> 0 then
  begin
    GetMem(lpData, dwSize);
    if GetFileVersionInfo(PChar('RegistratorFOG.exe'), dwHandle, dwSize, lpData)
    then
    begin
      uiSize:= Sizeof(TVSFixedFileInfo);
      VerQueryValue(lpData, '\', lpData2, uiSize);
      with PVSFixedFileInfo(lpData2)^ do
        Result:= Format('%d.%02d.%02d.%02d', [HiWord(dwFileVersionMS),
          LoWord(dwFileVersionMS), HiWord(dwFileVersionLS),
          LoWord(dwFileVersionLS)]);
    end;
    FreeMem(lpData, dwSize);
  end;
end;

function GetInetFile(const fileURL, FileName: String): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array [1 .. BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
  function ExtractFileName(const FileName: string): string;
  var
    I: Integer;
  begin
    for I:= High(FileName) downto Low(FileName) do
      if FileName[I] = '\' then
        break;
    Result:= Copy(FileName, I + 1, length(FileName) - I);
  end;

begin
  Result:= False;
  sAppName:= ExtractFileName(paramstr(0));
  hSession:= InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  try
    hURL:= InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      AssignFile(f, FileName);
      Rewrite(f, 1);
      repeat
        InternetReadFile(hURL, @Buffer, Sizeof(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      CloseFile(f);
      Result:= True;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;

var
  NewVer, isCritical, message_: string;
  T: Text;
  AcceptUpd: Integer;
  uTyp, res: Cardinal;
  fl: boolean;
  exeName, verName: string;

procedure WinExec(const ACmdLine: String; const ACmdShow: UINT = SW_SHOWNORMAL);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  CmdLine: String;
begin
  Assert(ACmdLine <> '');

  CmdLine:= ACmdLine;
  UniqueString(CmdLine);

  FillChar(SI, Sizeof(SI), 0);
  FillChar(PI, Sizeof(PI), 0);
  SI.cb:= Sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW;
  SI.wShowWindow:= ACmdShow;

  SetLastError(ERROR_INVALID_PARAMETER);
{$WARN SYMBOL_PLATFORM OFF}
  Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, False,
    CREATE_DEFAULT_ERROR_MODE
    {$IFDEF UNICODE} or CREATE_UNICODE_ENVIRONMENT{$ENDIF}, nil, nil, SI, PI));
{$WARN SYMBOL_PLATFORM ON}
  CloseHandle(PI.hThread);
  CloseHandle(PI.hProcess);
end;

begin
  exeName:= 'RegistratorFOG';
  verName:= 'version';
  GetInetFile('https://dl.dropboxusercontent.com/u/Исправлено по просьбе автора темы/RegRepo/' +
    verName, verName);
  AssignFile(T, verName);
  ReSet(T);
  ReadLn(T, NewVer);
  ReadLn(T, isCritical);
  CloseFile(T);
  deletefile(verName);
  fl:= False;
  if NewVer <> AppVersion then
  begin
    if isCritical = 'Critical' then
    begin
      uTyp:= MB_ICONWARNING + MB_YESNO;
      message_:= 'Доступно критическое обновление программы. Обновить?';
      fl:= True;
    end
    else
    begin
      uTyp:= MB_ICONQUESTION + MB_YESNO;
      message_:= 'Доступно обновление программы. Обновить?';
      fl:= True;
    end;
    if fl then
      if messagebox(0, PChar(message_), PChar('Обновление RegistratorFOG'),
        uTyp) = idYes then
      begin
        if not GetInetFile
          ('https://dl.dropboxusercontent.com/u/Исправлено по просьбе автора темы/RegRepo/' + exeName +
          '.exe', exeName + '.update') then
          messagebox(0, PChar('Ошибка обновления'),
            PChar('Обновление RegistratorFOG'), MB_ICONERROR + MB_OK);
      end;
  end;

  WinExec(exeName + '.exe');

end.
Nostra Sunt

Последний раз редактировалось Stilet; 04.04.2015 в 20:06.
Daemvil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скрытость от антивирусов Юрий_) Свободное общение 13 07.04.2012 22:24
Двойное срабатывание FileSystemWatcher ShamanK C# (си шарп) 1 06.11.2011 19:32
пару антивирусов? FullVenic Безопасность, Шифрование 8 27.01.2011 02:58
Не могу зайти на сайты антивирусов Баламут Безопасность, Шифрование 20 04.07.2010 07:48
Срабатывание датчика по таймеру RockForr Общие вопросы Delphi 8 26.05.2009 16:32