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

Pipocooling

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

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

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

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

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

Mrman

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

Pipocooling

Участник
размер может совпадать
ни разу такого не видел, всегда есть разница в размере, да и месиджбокс будет предупреждать пользователя

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

Avengerz13

Участник
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;
 

Stas

Участник
у меня не пашет, да и думаю всетки лучше было бы если размер проверял а не md5
 

Timick

Старожил
Я не понимаю смысл всего этого мероприятия. EXE'шник злоумышленника всё равно запустится раньше, установит всё что угодно, потом запустит Setup, а он, ска, отказывается работать. И человек, скачавший раздачу, мало того, что останется с вирусом, так ещё и игра не установится. Комбо фейл.
 

Pipocooling

Участник
должно работать
не сработало

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

Avengerz13

Участник
Все работает, просто есть одна большая проблема. Хэш должен храниться где нибудь отдельно от инстолятора что бы можно было сверять. Вы не можете создать инстолятор предварительно вшив в него хэш сумму, потому что в итоге мы будем иметь новый файл с новым хэшом.
Код:
[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;
Лично просто предлагаю создать второй экзешник который будет проверят файлы на целостность.
 

Pipocooling

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

Avengerz13

Участник
это и так понятно было, вот почему правильнее было бы размер в байтах проверять, после компеляции хэш изменится но байты будут те же
а кто говорит что это не поможет я не согласен, поскольку не раз сталкивался с такой проблемой, и всегда зараженный сетапник имеет больший размер, поскольку нельзя впихнут в другой сетапник оригинальный инсталер+майнер так чтоб размер не изменился
Код:
[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;
 

Pipocooling

Участник
Avengerz13, спасибо :drinks:

а можно сделать чтоб без кнопки было ? чтоб проверка шла сразу после запуска, то есть если размер совпадает месиджбокса нету, если же не совпадает тогда и месиджбокс сообщяет об этом ?
 

Avengerz13

Участник
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;
 

Mickey1s

Ветеран
Модератор
Может кто знает как добавить цифровую подпись к инсталлятору? :)
 

Mickey1s

Ветеран
Модератор
Avengerz13, спасибо, создал сертификат, но добавить к инсталлятору не получается:unknown:
 

Pipocooling

Участник
Avengerz13, спасибо огромное, именно то что над!!! Теперь нехорошим людям будет значительно сложнее что-то запихнуть в чужой сетапник и дискредитировать автора.
 

Mickey1s

Ветеран
Модератор
Avengerz13, что прописать в скрипте? можешь скинуть пример? у меня есть файл testCert.cer и скрипт:D
 

Avengerz13

Участник
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
 
Последнее редактирование:
Сверху