Вопрос Защита инсталлятора от злоумышленников

Pipocooling

Участник
Здравствуйте.

Некоторые вредители качают репаки, меняют название setup.exe на game.exe и запаковывают её в другой setup.exe, при запуски которого кроме оригинального установочного файла запускается нечто зловещее и вредное, далее раздают испорченный репак на других сайтах. Не могли бы вы помочь написать функцию поскольку у самого не получается.

Наш оригинальный setup.exe весит 616021 bytes, так вот надо чтобы при запуске сетапника, функция считывала размер *.exe файла который находится в директории {src}, после получения размера функция проверит, если *.exe файл = 616021 bytes установка идет дальше, если нет всплывает месиджбокс, что экзешник подменен.

В итоге когда злоумышленник запакует оригинал в месте с дрянью, при запуске функция проверит если в папке имеется экзешник другого размера, месиджбокс спалит злоумышленника.

Может решение банальное, но думаю это многих злоумышленников остановит от подмены сетапника.
 
а чем вариант по md5 не нравиться? размер может совпадать и в модифицированном,хотя шанс получить одинаковый размер мал
 
размер может совпадать
ни разу такого не видел, всегда есть разница в размере, да и месиджбокс будет предупреждать пользователя

md5 не нравиться?
нравится, но реализовать такое не смогу, вот почему обратился за помощью
 
Pipocooling, не проверял, в теорий все должно работать:

Код:
[Setup]
AppName=Ex
AppVerName=Ex v1.0
DefaultDirName=Ex
OutputDir=.

DisableWelcomePage=No
OutputBaseFilename=Setup

[Code]
var
  CheckMySetup: string;
  NewButton1: TNewButton;

procedure ButtonClick(Sender: TObject);
begin
  CheckMySetup := GetMD5OfFile(ExpandConstant('{src}\Setup.exe'));
    begin
      if CheckMySetup = '45c0e8c09e36bf51ede048f32b8a390f' then
       begin
          MsgBox('Hash is ok', mbInformation, MB_OK);
       end;
     end;
   end;

procedure InitializeWizard();
begin
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(112);
    Top := ScaleY(155);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Check MD5';
    OnClick:=@ButtonClick;
  end;
end;
 
у меня не пашет, да и думаю всетки лучше было бы если размер проверял а не md5
 
Я не понимаю смысл всего этого мероприятия. EXE'шник злоумышленника всё равно запустится раньше, установит всё что угодно, потом запустит Setup, а он, ска, отказывается работать. И человек, скачавший раздачу, мало того, что останется с вирусом, так ещё и игра не установится. Комбо фейл.
 
должно работать
не сработало

смысл всего этого мероприятия
смысл в том что запустится месиджбокс, в котором будет указано что экзешник подменили и человек будет знать, что это не репакер ему впарил гадость, а сайт и юзер который распрастраняет это
так же можне будет указать ссылку на первоисточник, да и человек будет уже знать что что-то подхватил, а не играть в неведении что у него майнер стоит
 
Все работает, просто есть одна большая проблема. Хэш должен храниться где нибудь отдельно от инстолятора что бы можно было сверять. Вы не можете создать инстолятор предварительно вшив в него хэш сумму, потому что в итоге мы будем иметь новый файл с новым хэшом.
Код:
[Setup]
AppName=Ex
AppVerName=Ex v1.0
DefaultDirName=Ex
OutputDir=.

DisableWelcomePage=No
OutputBaseFilename=Setup
[Code]
var
  CheckMySetup, CheckMySetup2: string;
  NewButton1: TNewButton;

procedure ButtonClick(Sender: TObject);
begin
  CheckMySetup := GetMD5OfFile(ExpandConstant('{src}\Setup.zip'));
    begin
      if CheckMySetup2 = '' then
       begin
          MsgBox('Hash checking done. Everything works well I guess', mbInformation, MB_OK);
       end;
     end;
   end;

procedure InitializeWizard();
begin
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(25);
    Top := ScaleY(325);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Check MD5';
    OnClick:=@ButtonClick;
  end;
end;
Лично просто предлагаю создать второй экзешник который будет проверят файлы на целостность.
 
