Перейти к содержанию

Срабатывание антивирусов на механизм обновления проекта


Daemvil

Рекомендуемые сообщения

Доброго времени суток!
У меня появилась такая проблема:
Сделал в проекте механизм самообновления через загрузчик программы. То есть запускается 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.

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

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

Посмотрите, как сделано в других решениях и сделайте аналогично. Как вариант - отправить программу в ЛК, что бы там убрали детект на неё.

Ссылка на комментарий
Поделиться на другие сайты

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

Посмотрите, как сделано в других решениях и сделайте аналогично. Как вариант - отправить программу в ЛК, что бы там убрали детект на неё.

Понимаю, конечно же, что код можно как-то "перестроить", чтобы не срабатывало. А вот как реализовано в других решениях? Пробовал и "всё в одном" - тот же эффект. Как сделано в других решениях? Если брать уже готовые продукты - код все равно от пользователя скрыт, а решений в интернете не нашел, которые бы так же, как, например, обновление браузера, Team-viewer'a или флэш-плеера, срабатывали хорошо и без "алертов".

Ссылка на комментарий
Поделиться на другие сайты

Выкладывайте на сервере помимо обновленного приложения текстовый файл с его md5. При проверке обновлений выкачивайте md5 и сравнивайте с файлом на компьютере. Если такой алгоритм?

Ссылка на комментарий
Поделиться на другие сайты

Выкладывайте на сервере помимо обновленного приложения текстовый файл с его md5. При проверке обновлений выкачивайте md5 и сравнивайте с файлом на компьютере. Если такой алгоритм?

Уточню описание работы моего механизма обновления (хотя по коду в принципе видно). Скачивается файл с информацией о версии, и если она различается с текущей - программа обновляет основной .exe. Если я вместо скачки файла version буду скачивать файл, содержащий контрольную сумму и ее сравнивать - что изменится? Не понимаю, что от этого изменится, но.... попробую

Ссылка на комментарий
Поделиться на другие сайты

 

 


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

Уточню описание работы моего механизма обновления (хотя по коду в принципе видно). Скачивается файл с информацией о версии, и если она различается с текущей - программа обновляет основной .exe. Если я вместо скачки файла version буду скачивать файл, содержащий контрольную сумму и ее сравнивать - что изменится? Не понимаю, что от этого изменится, но.... попробую

Вы интересовались, как у других сделано обновление. Я взял пример с текстового редактора Notepad++. У них приложение запрашивает из сети файл:

http://downloads.sourceforge.net/project/npppluginmgr/xml/plugins.md5.txt

Антивирусы на это дело не ругаются  :)

Ссылка на комментарий
Поделиться на другие сайты

@Daemvil,

Варианты для решения проблем с Касперским:

1. Участвовать в Whitelist: http://whitelist.kaspersky.ru/whitelist-for-partners-ru

2. Добавить на каждом ПК с антивирусом приложение в исключения.

3. Изменить механизм обновления приложения.

4. Временно отключить антивирус перед обновлением приложения.

Ссылка на комментарий
Поделиться на другие сайты

Решил проблему следующим образом: программа-апдейтер в случае наличия обновлений скачивает главный .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/24818729/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/24818729/RegRepo/' + exeName +
          '.exe', exeName + '.update') then
          messagebox(0, PChar('Ошибка обновления'),
            PChar('Обновление RegistratorFOG'), MB_ICONERROR + MB_OK);
      end;
  end;
 
  WinExec(exeName + '.exe');
 
end.

 

  • Согласен 2
Ссылка на комментарий
Поделиться на другие сайты

 

неверное решение. все решается через

 

 

исключения в антивирусах

 

Не согласен, обоснуйте, что это единственно верное решение. Каждый выбирает сам. Например:

1. далеко не на всех машинах антивирусы позволяют добавлять в исключения (настройка автоматических действий при какой-либо опасности)

2. некоторые антивирусы после добавления в исключения через некоторое время снова блокируют программу, а некоторые и вовсе не дают добавить в исключения (пример: mcAfee как-то давно взял и удалил половину моих скомпилированных программ, перенеся на карантин, сказав, что это вирусы, без возможности добавить в "исключения". Правда, потом вернул часть, но осадок остался)) )

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

  • Согласен 1
Ссылка на комментарий
Поделиться на другие сайты

 

Решил проблему следующим образом: программа-апдейтер в случае наличия обновлений скачивает главный .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/24818729/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/24818729/RegRepo/' + exeName +
          '.exe', exeName + '.update') then
          messagebox(0, PChar('Ошибка обновления'),
            PChar('Обновление RegistratorFOG'), MB_ICONERROR + MB_OK);
      end;
  end;
 
  WinExec(exeName + '.exe');
 
end.

 

А если имя файла будет "flashplayer.update" ,то антивирусы опять ругаться начнут  :)

  • Улыбнуло 1
Ссылка на комментарий
Поделиться на другие сайты

А если имя файла будет "flashplayer.update" ,то антивирусы опять ругаться начнут  :)

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

 

Ссылка на комментарий
Поделиться на другие сайты

 

А если имя файла будет "flashplayer.update" ,то антивирусы опять ругаться начнут  :)

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

 

 

На самом деле приведенный код - типичный Trojan-Downloader ... начинать нужно с простого:

