Проблема с иконками(delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 7ion, 24 May 2007.

  1. 7ion

    7ion Banned

    Joined:
    29 Oct 2006
    Messages:
    68
    Likes Received:
    26
    Reputations:
    2
    Есть код самораспространяющегося вируса. Т.е. вирь сканит диск на исполняемые фалы, и джойнит к ним свой код, но есть проблема, после склеивания пропадают значки зараженных файлов. можно как-то этого избежать? или вернуть их обратно?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Как я понял - эта зараза не заражает файлы, а просто крепит копирует себя с именем другой проги, а потом присоединяет её к себе?
    Если так, то выход примерно такой - Динамически изменять ресурсы.
    Скорее всего просто прога не имеет значка вообще, а то что конектится за ним, - это уже не берется во внимание. Исправить проблему можно так:
    В прогу вмантируешь пустую иконку. И при заражении просто нужно у заражаемой проги выдрать иконку и вмантировать её к себе.
    С виду всё тяжко получается, но на деле всё нет так уж и страшно.
    т.к. Выдрать иконку из чужой проги, проще простого.
    Code:
    uses ShellApi;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
     IconIndex: word;
     h: hIcon;
    begin
     IconIndex := 0;
     h:= ExtractIcon(hinstance,'c:\1.exe',IconIndex);
     DrawIcon(Form1.Canvas.Handle, 10, 10, h);
    end;
    
    Выдирет иконку и нарисует её на экране.

    Для того чтобы засунуть иконку в файл есть парочку сособов:
    1) - Разбираем PE заголовок Выдергиваем от туда адрес ресурсов
    - Разбираем талицу ресурсов.
    - Находим ресурс иконки и заменяем его на свой
    2) Я слыхал про проект madshi. ТАм есть модуль - MadRes. Он умеет заменять, удалять и добавлять ресурсы
     
    1 person likes this.
  3. 7ion

    7ion Banned

    Joined:
    29 Oct 2006
    Messages:
    68
    Likes Received:
    26
    Reputations:
    2
    Ок, спасибо за помощь.
     
  4. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    638
    Reputations:
    476
    Вот пример, который возможно также как-то поможет:
    Скачать, 164 Кб.
    Там реализовано использование следующей процедуры:
    procedure SetAppIcon(FileName,IconFile,ResName:string);
    где FileName - имя файла программы, иконку которого меняем; IconFile - файл иконки *.ico, на которую меняем; ResName - имя ресурса иконки в приложении, например у прог на Делфи обычно 'MAINICON'.
     
    _________________________
    #4 begin_end, 24 May 2007
    Last edited: 24 May 2007
    1 person likes this.
  5. 7ion

    7ion Banned

    Joined:
    29 Oct 2006
    Messages:
    68
    Likes Received:
    26
    Reputations:
    2
    спасибо за помощь, только есть вопрос: содержимое иконки можно брать не из файла, а из переменной из кода выше?
     
  6. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    638
    Reputations:
    476
    Иконку можно брать только из файла. Другого способа смены иконки я пока не встречал. Конечно нам необязательно сначала сохранять иконку в файл а потом читать и менять. В предложенный мной код нужно добавить часть для считывания иконки из файла, т.е. получить не HICON, как в коде от slesh, а именно саму иконку. Но готового кода пока нет (мне бы тож не помешал для джоинера) - сам пробую, ищу...
     
    _________________________
    1 person likes this.
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Народ. А кто вам не дает сохранить эту иконку в файл?
     
  8. 2pick

    2pick Elder - Старейшина

    Joined:
    17 Mar 2007
    Messages:
    117
    Likes Received:
    39
    Reputations:
    2
    Как тогда не выводить на экран, а сохранять в файл?

    С madshi разобрался, но это ещё 20 кило прироста к файлу... Одно радует... при работес madshi не надо предварительно запихивать иконку в файл. Чисто вставить иконку, а он сам делает что надо.
     
    #8 2pick, 29 May 2007
    Last edited: 29 May 2007
  9. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Например так:
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      IconIndex: word;
      Icon: Ticon;
    begin
      IconIndex := 0;
      Icon := Ticon.Create;
      Icon.Handle := ExtractIcon(hinstance,'C:\1.exe',IconIndex);
      Icon.SaveToFile('C:\1.ico');
      Icon.Free;
    end;
    
    Ток нафига тебе в файл? Вроде договорились к себе в ресурс пихать...
     
  10. 2pick

    2pick Elder - Старейшина

    Joined:
    17 Mar 2007
    Messages:
    117
    Likes Received:
    39
    Reputations:
    2
    сохранять всё равно приходится в файл. мэдши не может выдрать иконку...
    А с Ticon это надо ещё модуль icon (или типа того или graph ли, не важно) цеплять... он ещё 100 кило придаёт объему
     
    #10 2pick, 23 Jun 2007
    Last edited: 23 Jun 2007