будем иметь новый файл с новым хэшом
это и так понятно было, вот почему правильнее было бы размер в байтах проверять, после компеляции хэш изменится но байты будут те же
а кто говорит что это не поможет я не согласен, поскольку не раз сталкивался с такой проблемой, и всегда зараженный сетапник имеет больший размер, поскольку нельзя впихнут в другой сетапник оригинальный инсталер+майнер так чтоб размер не изменился
 
это и так понятно было, вот почему правильнее было бы размер в байтах проверять, после компеляции хэш изменится но байты будут те же
а кто говорит что это не поможет я не согласен, поскольку не раз сталкивался с такой проблемой, и всегда зараженный сетапник имеет больший размер, поскольку нельзя впихнут в другой сетапник оригинальный инсталер+майнер так чтоб размер не изменился
Код:
[Setup]
AppName=Ex
AppVerName=Ex v1.0
DefaultDirName=Ex
OutputDir=.

DisableWelcomePage=No
OutputBaseFilename=Setup

[Code]
var
  Size: Integer;
  NewButton1: TNewButton;

procedure ButtonClick(Sender: TObject);
begin
  if FileSize(ExpandConstant('{src}\Setup.exe'), Size) then
  begin
// in bytes (1048576 bytes = 1 megabyte)
    if Size = 506822 then
      MsgBox('Precise size', mbInformation, MB_OK)
    else
      MsgBox('Inaccurate size.', mbInformation, MB_OK);
  end
end;

procedure InitializeWizard();
begin
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := WizardForm;
    Left := ScaleX(25);
    Top := ScaleY(325);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Check Size';
    OnClick:=@ButtonClick;
  end;
end;
 
Avengerz13, спасибо :drinks:

а можно сделать чтоб без кнопки было ? чтоб проверка шла сразу после запуска, то есть если размер совпадает месиджбокса нету, если же не совпадает тогда и месиджбокс сообщяет об этом ?
 
Pipocooling,
Код:
[Setup]
AppName=Ex
AppVerName=Ex v1.0
DefaultDirName=Ex
OutputDir=.

DisableWelcomePage=No
OutputBaseFilename=Setup
[Code]
var
  Size: Integer;

function InitializeSetup(): Boolean;
begin
  if FileSize(ExpandConstant('{src}\Setup.exe'), Size) then
  begin
// in bytes (1048576 bytes = 1 megabyte)
    if Size = 506503 then
      Result := True
    else
      MsgBox('Warning! probably you get infected installer', mbInformation, MB_OK);
  end;
end;
 
Может кто знает как добавить цифровую подпись к инсталлятору? :)
 
Avengerz13, спасибо, создал сертификат, но добавить к инсталлятору не получается:unknown:
 
Avengerz13, спасибо огромное, именно то что над!!! Теперь нехорошим людям будет значительно сложнее что-то запихнуть в чужой сетапник и дискредитировать автора.
 
Avengerz13, что прописать в скрипте? можешь скинуть пример? у меня есть файл testCert.cer и скрипт:D
 
Avengerz13, что прописать в скрипте? можешь скинуть пример? у меня есть файл testCert.cer и скрипт:D
1. Устанавливаешь SignTool который входить в Windows SDK.
2. В Inno Setup вкладка Tools > Configure Sign Tools... > add > Указываешь имя которое хочешь (Допустим Mickey1sSignTool) > указываешь путь до signtool.exe и указываешь нужные параметры.
3. Можно просто указать путь до signtool.exe и указывать параметры в скрипте.

Это когда указаны параметры в IDE
Код:
[Setup]
SignTool=Mickey1sSignTool
SignedUninstaller=Yes
Это когда указываешь параметры вручную через скрипт
$q - в данном случай обозначает кавычки, когда указываешь в ручную. Например $qHello$q.
Код:
[Setup]
SignTool=Mickey1sSignTool sign /f $qtestCert.cer$q /n $qMickey1s Publisher$q /d $qMy Product Name$q /t http://timestamp.comodoca.com/authenticode $f
SignedUninstaller=Yes
https://msdn.microsoft.com/en-us/library/windows/desktop/aa388170(v=vs.85).aspx?f=255&MSPPError=-2147217396
Здесь найдешь нужные тебе примеры для подписания.
Не забывай последний параметр всегда должен заканчиваться на $f
 
Последнее редактирование:
Назад
Сверху