Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > <<Работа с заголовком exe>>


Автор: kostik_16 4.9.2003, 21:06
Если не знаешь, то не пиши! Пишите только по делу!!!!!!!!!!
Вопрос заключается в следующем: способ работы с заголовком экзешника(чтение заголовка, замена его на новый)
Например мне надо изменить в сегменте данных размер моего экзешника, и т.д. Я надеюсь вы поняли что я хотел вам сказать.
Ответ может заключатся, как в исходнике, так и в ссылке на сайт!
Я надеюсь увидеть ваши исходники с детальным обьяснением!

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


Я надеюсь вы поможите мне, если что то задавайте вопросы! Всем заранее благодарен!!!!!!!!!!!!!

Автор: stab 4.9.2003, 23:02
интересно что такое "стек очереди процессора " ? smile.gif Все раскажу если только убедишь меня, что пишешь не вирус и не троян smile.gif

Автор: p0s0l 5.9.2003, 08:49
он пишет защиту типа ASProtect...

Автор: oleg1973 5.9.2003, 13:56
ваше не вижу проблемы поднятой в вопросе
разве трудна зачитать N количество байт с начала файла в буффер и разобрать по полочкам
формат РЕ ехе давно уже не секрет

Автор: kostik_16 5.9.2003, 19:39
Цитата(p0s0l @ 5.9.2003, 08:49)
он пишет защиту типа ASProtect...

Пишу я действительно программу типа ASProtect!!!! exclamation.gif

Автор: <Spawn> 6.9.2003, 11:54
Все о формате PE можно узнать http://rsdn.ru/?article/?baseserv/pe_coff.xml.

Доступ к отдельным полям можно получить, например, используя указатели:
Код

var
ImageBase:DWord;
ImageDosHeader:PImageDosHeader;
ImageFileHeader:PImageFileHeader;
ImageOptionalHeader:PImageOptionalHeader;
ImageImportDescriptor:PImageImportDescriptor;
begin
ImageBase:=GetModuleHandle(nil);// hInstance
ImageDosHeader:=PImageDosHeader(ImageBase);
ImageFileHeader:=PImageFileHeader(ImageBase+ImageDosHeader._lfanew+SizeOf(DWord));
ImageOptionalHeader:=PImageOptionalHeader(DWord(ImageFileHeader)+SizeOf(TImageFileHeader));
ImageImportDescriptor:=PImageImportDescriptor(ImageBase+
                     ImageOptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
ShowMessage(Format('%x',[ImageDosHeader.e_magic]));
//и т.д.


Автор: stab 7.9.2003, 12:38
kostik_16, куда пропал? на чем остановился или в чем конкретно проблема?

Автор: kostik_16 7.9.2003, 15:36
Цитата(cully @ 7.9.2003, 12:38)
kostik_16, куда пропал? на чем остановился или в чем конкретно проблема?

Сейчас я остановился на том, что мне надо изменить заголовок экзешника, тоесть я прикрепил свю процедуру в конец файла и мне надо изменить заголовок так, что-бы при запуске экзешника запускалась моя программа, которая находится в конце.
Я думаю ты понял, что я имел в виду.
Далее после выполнения определенных действий запускается сама программа( тело программы к которому я прикрепился).
Вот пожалуй и все!

Автор: stab 7.9.2003, 16:04
каким образом ты добавил процедуру в конец? Расширил последнюю секцию или создал новую секцию? От этого зависит что делать дальше.

з.ы. давай далее на форуме общаться, а не почтой.

Автор: kostik_16 7.9.2003, 21:06
Цитата(cully @ 7.9.2003, 16:04)
каким образом ты добавил процедуру в конец? Расширил последнюю секцию или создал новую секцию? От этого зависит что делать дальше.

procedure MyProc;
begin
messagebox(0,'','',0)
end;

procedure EndMyProc;
begin
end;

begin
od.Execute;
fn:= od.FileName;
procSize := cardinal(@EndMyProc) - cardinal(@MyProc);
h := CreateFile (PChar(fn), GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
getfilesize(h,@tmp);
SetFilePointer (h, 27, nil, FILE_BEGIN);
buf := @MyProc;
WriteFile (h, buf^, procSize, tmp, nil);
CloseHandle (h)
end;

Автор: stab 7.9.2003, 22:58
kostik_16, а почему ты считаешь, что запись происходит в конец файла?
Цитата
SetFilePointer (h, 27, nil, FILE_BEGIN);

это вроде 27-ой байт от начала файла, таких маленьких PE EXE не бывает, в такой объем только заголовок DOS EXE влезет smile.gif

Кроме того при простом дописывании в конец файла ни чего не выйдет, есть такая штука называется секция. В екзешнике их может быть несколько. Все данные и код кроме заголовков должны находится в какой либо секции. Простое дописывание не приведет к попаданию кода в последнюю секцию. Для того что бы это произошло надо подправить размер последней секции или создать еще одну секцию в которой будет твой код. Надеюсь ты читал описание формата PE EXE? Мне кажется, что нет smile.gif

Автор: kostik_16 8.9.2003, 15:59
Цитата(cully @ 7.9.2003, 22:58)
Цитата
это вроде 27-ой байт от начала файла, таких маленьких PE EXE не бывает, в такой объем только заголовок DOS EXE влезет smile.gif



На счет 27 это я просто не то скопировал! Там GetFilesize().
А на счет секций читал, но чет не понял наверное, просто все пишут на своем языке, но он не до всех доходит.

notify.gif Так как найти выход из моей ситуации? notify.gif

Мне надо приписать мою процедуру к экзешнику! Как это сделать?

Автор: oleg1973 8.9.2003, 18:36
взять исходник какогонить виря под w9x и поглядеть как там сделано smile.gif))

