Решил разобрать PE формат и для примера взял исходник sectionAdd. У меня возникло пару вопросов, если можно помогите: когда добавляется секция, добавляется ещё одна Object Entry, причём по смещению Num_of_Objects*28h Кто сказал, что там не кому не нужных 28h байт ?
Сначала смотришь есть ли в section table свободное место, потом рассчитываешь параметры секции (выравнивание считаешь, адреса и все такое), потом перемапливаешь файл в соответствии с новым размером, а уж потом прибавляешь в заголовке 1 в количестве секций, пишешь в section table новую запись и про SizeOfImage не забудь
28h - это размер Object Entry, тоесть последний свободный оффсет так и считается Num_of_Objects*28h (тут написано умножить а не плюс =)
Попробовал я такой "последний свободный оффсет" для taskmgr.exe и оказался он не таким уж и свободным, попробуй сам, советую !
вот только что смотрел на этот таск менеджер... ну так там с секциями накручено VirtualSize (то бишь реальное количество полезных данных в секции) больше чем размер секции на диске... а еще там в конце оверлей есть
что с оверлеем, что без него один результат ругается, что не может библиотеку найти. кажется, что новая запись что-то затирает.
хе-хе у них вобщем какого-то хм... ну вобщем таблица импорта (часть таблицы) находится в свободном месте таблицы секций. может кто-нибудь из знающих расскажет, что это за прием такой ? P.S. все сказанное про taskmgr.exe [w2k sp4]
sep Так вроде у Касперски http://www.wasm.ru/article.php?article=h2000_05 описан взлом программы с хитрыми секциями.
> 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; И преспокойно пишешь новый заголовок секции поверх этого крэпа.
и вовсе это не крэп, MS в свои системные бинарники везде bound import напихала(типа быстрее грузиться будут?)
> Кто сказал, что там не кому не нужных 28h байт ? никто хотя обычно свободное место там есть, поскольку стартовый адрес первой секции на диске должен быть выровнен на 200h байт, а стандартный заголовк занимает чуть-чуть больше 200h байт, то в ~90% файлах мы имеем поряка 200h байт халявного пространства, но встречаются и исключения. надо проверить, что SizeOfHeaders располагает к внедрению и что здесь находятся одни нули, в противном случае лучше отказаться от внедрения > что с оверлеем, что без него один результат ругается, > что не может библиотеку найти. кажется, что новая > запись что-то затирает. здесь расположена таблица BOUND IMPORT'а (кстати, подробно описанная мной в стаье по PE-формату, опубликованной в одном из последних номеров "системного администратора"). решение - либо пененести BOUND IMPORT на любое свободное место, либо прибить его нахер. работать будет и без него, только файл будет грузиться чуть-чуть дольше. даже когда оверлей есть, то можно смело дописываться в его конец, при условии что ImageSize будет расчитан верно (оверлей будет болтаться в памяти) > Было бы удивительно, если бы размер выделяемой памяти > под секцию был меньше чем данных на диске =) и такое встречается ситуацию с размером равным нулю мы рассматривать не будем, т.к. тут все понятно (если размер выделяемой памяти равен нулю, берем размер секции на диске, выравнивая его до OA). лучше возьмем оверлей, расположенный в середине файла
kaspersky > при условии что ImageSize будет расчитан верно (оверлей будет болтаться в памяти) А когда это оверлей в память грузился?
Asterix когда нужным образом заголовок подправить kaspersky вот все вспоминаете про сей чудесный журнал, а найти его где ? и вот как раз эта статья интересует