eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Gideon Vi
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Срока в массиве. Как найти?
Посл.ответ Сообщение

Ранг: 12.8 (новичок)
Статус: Участник

Создано: 27 мая 2014 10:54 · Поправил: SaNTa76 New!
Цитата · Личное сообщение · #1

Вопрос по размеру и хранению в памяти данных:
Code:
  1. char str[] = {'P','A','S','S','\0'};
  2. char str2[] = "Pass\0";
  3. printf("Memory size (%s) is: %i\n", str2, sizeof str);
  4. printf("Memory size (%s) is: %i\n", str2, sizeof str2);

В первом случае str покажет 5 байт - тут понятно. 4 символа и нуль-терминал.
Во втором случае покажет 6. Почему?
Второй вопрос. Если посмотреть в HEX редакторе как хранятся строка (str2) и первый массив (str) , то строка так и будет хранится в прямом виде, а массив разделен тремя байтами C6, 45, F1. Тогда получается первый массив в реальности занимает больший объем чем строка?

Ну и вопрос по поиску строк оформленных первым способом. Как в той же ольге или hexе правильно искать такие строки?

ЗЫ. Ну и как исправить заголовок темы? Щас чую начнется стёб


Ранг: 1983.4 (!!!!)
Статус: Модератор
retired

Создано: 27 мая 2014 11:08 New!
Цитата · Личное сообщение · #2

SaNTa76 пишет:
Во втором случае покажет 6. Почему?

Потому что 5 символов забито руками и нуль-терминал, а 5+1=6.

SaNTa76 пишет:
массив разделен тремя байтами C6, 45, F1

Пруф в студию или не было.

И мало кто в здравом уме оформляет строки в виде 1.

Ранг: 53.9 (постоянный)
Статус: Участник

Создано: 27 мая 2014 11:08 New!
Цитата · Личное сообщение · #3

Во втором случае покажет 6 потому что у вас лишний null, загляните в память и вам все станет ясно.
1 случай - 50 41 53 53 00 (Используется посимвольная инициализация тут все верно)
2 случай - 50 41 53 53 00 00 (Используется ASCIZ-строка, т.е нуль-терминированная строка, 0 добавляется автоматически)

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


Ранг: 3.5 (гость)
Статус: Участник

Создано: 27 мая 2014 12:06 · Поправил: Initial New!
Цитата · Личное сообщение · #4

>>Пруф в студию или не было.
Наверно что-то типа:
C645 F1 50 MOV BYTE PTR SS:[EBP-0F],'P'
C645 F2 61 MOV BYTE PTR SS:[EBP-0E],'a'

Ранг: 12.8 (новичок)
Статус: Участник

Создано: 27 мая 2014 12:46 New!
Цитата · Личное сообщение · #5

Всё! спасибо разобрался
Code:
  1. 01011028  |.  C645 F0 50    MOV BYTE PTR SS:[EBP-10],50
  2. 0101102C  |.  C645 F1 41    MOV BYTE PTR SS:[EBP-F],41
  3. 01011030  |.  C645 F2 53    MOV BYTE PTR SS:[EBP-E],53
  4. 01011034  |.  C645 F3 53    MOV BYTE PTR SS:[EBP-D],53
  5. 01011038  |.  C645 F4 00    MOV BYTE PTR SS:[EBP-C],0

Насчет здравого ума и оформления строки в виде 1... А почему бы и нет... Я как новичек например такую строку не нашел бы в какомнить крякмисе... через "Search for -> All referenced text string"

Но вопрос остается про реальную размерность. Получается sizeof "врет" насчет занимаемой памяти...

P.S. Данные строки из учебника и не являются моим бредом

Ранг: 3.5 (гость)
Статус: Участник

Создано: 27 мая 2014 12:56 · Поправил: Initial New!
Цитата · Личное сообщение · #6

>>Получается sizeof "врет" насчет занимаемой памяти...
ничего он не врет. Сколько он вернул, столько памяти и занимает переменная.

Ранг: 33.9 (посетитель)
Статус: Участник

Создано: 27 мая 2014 13:16 New!
Цитата · Личное сообщение · #7

SaNTa76 пишет:
char str[] = {'P','A','S','S','\0'};

инициализация массива руками, насколько забили, таким и будет размер

SaNTa76 пишет:
char str2[] = "Pass\0";

это инициализация массива строкой, компилятор записывает в конец "Pass\0" бинарный 0


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 28 мая 2014 01:41 New!
Цитата · Личное сообщение · #8

