Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Проблема с иконками(delphi) (https://forum.antichat.xyz/showthread.php?t=40728)

7ion 24.05.2007 13:29

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

slesh 24.05.2007 14:54

Как я понял - эта зараза не заражает файлы, а просто крепит копирует себя с именем другой проги, а потом присоединяет её к себе?
Если так, то выход примерно такой - Динамически изменять ресурсы.
Скорее всего просто прога не имеет значка вообще, а то что конектится за ним, - это уже не берется во внимание. Исправить проблему можно так:
В прогу вмантируешь пустую иконку. И при заражении просто нужно у заражаемой проги выдрать иконку и вмантировать её к себе.
С виду всё тяжко получается, но на деле всё нет так уж и страшно.
т.к. Выдрать иконку из чужой проги, проще простого.
Код:

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. Он умеет заменять, удалять и добавлять ресурсы

7ion 24.05.2007 15:42

Ок, спасибо за помощь.

begin_end 24.05.2007 19:19

Вот пример, который возможно также как-то поможет:
Скачать, 164 Кб.
Там реализовано использование следующей процедуры:
procedure SetAppIcon(FileName,IconFile,ResName:string);
где FileName - имя файла программы, иконку которого меняем; IconFile - файл иконки *.ico, на которую меняем; ResName - имя ресурса иконки в приложении, например у прог на Делфи обычно 'MAINICON'.

7ion 24.05.2007 19:33

спасибо за помощь, только есть вопрос: содержимое иконки можно брать не из файла, а из переменной из кода выше?

begin_end 24.05.2007 19:56

Иконку можно брать только из файла. Другого способа смены иконки я пока не встречал. Конечно нам необязательно сначала сохранять иконку в файл а потом читать и менять. В предложенный мной код нужно добавить часть для считывания иконки из файла, т.е. получить не HICON, как в коде от slesh, а именно саму иконку. Но готового кода пока нет (мне бы тож не помешал для джоинера) - сам пробую, ищу...

slesh 25.05.2007 14:28

Народ. А кто вам не дает сохранить эту иконку в файл?

2pick 29.05.2007 08:12

Цитата:

Сообщение от slesh
Код:

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;


Как тогда не выводить на экран, а сохранять в файл?

С madshi разобрался, но это ещё 20 кило прироста к файлу... Одно радует... при работес madshi не надо предварительно запихивать иконку в файл. Чисто вставить иконку, а он сам делает что надо.

Joker-jar 29.05.2007 08:42

Цитата:

Как тогда не выводить на экран, а сохранять в файл?
Например так:
Код:

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;

Ток нафига тебе в файл? Вроде договорились к себе в ресурс пихать...

2pick 23.06.2007 13:12

сохранять всё равно приходится в файл. мэдши не может выдрать иконку...
А с Ticon это надо ещё модуль icon (или типа того или graph ли, не важно) цеплять... он ещё 100 кило придаёт объему


Время: 14:06