1. Не запускать этот код при старте приложения (или в виде отдельного приложения, как в примере), а встроить его в свое обновляемое приложение. Получим одним EXE меньше и меньше реакции от антивирусов. Далее в приложении делаем меню "проверить наличие новой версии", запускающее код проверки версии. При желании можно запускать его автоматом скажем раз в N>5 дней, делая пометку в реестре о дате последней проверки (но никак не при каждом запуске, я как админ большой сети задушил столько подобных обновляторов, которые лезут по 20 раз на дню версии проверять - давно уже со счета сбился... Положительный момент -= антивирус не будет ругаться при каждом старте, даже если его эвристике что-то не понравится

2. Качать обновления с своего сайта, посвященного приложению, а на с файлопомойки типа dropboxusercontent.com

3. Проверять обновления в два приема - сначала качать сведения о обновлении, а в случае надобности потом его самого. Методика обновления в примере уж не обижайтесь, пример того, как не надо это делать ... а если файл например битым скачается например ?! Мы тупо его запустим, даже не зная, что там.

Правильно это делается так:

3.1 на шаге 2 в сведениях об обновлении принимаем не только актуальную версию файла, но и его MD5 (на месте MD5 - любой хеш по желанию) и размер файла

3.2 в запросе подтверждения сообщаем юзеру, что будет закачано N кб (может, у него канал медленный и десмяток бегабайт ему качать не очень хочется), после подтверждения юзером обновления качаем файл куда-то в TEMP. При этом делаем цикл InternetReadFile в отдельном потоке (или вызываем Application.ProcessMessages хотя бы), показываем прогресс-индикатор, чтобы при длительной закачке при тормозном канале было понятно, что приложение не висит, а качает. Для отображения прогресс-индикатора используем размер, полученный на шаге 2

3.3 скачав, проверяем его размер и MD5. Если не совпадает, то был некий глюк закачки - можно попробовать еще раз, если не выйдет - выдать юзеру ошибку, что дескать обновиться не удается (в коде этого нет)

3.4 MD5 совпала - значит, загрузили что нужно. далее приложению нужно обновить самого себя. Это очень просто: 

- удаляем файл *.old в каталоге нашего приложения

- переименовываем свое приложение в *.old (полное текущее имя нашего EXE - Application.ExeName). Убеждаемся, что это сработало (файл запущенного EXE блокирован на удаление, но вот переименовывать его можно без проблем !). Если не может переименовать свой файл, то скорее всего нет прав на это, о чем и информируем юзера и завершаем обновление

- копируем загруженный на шаге 2.3 файл под именем Application.ExeName. Если успешно - хорошо, удаляем копию загруженного файла из Temp, если нет - переименовываем свой EXE назад в Application.ExeName и ругаемся на ошибку

- Сообщаем юзеру, что приложение успешно обновлено и нужно его перезапустить - запускаем приложение Application.ExeName и завершаем работу. Вуаля, запустилась новая версия.  

Файл *.old можно убивать при запуске, если он найдется, а можно и оставить - таким образом всегда после обновления останется предыдущая версия приложения на всякий случай и можно откатиться на нее в случае глюков

4. Добавить к своему приложению цифровую подпись. Наличие ЦП всегда хорошо, хотя и не обязательно.

  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Похожий контент

    • dexter
      От dexter
      Всем привет .
       
      Наконец-то прошла суматоха со сменой продукта на ПК. Теперь появились непонятки на смартфоне.
      Смотрим картинки в хронологическом порядке (из лички , прилагаются). После всех манипуляций , перехожу по ссылке после сканирования - ldc.my.kaspersky.com/r/ *** *** *** (много букв-цифр).
      Перенаправляет на глобальный сайт Касперского. Там скачиваю файл apk .
      Запускаю файл – пишет обновить приложение ?  Да. Далее показывает – приложение  не установлено , так как его пакет  недействителен (или повреждён) .

      Такой вопрос : как обновить лицензию на Касперского в смартфоне. Что делаю не так, как задумано разработчиками ?
       




    • zerrods134
      От zerrods134
      Не работает центр обновления виндовс,не могу обновить винду
    • Ari_x_100
      От Ari_x_100
      Добрый день.
      Столкнулся с аналогичной проблемой. Шаг описанный выше выполнил.
      FRST.txt Addition.txt AV_block_remove_2024.10.11-15.49.log
       
      Сообщение от модератора Mark D. Pearlstone Перемещено из темы.
    • Genom45
      От Genom45
      Приветствую, перепробовал все возможные портейбл версии антивирусов, AVbr просто не запускается, касперский выдал пару вирусов, тоже сделал и curiet. Проблема осталась 
       
    • igrok52
      От igrok52
      Подскажите пожалуйста. Антивирусом касперского пользуюсь много лет с 3.0 версии как все работает понимаю на пк. Подскажите пожалуйста кто знает по поводу Антивируса для Android устройств, не разу не ставил и вообще в экосистеме андроида не очень разбираюсь. Купил планшет дочке, загрузчик разблокирован, что там поставили понятия не имею, все работает но боюсь что есть какие то закладки от "китайцев" и пока не проверю не успокоюсь. Поможет антивирус касперского для андроида найти закладки или что то что может быть типа как в телефонах в китайских были закладки от китайцев которые смс отправляли на странные номера (лет 5 назад была эпидемия что и кнопочные и смартфоны дешевые слали смс по ночам в неизвестном направлении, оказалось что прошивка была с вирусами). Или для андроида версия может проверять только apk и не сможет увидеть что в системе есть вредоносы? Если что планшет из нашего ретейла, подумать не мог что у нас в солидных магазинах будут продавать планшеты с китайской прошивкой с разблокированным загрузчиком (Lenovo Xiaoxin Pad Pro 12.7).
×
×
  • Создать...