· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› PE format

Посл.отвђт Сообщенiе


Дата: Сен 2, 2004 08:48:03

Решил разобрать PE формат и для примера взял исходник
sectionAdd. У меня возникло пару вопросов, если можно
помогите:
когда добавляется секция, добавляется ещё одна
Object Entry, причём по смещению Num_of_Objects*28h
Кто сказал, что там не кому не нужных 28h байт ?


Дата: Сен 2, 2004 11:35:27

Сначала смотришь есть ли в section table свободное место, потом рассчитываешь параметры секции (выравнивание считаешь, адреса и все такое), потом перемапливаешь файл в соответствии с новым размером, а уж потом прибавляешь в заголовке 1 в количестве секций, пишешь в section table новую запись и про SizeOfImage не забудь


Дата: Сен 2, 2004 13:25:24

28h - это размер Object Entry, тоесть последний свободный оффсет так и считается Num_of_Objects*28h (тут написано умножить а не плюс =)


Дата: Сен 3, 2004 07:10:34

Попробовал я такой "последний свободный оффсет" для
taskmgr.exe и оказался он не таким уж и свободным,
попробуй сам, советую !


Дата: Сен 3, 2004 10:43:13

вот только что смотрел на этот таск менеджер... ну так там с секциями накручено :) VirtualSize (то бишь реальное количество полезных данных в секции) больше чем размер секции на диске... а еще там в конце оверлей есть


Дата: Сен 3, 2004 10:53:56

что с оверлеем, что без него один результат ругается, что не может библиотеку найти. кажется, что новая запись что-то затирает.


Дата: Сен 3, 2004 11:33:12 · Поправил: sep

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

P.S. все сказанное про taskmgr.exe [w2k sp4]


Дата: Сен 3, 2004 13:45:44

sep
„может кто-нибудь из знающих расскажет, что это за прием такой ? “
Так вроде у Касперски
http://www.wasm.ru/article.php?article=h2000_05
описан взлом программы с хитрыми секциями.


Дата: Сен 3, 2004 14:09:53 · Поправил: Dr.Golova

> VirtualSize (то бишь реальное количество полезных
> данных в секции) больше чем размер секции на диске...

Было бы удивительно, если бы размер выделяемой памяти под секцию был меньше чем данных на диске =)

> а еще там в конце оверлей есть

А в нем конечно же путь до файла с отладочной инфой

> у них вобщем какого-то хм... ну вобщем таблица импорта
> (часть таблицы) находится в свободном месте таблицы
> секций.

Это называется Bound Import Directory, так штааа делаешь
PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].V irtualAddress = 0;
PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].S ize = 0;
И преспокойно пишешь новый заголовок секции поверх этого крэпа.


Дата: Сен 3, 2004 14:53:31

„И преспокойно пишешь новый заголовок секции поверх этого крэпа.“
и вовсе это не крэп, MS в свои системные бинарники везде bound import напихала(типа быстрее грузиться будут?)


Дата: Сен 4, 2004 04:13:47

> Кто сказал, что там не кому не нужных 28h байт ?
никто ;) хотя обычно свободное место там есть,
поскольку стартовый адрес первой секции на диске должен быть выровнен на 200h байт, а стандартный заголовк занимает чуть-чуть больше 200h байт, то в ~90% файлах мы имеем поряка 200h байт халявного пространства, но встречаются и исключения.
надо проверить, что SizeOfHeaders располагает к внедрению
и что здесь находятся одни нули, в противном случае лучше отказаться от внедрения

> что с оверлеем, что без него один результат ругается,
> что не может библиотеку найти. кажется, что новая
> запись что-то затирает.
здесь расположена таблица BOUND IMPORT'а (кстати, подробно описанная мной в стаье по PE-формату, опубликованной в одном из последних номеров "системного администратора").
решение - либо пененести BOUND IMPORT на любое свободное место, либо прибить его нахер. работать будет и без него, только файл будет грузиться чуть-чуть дольше.

даже когда оверлей есть, то можно смело дописываться в его конец, при условии что ImageSize будет расчитан верно (оверлей будет болтаться в памяти)

> Было бы удивительно, если бы размер выделяемой памяти
> под секцию был меньше чем данных на диске =)
и такое встречается ;)
ситуацию с размером равным нулю мы рассматривать не будем, т.к. тут все понятно (если размер выделяемой памяти равен нулю, берем размер секции на диске, выравнивая его до OA). лучше возьмем оверлей, расположенный в середине файла ;)


Дата: Сен 4, 2004 04:19:18

kaspersky
> при условии что ImageSize будет расчитан верно (оверлей будет болтаться в памяти)

А когда это оверлей в память грузился?


Дата: Сен 4, 2004 09:54:23 · Поправил: sep

Asterix
„А когда это оверлей в память грузился?“
когда нужным образом заголовок подправить :)

kaspersky
вот все вспоминаете про сей чудесный журнал, а найти его где ? и вот как раз эта статья интересует


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050