Сейчас на форуме: tyns777, cppasm, dutyfree, asfa (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Размер секции без выравнивания.
Посл.ответ Сообщение

Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 23 апреля 2017 22:34
· Личное сообщение · #1

Подскажите пожалуйста, допустим есть некая секция, размером SizeOfRawData , часть ее заполнена кодом, а часть нулями из за выравнивания. Как мне узнать какой размер занимает в секции непосредственно код, без нулей выравнивания?




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 23 апреля 2017 23:33
· Личное сообщение · #2

Обрати внимание на VirtualSize "некой" секции.

-----
Don_t hate the cracker - hate the code.





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 24 апреля 2017 03:11 · Поправил: difexacaw
· Личное сообщение · #3

zombi-vadim

Есть файловое выравнивание, а есть выравнивание в памяти(страничная гранулярность). Реальный размер данных загрузчику не нужен, поэтому никак его не получить без анализа кода. Но такое обычно не нужно.

-----
vx




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 апреля 2017 14:43
· Личное сообщение · #4

zombi-vadim пишет:
Как мне узнать какой размер занимает в секции непосредственно код, без нулей выравнивания?

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



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 24 апреля 2017 15:22
· Личное сообщение · #5

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



Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 24 апреля 2017 21:20 · Поправил: zombi-vadim
· Личное сообщение · #6

mysterio mysterio пишет:
Обрати внимание на VirtualSize "некой" секции.
Я так понимаю есть выравнивание на диске и есть в памяти, в памяти как правило размер выравнивания меньше, а бывает и такой же. Провел эксперимент, пишем секцию в файл с размером SizeOfRawData (получаем код плюс нули выравнивания), пишем секцию в файл с размером VirtualSize (получаем действительно только код без выравнивания). Получается что VirtualSize содержит в себе только размер кода, а выравнивается уже в памяти согласно заданному размеру выравнивания? Я прав или нет, потому как следующие посты утверждают что ..
difexacaw пишет:
Реальный размер данных загрузчику не нужен, поэтому никак его не получить без анализа кода.




Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 апреля 2017 21:45
· Личное сообщение · #7

zombi-vadim
SizeOfRawData выравнивается в файле по FileAlignment (512), а VirtualSize выравнивается в памяти по SectionAlignment (4096). То есть любая секция в файле начинается с начала сектора, а в памяти - с начала страницы.

zombi-vadim пишет:
пишем секцию в файл с размером VirtualSize (получаем действительно только код без выравнивания)

На это не стоит полагаться, не все компили прописывают в заголовках в VirtualSize размер ненулевых данных.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 24 апреля 2017 21:50
· Личное сообщение · #8

rmn пишет:
На это не стоит полагаться, не все компили прописывают в заголовках в VirtualSize размер ненулевых данных.

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






Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 24 апреля 2017 22:03
· Личное сообщение · #9

cppasm

Нули тоже данные. Точнее переменные, которые не инициализированы и не вынесены в соответствующую секцию, которой нет в файле, но которую сформирует загрузчик. Из опций сборки, так как размер данных мал, либо по какой то причине их нужно разместить там, где они есть.

В чём суть задачи, зачем знать реальный размер секции ?

-----
vx




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 24 апреля 2017 22:14 · Поправил: zombi-vadim
· Личное сообщение · #10

В общем я склонен согласиться с dosprog и mysterio. В VirtualSize содержится размер ненулевых данных, а точнее размер кода. Огромное им спасибо за участие!




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 24 апреля 2017 22:17
· Личное сообщение · #11

zombi-vadim

Суть задачи в чём ?

Так как вам по какой то причине нужно знать размер реал данных, то единственно возможная причина - полная пересборка. Но кажется странным данный примитивный вопрос в таком контексте. Поэтому вообще ничего не понятно.

-----
vx




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 24 апреля 2017 22:24
· Личное сообщение · #12

difexacawdifexacaw пишет:
Суть задачи в чём ?
Суть задачи, сколько яиц снесет 33 попугая после дружбы с удавом.




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 24 апреля 2017 22:34
· Личное сообщение · #13

zombi-vadim

В следующем вашем вопросе будет тот же ответ

-----
vx




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 24 апреля 2017 22:41 · Поправил: zombi-vadim
· Личное сообщение · #14

difexacawВы конечно не обижайтесь на мою шутку, цель задачи указана в заголовке темы, а сути нет просто знания.



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 апреля 2017 23:29
· Личное сообщение · #15

dosprog пишет:
Тогда данные просто не будут загружены в память

VirtualSize может быть больше размера ненулевых данных.



Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 24 апреля 2017 23:38 · Поправил: zombi-vadim
· Личное сообщение · #16

rmn rmn пишет:
VirtualSize может быть больше размера ненулевых данных.
Да, но не больше размера кода.
cppasm
Кто сказал что в конце секции не может быть данных инициализированных нулями (которые не выравнивание, а именно данные)?



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 24 апреля 2017 23:43
· Личное сообщение · #17

zombi-vadim
Он может быть уже выравнен по SectionAlignment в файле (значение VirtualSize, а не raw-data секции, ессно). Все зависит от компиля (линкера).

Добавлено спустя 3 минуты
zombi-vadim пишет:
Кто сказал что в конце секции не может быть данных инициализированных нулями

Линкер, ибо данные в другую секцию складывает, а хвост из нулей в конце секций усекается, чтобы место в файле не занимать. Вплоть до SizeOfRawData == 0.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 24 апреля 2017 23:54
· Личное сообщение · #18

В каком-то пакере/проте видел, что он полагается на выравнивание и на то, что там нули будут. Т.е. по сути использует их как инициализированные нулями данные.
А так почитай про PE формат от corkami https://code.google.com/archive/p/corkami/wikis/PE.wiki Много интересного для начинающих разглядывать PE.



Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 24 апреля 2017 23:59
· Личное сообщение · #19

rmn пишет:
Он может быть уже выравнен по SectionAlignment в файле
Я произвольно экспериментировал с десятком различных файлов, везде VirtualSize равен размеру кода. Что за гнусный компилер делает иначе? Можно пример какой то?




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 25 апреля 2017 00:02 · Поправил: plutos
· Личное сообщение · #20

zombi-vadim пишет:
а сути нет просто знания


Во-первых, в этой фразе явно не достает запятой (","). Но это так, мелочи.

А во-вторых, знания знаниям рознь.
Можно посвятить несколько лет исследованиям и точно узнать сколько раз за свою жизнь брился Вася Пупкин.
Весь вопрос в том, ЗАЧЕМ?
Не поймите это как насмешку, просто совет не тратить время даром. Ну а там, каждый делает, что хочет.

-----
Give me a HANDLE and I will move the Earth.




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

Создано: 25 апреля 2017 00:14 · Поправил: zombi-vadim
· Личное сообщение · #21

plutos пишет:
просто совет не тратить время даром
Вы считаете что я трачу время даром? Задаваясь вопросом
zombi-vadim пишет:
какой размер занимает в секции непосредственно код
?? Я вот учился по учебнику, и типа умные учителя меня учили, в итоге я ничего не знаю. Лучше я сам во всем разберусь.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 25 апреля 2017 00:35
· Личное сообщение · #22

plutos пишет:
Весь вопрос в том, ЗАЧЕМ?

видимо место под патч ищет, пускай учится

zombi-vadim
гугл:code cave finder

| Сообщение посчитали полезным: difexacaw


Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 25 апреля 2017 07:44 · Поправил: difexacaw
· Личное сообщение · #23

-=AkaBOSS=-

Если это так, то метод не годится. Поиск пространства куда проще через выравнивание процедур. А по нормальному нужно заюзать конструктор, который может пересобирать код. Определить же лимиты обнулённого массива это слишком сложная задача. Она решаема лишь частично с некоторой вероятностью, но даже для этого нужен мощный парсер кода, это из области пермутаций такое, автоматика. Скул нужен соответствующий.
Эти все выравнивания - чисто загрузочная фича. Как сделать минимальный модуль на асме - интересно конечно, но там используются не портабельные фичи загрузчика. Существует стандарт пе, но сама имплементация зависит от версии ос и содержит более тонкие свойства. Всякие валидации смещений(RVA), что используются загрузчиком - используется злом(виксы), так как загрузчик ав отличен от системного.

Ну а работы с code cave это совсем иная тема и не для ньюби. Они поломают свой мозг об алгосы, вот пример:

1. --> Link <--
2. --> Link <--

Второй именно по очистке пространства, реализуйте.

-----
vx





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 26 апреля 2017 00:20 · Поправил: -=AkaBOSS=-
· Личное сообщение · #24

difexacaw пишет:
Если это так, то метод не годится. Поиск пространства куда проще через выравнивание процедур.

Ой да ладно вам. В конце секции зачастую куча свободного места, но это "не годится" - надо искать промежутки между процедурами, которые еще и не каждый компилятор добавляет. Во многих случаях выравниваются на 4 байта, и фиг там развернёшься.

И не надо пугать новичков, сходу перенося любую задачу в область vx и автоматической обработки. Человеку сначала надо научиться руками это делать, да и с точки зрения крякера/реверсера особая автоматизация тут ни к чему - нашёл место, вписал патч, сохранил и забыл.


difexacaw пишет:
Я лишь показал масштаб задачи.

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 апреля 2017 03:36
· Личное сообщение · #25

-=AkaBOSS=-

> Во многих случаях выравниваются на 4 байта, и фиг там развернёшься.

Перенести код в другую область. Это классическая задача из виксов, можно сказать что фундаментальная. Можно интегрировать один код в другой(морф). Был интересный пример по переносу всех системных функций в буфер для защиты от ROP.

> И не надо пугать новичков, сходу перенося любую задачу в область vx и автоматической обработки.

Я лишь показал масштаб задачи.

-----
vx



 eXeL@B —› Вопросы новичков —› Размер секции без выравнивания.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати