Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2014, 17:55   #1
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию КАК сигнатура знает!

КАК сигнатура узнает какие байты РЕ файла соотвецтвуют ее частям? К примеру, я хочу начать разбор файла.
Отсчитывать байты равными долями или же как?
То есть для каждого поля структуры- сигнатуры, как опридилить что чему соотвецтвует?

Код:
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE заголовок
 
USHORT e_magic; // Магическое число                               4D 5A
 
USHORT e_cblp; // Количество байт на последней странице файла
 
USHORT e_cp; // Количество страниц в файле
 
USHORT e_crlc; // Relocations
 
USHORT e_cparhdr; // Размер заголовка в параграфах
 
USHORT e_minalloc; // Minimum extra paragraphs needed
 
USHORT e_maxalloc; // Maximum extra paragraphs needed
 
USHORT e_ss; // Начальное (относительное) значение регистра SS
 
USHORT e_sp; // Начальное значение регистра SP
 
USHORT e_csum; // Контрольная сумма
 
USHORT e_ip; // Начальное значение регистра IP
 
USHORT e_cs; // Начальное (относительное) значение регистра CS
 
USHORT e_lfarlc; // Адрес в файле на таблицу переадресации
 
USHORT e_ovno; // Количество оверлеев
 
USHORT e_res[4]; // Зарезервировано
 
USHORT e_oemid; // OEM identifier (for e_oeminfo)
 
USHORT e_oeminfo; // OEM information; e_oemid specific
 
USHORT e_res2[10]; // Зарезервировано
 
LONG e_lfanew; // Адрес в файле нового .exe-заголовка
 
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Dimka-novitsek вне форума Ответить с цитированием
Старый 30.06.2014, 18:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
КАК сигнатура узнает какие байты РЕ файла соотвецтвуют ее частям?
Сигнатура это тип. Она никак ничего не узнает, она сама представляет что-то другое.
РЕ формат читает загрузчик операционки, и как правило он опирается на смещения. Т.е. (очень грубо скажу) например 4 первых байта - указатель на сколько сместиться в глубину файла, чтоб стать на первый байт секции данных. Следующие 4 - смещение на секцию, где находится скомпилированный код.
Почитай про формат РЕ, как он устроен, и какие данные заголовок исполнимого файла хранит. Можешь, если хочешь, взять мою статью про компиляторы, я в первых главах слегка разбирал этот заголовок.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2014, 18:21   #3
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

А как для начала найти статью?
Dimka-novitsek вне форума Ответить с цитированием
Старый 30.06.2014, 18:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

В блоге нашего клуба: http://www.programmersclub.ru/%D0%9A...D%D0%B8%D1%8F/
Там же в конце чтиво.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2014, 18:30   #5
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Спасибо!!!

Я так и не понял насчет поля e_lfanew. Это по ходу самое важное поле этой сигнатуры, _IMAGE_DOS_HEADER, а я не понял.



Вот я всю статью читаю в нотепаде, я озаглавил .asm ак много красивее подсветка.

Возьмем также типовой файл .exe. во всяком случае нормальный файл и без наворотов, я его прилагаю.

И вот его разбор. Я размечаю поля структуры (сигнатуры или как ее) прямо в нотепаде.
Цитата:
Анатомия файла
Иван Скляров (www.sklyaroff.com)

Спецвыпуск: Хакер, номер #057, стр. 057-026-1


--------------------------------------------------------------------------------

Просто, но со вкусом о PE-формате файлов
Зачем крэкеру знать все о PE-формате? Затем же, зачем хирургу знать устройство человеческого организма. PE-формат - это основной формат файлов Windows, с которым приходится работать крэкеру. Без знаний об этом формате невозможно полноценно заниматься крэкингом.

Полного описания PE-формата не существует в природе. Есть множество материалов в MSDN, есть отдельные статьи исследователей (например несколько статей от Мэтта Питтрека, которые присутствуют и в MSDN), но все это содержит недомолвки, неточности, ошибки. Впрочем, и эта статья никак не претендует на полное описание и организует лишь вводное знакомство с PE-форматом.

Все структуры, макросы и сигнатуры PE-формата содержатся в заголовочном файле winnt.h, на него и буду опираться в дальнейшем. Увы, этот файл довольно скудно откомментирован, так что о назначении некоторых полей можно лишь догадываться.

Общее устройство PE-файла
В самом общем случае PE-файл состоит из четырех частей, которые идут в следующем порядке, начиная с нулевого адреса:

DOS-заголовок (IMAGE_DOS_HEADER);
PE-заголовок (IMAGE_NT_HEADERS);
таблица секций (IMAGE_SECTION_HEADER);
cекции.
В самом конце PE-файла за секциями вполне могут размещаться дополнительные данные, например какая-нибудь отладочная информация, но это носит необязательный характер.

Заголовок DOS
В файле winnt.h DOS-заголовок описан следующей структурой:
Код:
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE заголовок

USHORT e_magic; // Магическое число                               4D 5A                00-01 

USHORT e_cblp; // Количество байт на последней странице файла     80 00  =80              02-03 

USHORT e_cp; // Количество страниц в файле                        01 00  =1             04-05 

USHORT e_crlc; // Relocations                                     00 00                06-07 

USHORT e_cparhdr; // Размер заголовка в параграфах                04 00    =4            08-09 

USHORT e_minalloc; // Minimum extra paragraphs needed             10 00     =10           0A-0B 

USHORT e_maxalloc; // Maximum extra paragraphs needed             FF FF                0C-0D 

USHORT e_ss; // Начальное (относительное) значение регистра SS    00 00                0E-0F 

USHORT e_sp; // Начальное значение регистра SP                    40 01                10-11 

USHORT e_csum; // Контрольная сумма                               00 00                12-13 

USHORT e_ip; // Начальное значение регистра IP                    00 00                14-15

USHORT e_cs; // Начальное (относительное) значение регистра CS    00 00                16-17 

USHORT e_lfarlc; // Адрес в файле на таблицу переадресации        40 00                18-19 

USHORT e_ovno; // Количество оверлеев                             00 00                1A-1B 

USHORT e_res[4]; // Зарезервировано                               00 00                1C-1D

USHORT e_oemid; // OEM identifier (for e_oeminfo)                 00 00                1E-1F

USHORT e_oeminfo; // OEM information; e_oemid specific           00 00                 20-21

USHORT e_res2[10]; // Зарезервировано                            00 00                 22-23

LONG e_lfanew; // Адрес в файле нового .exe-заголовка            00 00                 24-25

} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Самым важным здесь является поле e_lfanew, которое содержит 4-байтовое смещение от начала файла до PE-заголовка. Первое поле структуры e_magic содержит сигнатуру исполняемого файла. Все MS-DOS-совместимые исполняемые файлы имеют сигнатуру 0x54AD, которая в ASCII-символах представлена двумя символами MZ. По этой причине заголовок DOS часто называют MZ-заголовком.

PE-заголовок
Формат PE-заголовка представлен структурой
Вложения
Тип файла: txt ASMbrutecoud_1.2.TXT (2.0 Кб, 145 просмотров)

Последний раз редактировалось Stilet; 01.07.2014 в 23:24.
Dimka-novitsek вне форума Ответить с цитированием
Старый 01.07.2014, 17:45   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Я так и не понял насчет поля e_lfanew.
Ну что не понял?
Это поле в первом заголовке. Заголовке старого DOS, который еще оставлен. Х.з. для чего. Так вот это поле - указатель на сколько байт сместиться от начала файла (от его первого байтика) чтоб наткнуться на байты, описывающие PE заголовок - новый тип заголовкой применяемых в Винде.
Вот винда именно со второго заголовка читает описание файла, и как его загружать. А первый DOS-заголовок ей нужен только чтоб попасть во второй (ну и для совместимости еще)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2014, 18:22   #7
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

указатель на сколько байт сместиться от начала файла (от его первого байтика) чтоб наткнуться на байты, описывающие PE заголовок - новый тип заголовкой применяемых в Винде.

Конечно. Это поле указатель на PE заголовок. Я только найти его не могу!

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

во всяком случае все врод так кроме этого самого поля e_lfanew!

То есть, пока поставим вопрос так Я разбираю файл PE ,,руками,, В каких случаях, запролняя поля структур- можно разбирать его последовательно, по два байта ( ну смотря если поле структуры DWORD то видимо четыре и т.п.) А в каких нельзя?

Последний раз редактировалось Stilet; 01.07.2014 в 19:13.
Dimka-novitsek вне форума Ответить с цитированием
Старый 01.07.2014, 20:30   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
указатель на сколько байт сместиться от начала файла (от его первого байтика) чтоб наткнуться на байты, описывающие PE заголовок - новый тип заголовкой применяемых в Винде.

Конечно. Это поле указатель на PE заголовок. Я только найти его не могу!

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

во всяком случае все врод так кроме этого самого поля e_lfanew!

То есть, пока поставим вопрос так Я разбираю файл PE ,,руками,, В каких случаях, запролняя поля структур- можно разбирать его последовательно, по два байта ( ну смотря если поле структуры DWORD то видимо четыре и т.п.) А в каких нельзя?
можно так или иначе, проще читать структуру целиком.
и научитесь считать, все там должно быть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2014, 20:40   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Я только найти его не могу!
Ну так возьми в руки Olly и с ее помошью ищи
Цитата:
В каких случаях, запролняя поля структур- можно разбирать его последовательно, по два байта ( ну смотря если поле структуры DWORD то видимо четыре и т.п.) А в каких нельзя?
Во всех случаях без исключения - РЕ заголовок нерушим и сверхстандартен. Единственная разница в DLL -там будет присутствовать еще одна дополнительная таблица в заголовке (э-э-э не ссылайся на меня. я просто точно не помню, но в моей статье есть ссылки указывающие на это).
Во всех остальных случаях РЕ заголовок разбирается одинаково.
Смотри:Безымянный.jpg
Заголовок начинается буквами "РЕ". Указатель на него я выделил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2014, 22:42   #10
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Спасибо!!! !! Да.. Да, я видел в общем 80 00 00 00, только думал что это 80. И не знал куда же отнести его. Конечно я нашол ''PE", разобрал и часть дальше- машина и т.п. Я еще хотел понять все принципы! Ну вроде я программа и делаю все как программа.

Да, конечно же! К стати 80 и есть, там же все перевернуто.


И все же смотрите!
LONG e_lfanew; // Адрес в файле нового .exe-заголовка 00 00 24-25
Где 24-25- это смещение поля e_lfanew если каждое поле структуры щитать по 2 байта, последовательно.
У нас же, 80 00 00 00- значение поля e_lfanew расположено в 3C-3F!

Да, я на пару часов отвлекся и вроде все более проясняется. попробую файл дальше расписать, где что.

Последний раз редактировалось Stilet; 01.07.2014 в 23:25.
Dimka-novitsek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сигнатура проблемы. D3caHTH1k Помощь студентам 2 16.06.2013 16:26
Сигнатура. фудоррр Паскаль, Turbo Pascal, PascalABC.NET 2 21.04.2012 00:09
Сигнатура Dasha1610 Помощь студентам 2 04.04.2012 00:48
Сигнатура. Dasha1610 Паскаль, Turbo Pascal, PascalABC.NET 2 30.03.2012 16:29
Сигнатура криптора Flippp Общие вопросы Delphi 0 27.09.2009 15:11