Проблема следующая: У меня есть лаунчер, он качает новую версию программы, я хочу выложить на сервер новую версию лаунчера, и автоматом обновить и его и программу. Для этого я пишу маленькую временную программу, которая удалит лишние файлы, скачает новый лаунчер и запустит его, после чего сама себя удалит. А эту программку скачает и запустит старый лаунчер. Все бы ничего, да вот только, когда я ее компилирую Касперский 6.0 обнаруживает ее как вирус: 'HEUR:Trojan.Downloader.Win32.Generic(Модификация)' и удаляет скомпилированный файл. Я пробовал по-разному менять код (запихнуть старт скачанного лаунчера в батник, и скачку файла с помощью инди). Единственный вариант, при котором каспер ничего не обнаруживает - если я использую либо только скачку, либо только запуск. Но что самое интересное аналогичные конструкции я использую в своем лаунчере... Подскажите плиз, как можно модифицировать код.
Прикладываю код, а также архив с файлами программы, попробуйте скомпилировать.
Код этой временной программы: (закоментированные участки - мои попытки, что-то поменять).
| Код | program TempDLer;
{$APPTYPE CONSOLE}
uses Windows, SysUtils, ShellAPI, Classes, IdHttp, MLbDLRoutines;
const FN_LNCHR_CFG = 'cfg_lnchr'; FN_SED_CFG = 'config_sed';
var gBatFile: TextFile; gFileName: string; gH: THandle; gIdHttpClient: TIdHTTP; gFS: TFileStream; begin gH := 0; WriteLn('Preparing to Install...'); DeleteFile('cfg_lnchr.cfg'); DeleteFile('config_sed.cfg'); DeleteFile('launcher.exe'); DeleteFile('sed.exe'); DeleteFile('version.info'); WriteLn('Donwloading new version of launcher...'); { gIdHttpClient := TIdHTTP.Create(nil); gFS := TFileStream.Create('launcher.exe',fmCreate); gIdHttpClient.Get('http://10.10.10.3/sed_share/sed_upd/launcher/launcher.exe',gFS); gFS.Free; gIdHttpClient.Free; }
MLbDLFile('10.10.10.3', 'sed_share/sed_upd/launcher/', 'launcher.exe', True);
WriteLn('Starting...');
ShellExecute(gH, 'open', PChar('launcher.exe'), nil, nil, SW_SHOW);
gFileName := ChangeFileExt(ParamStr(0), '.bat'); AssignFile(gBatFile, gFileName); Rewrite(gBatFile); WriteLn(gBatFile, ':1'); WriteLn(gBatFile, format('Erase "%s"', [ParamStr(0)])); WriteLn(gBatFile, format('If exist "%s" Goto 1', [ParamStr(0)])); //WriteLn(gBatFile, format('Start "%s"', ['launcher.exe'])); WriteLn(gBatFile, format('Erase "%s"', [gFileName])); CloseFile(gBatFile); ShellExecute(gH, 'Open', PChar(gFileName), nil, nil, SW_HIDE); end.
|
Код модуля с MLbDLFile:
| Код | unit MlbDLRoutines;
interface
uses ComCtrls, SysUtils, StdCtrls;
const MLB_DL_BUFFER_SIZE = 20480; MLB_DL_NEW_FILE_SUFFIX = 'mlb_new_dl_file_';
type EMLbNetError = class(Exception); EMLbRenameFile = class(Exception); EMLbFileNotFound = class(Exception); EMLbDLFileBreaked = class(Exception); EMLbFileNotCreated = class(Exception);
procedure MlbDLFile(AHost, APath, AName: string; ARewrite: Boolean);
implementation
uses Windows, WinInet, Forms, Classes, Dialogs;
procedure MlbDLFile(AHost, APath, AName: string; ARewrite: Boolean); var vAppName: string; vSession, vURL: HInternet; vBuffer: array[1..MLB_DL_BUFFER_SIZE] of Byte; vBufferLen: DWORD; vF: File; vFileName: string; begin vAppName := ExtractFileName(Application.ExeName); vSession := InternetOpen(PChar(vAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned(vSession) then begin vURL := InternetOpenURL(vSession,PChar('http://' + AHost + '/' + APath + AName),nil,0,INTERNET_FLAG_RELOAD,0); if Assigned(vURL) then begin if not(ARewrite) then vFileName := MLB_DL_NEW_FILE_SUFFIX + AName else vFileName := AName; AssignFile(vF,vFileName); try Rewrite(vF,1); except raise EMLbFileNotCreated.Create('Нет доступа к файлу, закройте все программы, использующие файл: ' + vFileName); end; try repeat InternetReadFile(vURL, @vBuffer, SizeOf(vBuffer), vBufferLen); BlockWrite(vF,vBuffer,vBufferLen); Application.ProcessMessages; until vBufferLen = 0; except raise EMLbDLFileBreaked.Create('Загрузка файла была прервана!!'); end; CloseFile(vF); with TStringList.Create do begin LoadFromFile(vFileName); if Count > 5 then if Strings[5] = '<p>The requested URL /' + APath + AName + ' was not found on this server.</p>' then begin Free; raise EMethodNotFound.Create('Файл не найден: http://' + AHost + '/' + APath + AName); end; end; InternetCloseHandle(vURL); end else raise EMLbFileNotFound.Create('Файл не найден: http://' + AHost + '/' + APath + AName); InternetCloseHandle(vSession); end else raise EMLbNetError.Create('Нет доступа к сети'); end;
end.
|
|