![]() |
eXeL@B —› Вопросы новичков —› Размер секции без выравнивания. |
Посл.ответ | Сообщение |
|
Создано: 23 апреля 2017 22:34 · Личное сообщение · #1 |
|
Создано: 23 апреля 2017 23:33 · Личное сообщение · #2 |
|
Создано: 24 апреля 2017 03:11 · Поправил: difexacaw · Личное сообщение · #3 |
|
Создано: 24 апреля 2017 14:43 · Личное сообщение · #4 zombi-vadim пишет: Как мне узнать какой размер занимает в секции непосредственно код, без нулей выравнивания? Учитывая, что секции дополняются нулями только в конце, очевидно, что нужно найти первый ненулевой байт начиная с конца секции. Его индекс (zero-based) и будет размером данных в секции (в байтах). ![]() |
|
Создано: 24 апреля 2017 15:22 · Личное сообщение · #5 |
|
Создано: 24 апреля 2017 21:20 · Поправил: zombi-vadim · Личное сообщение · #6 mysterio mysterio пишет: Обрати внимание на VirtualSize "некой" секции. Я так понимаю есть выравнивание на диске и есть в памяти, в памяти как правило размер выравнивания меньше, а бывает и такой же. Провел эксперимент, пишем секцию в файл с размером SizeOfRawData (получаем код плюс нули выравнивания), пишем секцию в файл с размером VirtualSize (получаем действительно только код без выравнивания). Получается что VirtualSize содержит в себе только размер кода, а выравнивается уже в памяти согласно заданному размеру выравнивания? Я прав или нет, потому как следующие посты утверждают что .. difexacaw пишет: Реальный размер данных загрузчику не нужен, поэтому никак его не получить без анализа кода. ![]() |
|
Создано: 24 апреля 2017 21:45 · Личное сообщение · #7 zombi-vadim SizeOfRawData выравнивается в файле по FileAlignment (512), а VirtualSize выравнивается в памяти по SectionAlignment (4096). То есть любая секция в файле начинается с начала сектора, а в памяти - с начала страницы. zombi-vadim пишет: пишем секцию в файл с размером VirtualSize (получаем действительно только код без выравнивания) На это не стоит полагаться, не все компили прописывают в заголовках в VirtualSize размер ненулевых данных. ![]() |
|
Создано: 24 апреля 2017 21:50 · Личное сообщение · #8 |
|
Создано: 24 апреля 2017 22:03 · Личное сообщение · #9 cppasm Нули тоже данные. Точнее переменные, которые не инициализированы и не вынесены в соответствующую секцию, которой нет в файле, но которую сформирует загрузчик. Из опций сборки, так как размер данных мал, либо по какой то причине их нужно разместить там, где они есть. В чём суть задачи, зачем знать реальный размер секции ? ----- vx ![]() |
|
Создано: 24 апреля 2017 22:14 · Поправил: zombi-vadim · Личное сообщение · #10 |
|
Создано: 24 апреля 2017 22:17 · Личное сообщение · #11 |
|
Создано: 24 апреля 2017 22:24 · Личное сообщение · #12 |
|
Создано: 24 апреля 2017 22:34 · Личное сообщение · #13 |
|
Создано: 24 апреля 2017 22:41 · Поправил: zombi-vadim · Личное сообщение · #14 |
|
Создано: 24 апреля 2017 23:29 · Личное сообщение · #15 |
|
Создано: 24 апреля 2017 23:38 · Поправил: zombi-vadim · Личное сообщение · #16 |
|
Создано: 24 апреля 2017 23:43 · Личное сообщение · #17 zombi-vadim Он может быть уже выравнен по SectionAlignment в файле (значение VirtualSize, а не raw-data секции, ессно). Все зависит от компиля (линкера). Добавлено спустя 3 минуты zombi-vadim пишет: Кто сказал что в конце секции не может быть данных инициализированных нулями Линкер, ибо данные в другую секцию складывает, а хвост из нулей в конце секций усекается, чтобы место в файле не занимать. Вплоть до SizeOfRawData == 0. ![]() |
|
Создано: 24 апреля 2017 23:54 · Личное сообщение · #18 В каком-то пакере/проте видел, что он полагается на выравнивание и на то, что там нули будут. Т.е. по сути использует их как инициализированные нулями данные. А так почитай про PE формат от corkami https://code.google.com/archive/p/corkami/wikis/PE.wiki Много интересного для начинающих разглядывать PE. ![]() |
|
Создано: 24 апреля 2017 23:59 · Личное сообщение · #19 |
|
Создано: 25 апреля 2017 00:02 · Поправил: plutos · Личное сообщение · #20 zombi-vadim пишет: а сути нет просто знания Во-первых, в этой фразе явно не достает запятой (","). Но это так, мелочи. А во-вторых, знания знаниям рознь. Можно посвятить несколько лет исследованиям и точно узнать сколько раз за свою жизнь брился Вася Пупкин. Весь вопрос в том, ЗАЧЕМ? Не поймите это как насмешку, просто совет не тратить время даром. Ну а там, каждый делает, что хочет. ----- Give me a HANDLE and I will move the Earth. ![]() |
|
Создано: 25 апреля 2017 00:14 · Поправил: zombi-vadim · Личное сообщение · #21 |
|
Создано: 25 апреля 2017 00:35 · Личное сообщение · #22 plutos пишет: Весь вопрос в том, ЗАЧЕМ? видимо место под патч ищет, пускай учится zombi-vadim гугл:code cave finder ![]() |
|
Создано: 25 апреля 2017 07:44 · Поправил: difexacaw · Личное сообщение · #23 -=AkaBOSS=- Если это так, то метод не годится. Поиск пространства куда проще через выравнивание процедур. А по нормальному нужно заюзать конструктор, который может пересобирать код. Определить же лимиты обнулённого массива это слишком сложная задача. Она решаема лишь частично с некоторой вероятностью, но даже для этого нужен мощный парсер кода, это из области пермутаций такое, автоматика. Скул нужен соответствующий. Эти все выравнивания - чисто загрузочная фича. Как сделать минимальный модуль на асме - интересно конечно, но там используются не портабельные фичи загрузчика. Существует стандарт пе, но сама имплементация зависит от версии ос и содержит более тонкие свойства. Всякие валидации смещений(RVA), что используются загрузчиком - используется злом(виксы), так как загрузчик ав отличен от системного. Ну а работы с code cave это совсем иная тема и не для ньюби. Они поломают свой мозг об алгосы, вот пример: 1. 2. Второй именно по очистке пространства, реализуйте. ----- vx ![]() |
|
Создано: 26 апреля 2017 00:20 · Поправил: -=AkaBOSS=- · Личное сообщение · #24 difexacaw пишет: Если это так, то метод не годится. Поиск пространства куда проще через выравнивание процедур. Ой да ладно вам. В конце секции зачастую куча свободного места, но это "не годится" - надо искать промежутки между процедурами, которые еще и не каждый компилятор добавляет. Во многих случаях выравниваются на 4 байта, и фиг там развернёшься. И не надо пугать новичков, сходу перенося любую задачу в область vx и автоматической обработки. Человеку сначала надо научиться руками это делать, да и с точки зрения крякера/реверсера особая автоматизация тут ни к чему - нашёл место, вписал патч, сохранил и забыл. difexacaw пишет: Я лишь показал масштаб задачи. Вы лишь усложнили изначально простое. Без особой необходимости такими переделками лучше не заниматься, а пойти в конец секции и вписать свой код туда. Или свою отдельную секцию создать, если уж совсем места нету. ![]() |
|
Создано: 27 апреля 2017 03:36 · Личное сообщение · #25 -=AkaBOSS=- > Во многих случаях выравниваются на 4 байта, и фиг там развернёшься. Перенести код в другую область. Это классическая задача из виксов, можно сказать что фундаментальная. Можно интегрировать один код в другой(морф). Был интересный пример по переносу всех системных функций в буфер для защиты от ROP. > И не надо пугать новичков, сходу перенося любую задачу в область vx и автоматической обработки. Я лишь показал масштаб задачи. ----- vx ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Размер секции без выравнивания. |