Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> <<Работа с заголовком exe>> 
:(
    Опции темы
kostik_16
Дата 4.9.2003, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



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

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


Я надеюсь вы поможите мне, если что то задавайте вопросы! Всем заранее благодарен!!!!!!!!!!!!!
PM MAIL   Вверх
stab
Дата 4.9.2003, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 5.9.2003, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



он пишет защиту типа ASProtect...



--------------------
С уважением, г-н Посол.
PM   Вверх
oleg1973
Дата 5.9.2003, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



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


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
kostik_16
  Дата 5.9.2003, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(p0s0l @ 5.9.2003, 08:49)
он пишет защиту типа ASProtect...

Пишу я действительно программу типа ASProtect!!!! exclamation.gif
PM MAIL   Вверх
<Spawn>
Дата 6.9.2003, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Все о формате PE можно узнать тут.

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

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]));
//и т.д.



Это сообщение отредактировал(а) <Spawn> - 6.9.2003, 12:04


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
stab
Дата 7.9.2003, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



kostik_16, куда пропал? на чем остановился или в чем конкретно проблема?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
Дата 7.9.2003, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



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

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

PM MAIL   Вверх
stab
Дата 7.9.2003, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



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

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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
  Дата 7.9.2003, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



Цитата(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;
PM MAIL   Вверх
stab
Дата 7.9.2003, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



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

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

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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
kostik_16
  Дата 8.9.2003, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 23.7.2003

Репутация: -4
Всего: 1



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



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

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

Мне надо приписать мою процедуру к экзешнику! Как это сделать?
PM MAIL   Вверх
oleg1973
Дата 8.9.2003, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



взять исходник какогонить виря под w9x и поглядеть как там сделано smile.gif))


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
stab
Дата 8.9.2003, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



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.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 8.9.2003, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



К слову: подобная проблема обсуждается здесь: http://pascal.sources.ru/cgi-bin/forum/YaB...;num=1063033050



--------------------
С уважением, г-н Посол.
PM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.