Сейчас на форуме: (+6 невидимых) |
![]() |
eXeL@B —› Протекторы —› После добавления секции PE файл не запускается |
Посл.ответ | Сообщение |
|
Создано: 31 августа 2016 19:16 · Личное сообщение · #1 После добавления новой секции в PE-файл он перестает запускаться (невозможно запустить это приложение на вашем пк). Если удалить добавленную секцию при помощи LordPE, то при запуске просто ничего не происходит. Байты заголовка добавленной секции почему-то не обнуляются. Показываю кодесы: Для открытия и проецирования PE-файла Code:
Для сохранения изменений и закрытия: Code:
Код добавления секции: Code:
Функция для заполнения добавленной секции кодом из некоторого файла: Code:
Главная функция: Code:
Ну и макросы: Code:
Что я сделал не так, из-за чего PE-файл портится? ![]() |
|
Создано: 31 августа 2016 20:39 · Личное сообщение · #2 |
|
Создано: 31 августа 2016 20:56 · Поправил: ZeroMemory · Личное сообщение · #3 Я перечитал начало статьи "Об упаковщиках в последний раз" и нашел там, что поле SizeOfRawData должно быть меньше поля VirtualSize заголовка секции. Похоже, у меня в функции add_section ошибка, потому что PETools показывает VirtualSize = 600, а RawSize = 1000. Может быть, тут ошибка, и надо выравнивать на FileAligment? Code:
Теперь эти поля равны, но файл все равно не загружается. Равенство, вроде, допустимо. Добавлено спустя 57 минут Archer пишет: Есть плаг PEVerifier для HIEW, можешь им прогнать свой файл. Как им пользоваться? Скопировал в папку hiew/hem, на странице про этот аддон нашел, что загружать его надо кнопкой F11, но ничего не происходит. ![]() |
|
Создано: 01 сентября 2016 00:38 · Поправил: -=AkaBOSS=- · Личное сообщение · #4 ZeroMemory покажи хоть файлы до/после обработки, а там уже код копать бум и кстати говоря, не мешало бы проверять, а есть ли в хидере еще место для новой структуры IMAGE_SECTION_HEADER, или нужно сдвигать все секции дальше (есть такие файлы, у которых секции уже с 0x200 начинаются, в них таким путём можно влететь в физические данные первой секции) ZeroMemory пишет: Может быть, тут ошибка, и надо выравнивать на FileAligment? по сути это некритично, просто надо убедиться что в файл будет записаны данные соответствующей длины. ZeroMemory пишет: поле SizeOfRawData должно быть меньше поля VirtualSize чёт не нашёл там такого. VirtualSize отвечает за размер выделяемой памяти, а SizeOfRawData - за длину данных считываемых из файла, но их сравнение следует производить только выровняв их на SectionAlignment и FileAlignment соответственно например, имеется секция с характеристиками VirtualSize = 0xABC, SizeOfRawData = 0xCDE, FileAlignment = 0x400, SectionAlignment = 0x1000 ALIGN_UP (VirtualSize, SectionAlignment) даст в результате 0x1000 ALIGN_UP (SizeOfRawData, FileAlignment) тоже даст 0x1000 таким образом получится область памяти 0х1000 байт, в которую будет считано соответственно 0х1000 байт из файла (ну или до конца файла, но файл не может быть короче чем PointerToRawData+SizeOfRawData) ![]() |
|
Создано: 01 сентября 2016 05:42 · Поправил: dosprog · Личное сообщение · #5 ZeroMemory пишет: поле SizeOfRawData должно быть меньше поля VirtualSize заголовка секции. Или равно. ZeroMemory пишет: Как им пользоваться? Скопировал в папку hiew/hem, на странице про этот аддон нашел, что загружать его надо кнопкой F11, но ничего не происходит. По F11 должно открыться плагинное меню. ![]() ![]() |
|
Создано: 01 сентября 2016 06:14 · Личное сообщение · #6 |
|
Создано: 01 сентября 2016 20:18 · Личное сообщение · #7 -=AkaBOSS=- пишет: покажи хоть файлы до/после обработки, а там уже код копать бум Файл до добавления секции: http://rgho.st/8bKfwvKzt Файл после добавления: http://rgho.st/6tr8KNNTH -=AkaBOSS=- пишет: и кстати говоря, не мешало бы проверять, а есть ли в хидере еще место для новой структуры IMAGE_SECTION_HEADER Я проверил, место есть. Я секции не мержил, и в редакторе видны нулевые байты выравнивания. -=AkaBOSS=- пишет: VirtualSize отвечает за размер выделяемой памяти В том файле, который запускается, эти значения совсем маленькие и точно соответствуют размеру данных без выравнивания. Почему так? Я читал, что VirtualSize - это размер секции в памяти, то есть он должен быть выровнен. UniSoft пишет: заголовок секции (IMAGE_SECTION_HEADER) вы добавили, а кто будет добавлять тело секции? Это верно, но почему-то я не могу добавить тело секции. Вот код: Code:
Если раскомментировать CopyMemory, то я пытаюсь записать данные по смещению секции (или PointerToRawData, или VirtualAddress). Ни по одному адресу запись не срабатывает, и после сохранения данных при помощи FlushViewOfFile на диске добавляется только заголовок, а тела секции нет ни в каком месте файла. Добавлено спустя 2 минуты Главную функцию я сделал немного проще. Добавляю не содержимое бинарного файла в секцию, а строковый литерал. Code:
![]() |
|
Создано: 01 сентября 2016 20:54 · Личное сообщение · #8 |
|
Создано: 01 сентября 2016 21:02 · Личное сообщение · #9 |
|
Создано: 02 сентября 2016 00:31 · Поправил: -=AkaBOSS=- · Личное сообщение · #10 -=AkaBOSS=- пишет: и кстати говоря, не мешало бы проверять, а есть ли в хидере еще место для новой структуры IMAGE_SECTION_HEADER ZeroMemory пишет: Я проверил, место есть. да ну? во-первых, такие вещи надо проверять кодом, а не глазами. во-вторых - нифига места нету в первом лоадере - PointerToRawData = 0х200, и на этом оффсете лежит реальный код. во втором - вместо кода вписан хидер секции, но данные не сдвинуты, а тупо перезаписаны ![]() ![]() |
|
Создано: 03 сентября 2016 14:59 · Личное сообщение · #11 -=AkaBOSS=- пишет: во-первых, такие вещи надо проверять кодом, а не глазами. во-вторых - нифига места нету Теперь увидел. Там даже опкод FF15 вызова функции. Какой алгоритм добавления секции в таком случае? Придется не использовать мэппинг и редактировать файл на диске, скопировать все, что после последнего заголовка секции в буфер, добавить заголовок новой секции, записать буфер в конец и отредактировать смещения? ![]() |
|
Создано: 03 сентября 2016 20:44 · Поправил: dosprog · Личное сообщение · #12 ZeroMemory пишет: Придется не использовать мэппинг и редактировать файл на диске С этого и надо было начинать. А то эти все "удобности" в конце концов оборачиваются обычным головняком. Мапинг изначально задумывался, как это выглядит, для облегчения показа содержимого всяких мультимедийных громадных файлов. А то многие путались при реализации листаний с подкачкой. ![]() |
![]() |
eXeL@B —› Протекторы —› После добавления секции PE файл не запускается |