Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
n для каждой секции: если v_sz < r_sz, подтягиваем v_sz к NS.v_a – CS.v_a, добиваясь равенства физических и виртуальных размеров;
n внедряем в заголовок ALIGN_UP(sizeof(X-code), OA) байт, оформляя их как оверлей;
n уменьшаем FS.v_a и FS.r_off на ALIGN_UP(sizeof(X-code), OA);
n внедряем X-код в начало первой секции файла;
n пересчитываем Image Size.
Внедрение в конец. Чтобы внедриться в конец кодовой секции, необходимо раздвинуть нестраничный имидж, заново пересчитав ссылки на все адреса, т.к. старых данных на прежнем месте уже не будет. Задача кажется невыполнимой (встраивать в X-код полноценный дизассемблер с интеллектом ИДЫ не предлагать), но решение лежит буквально на поверхности. В подавляющем большинстве случаев для ссылок между секциями кода и данных используются не относительные, а абсолютные адреса, перечисленные в таблице перемещаемых элементов (при условии, что она есть). В крайнем случае абсолютные ссылки можно распознать эвристическими приемами: если (Image Base + Image Size) >= Z >= Image Size, то Z – эффективный адрес, требующий коррекции (разумеется, предложенный прием не слишком надежен, но все же он работает).
Типовой алгоритм внедрения выглядит так:
n считываем PE-заголовок;
n если нет перемещаемых элементов, лучше отказаться от внедрения, т.к. файл может потерять работоспособность;
n находим кодовую секцию файла;
n если CS.v_sz ==0 или CS.v_sz >= CS.r_sz, увеличиваем r_sz кодовой секции файла;
n если CS.v_sz < CS.r_sz, CS.r_sz := NS.r_off + ALIGN_UP(sizeof(X-code), FA);
n если CS.v_sz < CS.r_sz, CS.v_sz := CS.r_sz;
n физически сдвигаем все последующие секции на ALIGN_UP(sizeof(X-code), FA) байт, увеличивая их r_off на ту же самую величину;