Автор: stab 8.9.2003, 22:42
kostik_16, буду расказывать, т.к. писать за тебя не собираюсь smile.gif а то, что-то у тебя прям совсем не получается.

Для начала немного о формате PE EXE. Описание формата можно найти в инете, но довольно сложно в нем разобраться. Я после первого прочтения, признаюсь честно, ни фига не понял. Ну дык лана, схематичная структура:

DOS заголовок (нам не нужен)
Stub (заглушка, та прграмма котороя показывает при запуске под DOS'ом сообщение о том, что данный экзешник работает только под windows)
PE заголовок (без коментариев)
Таблица секций (кол-во вхождений N указано в PE заголовке)
Секция 1
Секция 2
...
Секция N

Вот и все..., теперь подробнее о каждой части. Намерено не буду приводить описание структур, их ты должен изучить сам.

DOS заголовок
Содержит в себе информацию о параметрах stub'а. Нам не нужен. После загловка идет выравнивание и информация о программе. И самое интересное -- поле указывающее смещение PE загловка от начала файла. Т.е. для того что бы считать PE заголовок надо читать со смещения равного значению этого поля.

Stub
не важно smile.gif

PE заголовок

Описывает характеристики и структуру экзешника. Отсюда можно подчерпнуть такую информацию:

1. Кол-во записей в таблице секций (Num Objects) .
2. Адрес по которому загружается программа (Image Base). То что указывается в дельфях в опциях проекта. Для exe это обычно 00400000h.
3. Точка входа (Entry point RVA). RVA рашифровывается как Relative Virtual Address. Такого рода адреса указываются относительно Image Base, т.е. для того что бы во время работы программы получить данные по RVA 123456h надо к 123456h прибавить Image Base. Зачем так сделано? Для того что бы у программы не было привязки к конкретному Image Base. Также есть VA, т.е. Virtual Address, это RVA к которым прибавлен Image Base. По VA и происходят все обращения во время работы программы.

Таблица секций

Для каждой секции здесь указаны: имя, физические/виртуальные смещения и размеры. Физичиские смещения и размеры -- это смещения и размеры в файле. Виртуальные -- в памяти, когда программа уже загружена. Следует учесть, что все физические смещения и размеры должны быть кратны полю File Align из PE заголовка, а виртуальные полю Object Align или, как стали называть позднее, Section Align.


Итого

для того что бы дописать свой код в конец последней секции надо:

1. Определить смещение PE заголовка.
2. Считать PE заголовок.
3. Считать данные о последней секции.
4. Модифицировать данные о последней секции с учетом размера нашего кода, File Align и Object Align.
5. Поменять точку входа предварительно сохранив старую для того что бы потом сделать прыжок на начало программы.
6. Записать свой код в конец.
7. Может чего забыл smile.gif

И напоследок огорчу smile.gif Вызовы API функций в твоем коде не будут работать. Почему? Об этом раскажу потом или может быть всезнающий all раскажет. Для начала просто осуществи вызов программы по сохраненому Entry Point RVA.

Автор: p0s0l 8.9.2003, 22:44
К слову: подобная проблема обсуждается здесь: http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1063033050

Автор: kostik_16 8.9.2003, 23:14
Цитата(cully @ 8.9.2003, 22:42)
Описание формата можно найти в инете, но довольно сложно в нем разобраться.

С начала так с начала!

Первое, где можно достать ПОЛЕЗНУЮ информацию про PE, так как вы не подумайте, что я захотел, что-бы вы за меня все сделали, я до этого искал и нашел много чего про PE, но там они думают в своих описаниях, что все все знают и из-за этого получается неразбериха!

Далее про структуру PE мне давно уже известно, у меня сейчас два полных и два неполных исходников вирусов на ASM, только первый не работает, а со вторым я никак не могу разобраться!

Вот и выплывает проблема - много теории и 0 практики, так как я в своей квалифе использую только Delphi и ASM, а описания как работать с заголовком PE и так далее даются на C++!

Вот и получается такая лажа!!!!!!!!!!!!


Отсюда сделайте выводы и посоветуйте мне, что делать дальше?

Автор: stab 8.9.2003, 23:26
kostik_16, приведи пожалуйста структуру описывающую PE загловок на любом языке. Что тебе в ней не понятно выдели жирным. Может быть тебе не понятно как прочитать информацию из файла?

з.ы. все что необходимо для работы есть в windows.pas: _IMAGE_FILE_HEADER, _IMAGE_DOS_HEADER, _IMAGE_OPTIONAL_HEADER,... так что не надо ля-ля smile.gif

Автор: kostik_16 8.9.2003, 23:43
Вот код вируса, который мне практически непонятен!:

Модератор: код удалён. Согласно правилам форума публикация таких кодов запрещена!

Вот пожалуй пока-что все! Что ты мне дальше посоветуешь?

Автор: kostik_16 8.9.2003, 23:48
Цитата(cully @ 8.9.2003, 23:26)
P.S. все что необходимо для работы есть в windows.pas: _IMAGE_FILE_HEADER, _IMAGE_DOS_HEADER, _IMAGE_OPTIONAL_HEADER,... так что не надо ля-ля smile.gif

Что это за файл? -
Цитата

Цитата

Цитата

windows.pas



Автор: stab 9.9.2003, 00:14
Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 fs: TFileStream;
 pe_offset: DWORD;
 ifh: _IMAGE_FILE_HEADER;
 ioh: _IMAGE_OPTIONAL_HEADER;
 i: Integer;
 ish: _IMAGE_SECTION_HEADER;
begin
 fs := TFileStream.Create('c:\test.exe', fmOpenRead);
 fs.Position := $3C;
 fs.Read(pe_offset, SizeOf(pe_offset));
 fs.Position := pe_offset;
 fs.Position := fs.Position + 4; // skip PE, 0, 0 signature
 fs.Read(ifh, SizeOf(ifh));
 ShowMessage('Section count: ' + IntToStr(ifh.NumberOfSections));
 fs.Read(ioh, SizeOf(ioh));
 ShowMessage('Image Base: ' + IntToHex(ioh.ImageBase, 8));
 ShowMessage('Entry point RVA: ' + IntToHex(ioh.AddressOfEntryPoint, 8));
 ShowMessage('Object Align: ' + IntToHex(ioh.SectionAlignment, 8));
 ShowMessage('File Align: ' + IntToHex(ioh.FileAlignment, 8));
 for i := 1 to ifh.NumberOfSections do
 begin
   fs.Read(ish, SizeOf(ish));
   ShowMessage('Section #' + IntToStr(i) + ' Name: ' + PChar(@ish.Name));
   ShowMessage('Section #' + IntToStr(i) + ' Virtual Size: ' + IntToHex(ish.Misc.VirtualSize, 8));
   ShowMessage('Section #' + IntToStr(i) + ' RVA: ' + IntToHex(ish.VirtualAddress, 8));
   ShowMessage('Section #' + IntToStr(i) + ' Physical Size: ' + IntToHex(ish.SizeOfRawData, 8));
   ShowMessage('Section #' + IntToStr(i) + ' File Offset: ' + IntToHex(ish.PointerToRawData, 8));
 end;
 fs.Free;
end;

end.


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

Автор: kostik_16 9.9.2003, 19:01
Цитата(cully @ 8.9.2003, 22:42)
4. Модифицировать данные о последней секции с учетом размера нашего кода, File Align и Object Align.
5. Поменять точку входа предварительно сохранив старую для того что бы потом сделать прыжок на начало программы.
6. Записать свой код в конец.

Если я не ошибаюсь, то именно до этих пунктов мы дошли!
Итак главной проблемой сейчас (для меня) является:
Цитата

4. Модифицировать данные о последней секции с учетом размера нашего кода, File Align и Object Align.
5. Поменять точку входа предварительно сохранив старую для того что бы потом сделать прыжок на начало программы.


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

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

Если я не ошибаюсь, то теорию я понял, но как это сделать на практике - это самая главная проблема confused.gifconfused.gifconfused.gif?

Помогите, ведь осталось всего чуть-чуть! Всем заранее спасибо, а особенно cully и p0s0l!

Автор: Vit 10.9.2003, 05:00
Модератор: Совершенно явственно идёт обсуждение написания вируса или вредоносной программы. Уже дошло до публикации кодов вирусов. Обсуждение таких тем и публикация таких кодов запрещена на данном форуме, а также нарушает законодательство стран имеющих отношение к данному форуму и его администрации. В связи с этим обсуждение прекращено. Тема закрыта.


У меня личная просьба к cully и p0s0l. Вы очень сильные программисты, особенно в области низкоуровневого программирования, поэтому я хочу обратить Ваше внимание на то ЧТО именно спрашивают на форуме, и каков уровень подготовки тех кто спрашивает. Я не могу прекратить обсуждение пока участник не перешагнёт некую грань, однако предлагаю впредь избегать делиться своими знаниями в таких скользких вопросах. К сожалению примерно раз в 3 месяца всплывает подобный топик, когда совсем слабенький программист пытается выпытать что-то явно относящееся к созданию вредоносного. Если это ясно на 100% я закрываю эту тему сразу, если же она замаскирована под что-то безобидное, то я предлагаю просто игнорировать такие топики.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)