Code:
  1. 01.01011028  |.  C645 F0 50    MOV BYTE PTR SS:[EBP-10],50
  2. 02.0101102C  |.  C645 F1 41    MOV BYTE PTR SS:[EBP-F],41
  3. 03.01011030  |.  C645 F2 53    MOV BYTE PTR SS:[EBP-E],53


Это только мне глаза вырезает ?


Статус: Пришелец

Создано: 28 мая 2014 02:08 New!
Цитата #9

Dr0p пишет: Это только мне глаза вырезает ?

В меньшей степени чем "срока".

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


Ранг: 3.5 (гость)
Статус: Участник

Создано: 28 мая 2014 11:32 New!
Цитата · Личное сообщение · #10

Dr0p, компилер MS так генерит если не включать оптимизацию.
С /O1 (Минимальный размер) будет писать экономнее.
MOV DWORD PTR SS:[EBP-0C],53534150
MOV BYTE PTR SS:[EBP-8],0


Ранг: 260.1 (наставник)
Статус: Участник
RBC

Создано: 28 мая 2014 17:54 New!
Цитата · Личное сообщение · #11

Initial, экономнее DS

Ранг: 3.5 (гость)
Статус: Участник

Создано: 28 мая 2014 18:33 New!
Цитата · Личное сообщение · #12

Kindly, разве?

C645 F1 50 MOV BYTE PTR SS:[EBP-0F],50
3E:C645 F1 50 MOV BYTE PTR DS:[EBP-0F],50
C640 F1 50 MOV BYTE PTR DS:[EAX-0F],50

Если Base это EBP или ESP не нужно префикса переопределения для SS. Он там по умолчанию.

Ранг: 407.8 (мудрец)
Статус: Участник

Создано: 29 мая 2014 03:04 · Поправил: dosprog New!
Цитата · Личное сообщение · #13

Kindly пишет:
Initial, экономнее DS


Автоматические переменные - только в SS.

Для них и генерируется такой код инициализации.
Иначе просто сгенерируется целая строка в DS или в CS.


SaNTa76 пишет:
Ну и вопрос по поиску строк оформленных первым способом. Как в той же ольге или hexе правильно искать такие строки?


Напрашивается поиск в hiew < mov [ebp + ? ] ,50 >. Но это пффф.

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


Ранг: 300.0 (мудрец)
Статус: Участник

Создано: 29 мая 2014 08:09 New!
Цитата · Личное сообщение · #14

Как вариант искать по маске
Code:
  1. ?? ?? ?? 50 ?? ?? 41 ?? ?? 53 ...


Ранг: 169.6 (ветеран)
Статус: Участник

Создано: 30 мая 2014 21:03 New!
Цитата · Личное сообщение · #15

Veliant пишет:
искать по маске


ssf 1.2 + Signature DB (PEiD)


Ранг: 72.2 (постоянный)
Статус: Участник

Создано: 3 июня 2014 23:21 · Поправил: Dr0p New!
Цитата · Личное сообщение · #16

dosprog

> Автоматические переменные - только в SS.

Откройте же для себя понятие дефолтных сегментов изучив первый том IA.

Ранг: 407.8 (мудрец)
Статус: Участник

Создано: 4 июня 2014 05:15 · Поправил: dosprog New!
Цитата · Личное сообщение · #17

Dr0p пишет:
Откройте же для себя понятие дефолтных сегментов изучив первый том IA.


[offtop]

Я говорил об особенности генерации кода компилятором.
Если переменная автоматическая, то она размещается в SS.
То-есть, если я хочу разместить её в SS, то её нужно объявить автоматической.
Специально, чтобы не расходовать память.

Например,

{auto int a = 5;...} - автоматическая, <auto> можно не указывать.
Разместится в стеке при выполнении, при входе в блок {} и инициализируется числом 5.
Как и в рассматриваемом здесь случае со строкой.

{static int a = 5;...} - статическая, <static> требуется указать.
Разместится в коде (может, если <const>) или в данных на этапе компиляции и тогда же проинициализируется значением 5.

[/offtop]


Ранг: 296.9 (наставник)
Статус: Участник

Создано: 4 июня 2014 10:06 New!
Цитата · Личное сообщение · #18

dosprog
Он на си только винду изучает. При этом, наверное, соседи жалуются на изрядный мат
 eXeL@B —› Вопросы новичков —› Срока в массиве. Как найти?

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS