PDA

Просмотр полной версии : Проблема с иконками(delphi)


7ion
24.05.2007, 13:29
Есть код самораспространяющегося вируса. Т.е. вирь сканит диск на исполняемые фалы, и джойнит к ним свой код, но есть проблема, после склеивания пропадают значки зараженных файлов. можно как-то этого избежать? или вернуть их обратно?

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 Кб. (http://kemlib.narod.ru/SetAppIcon.rar)
Там реализовано использование следующей процедуры:
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
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 кило придаёт объему