Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адресная арифметика, 0x00346810 + 0x0048 = 0x00346ed0 ?! 
V
    Опции темы
Logree
Дата 18.9.2010, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



Сделал так:

Код

    BYTE * tmp = (buffer + file_record->attr_offset);
    NR_ATTR_HEADER *attr =(NR_ATTR_HEADER *)tmp;

    while (attr->type != 0xFFFFFFFF) {            
        tmp = tmp + attr->length;
        attr = (NR_ATTR_HEADER *)tmp;
    }

работает, но почему как в предыдущем варианте не прошло?


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
bsa
Дата 19.9.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Logree, а почитать инструкцию к языку программирования не пробовал?

Вот смотри, у тебя на столе лежат в ряд 10 апельсинов. При этом ты знаешь, что диаметр апельсина 100 мм. Чтобы дотянуться до следующего апельсина тебе нужно дать команду руке на позиционирование руку на 100 мм или на 1 апельсин? Конечно на 1 апельсин, так как мозг такую фигню легко и без тебя разруливает. Так и компилятор, когда у тебя есть типизированный указатель, то прибавление/вычитание целого числа приведет к смещению этого указателя на указанное число элементов (т.е. в данном случае предполагается, что указатель ссылается на массив однотипных объектов).
В своем первом коде, ты давал команду сдвинуться не на 1, а на 100. Вот только компилятору ты не сказал, что тебе нужно не 100 "апельсинов", а 100 "миллиметров". А для него по умолчанию это значит именно "апельсины". Чтобы твой код работал правильно, нужно делать так:
Код
    NR_ATTR_HEADER *attr =(NR_ATTR_HEADER *)(buffer + file_record->attr_offset);
    while (attr->type != 0xFFFFFFFF)
        attr = (NR_ATTR_HEADER *)((BYTE*)attr + attr->length);
Но у меня работало и так:
Код
    NR_ATTR_HEADER *attr =(void*)buffer + file_record->attr_offset;
    while (attr->type != 0xFFFFFFFF)
        attr = (void*)attr + attr->length;


Это сообщение отредактировал(а) bsa - 19.9.2010, 19:16
PM   Вверх
Logree
Дата 19.9.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2



я не так часто пишу на Си, так что каждый раз приходиться все вспоминать заново smile

спасибо всем.


--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
Estranged
Дата 20.9.2010, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



А смещение length - это в байтах или в структрурах NR_ATTR_HEADER? Таки скорее всего первое, поэтому attr = (NR_ATTR_HEADER *) ((LPBYTE)attr +  attr->length); ?
PM MAIL   Вверх
Logree
Дата 20.9.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 22.11.2006
Где: Самара

Репутация: нет
Всего: 2





--------------------
Самый распространенный способ дебага пятиста строк ассемблерного кода - очень долгий, очень пристальный и очень задумчивый взгляд.
PM MAIL ICQ   Вверх
Estranged
Дата 21.9.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Откройте ассемблерный листинг в отладке и сравните код с LPBYTE и с BYTE*.
mov eax,dword ptr [ebp-18h] ; attr
mov ecx,dword ptr [ebp-18h] ; attr
add ecx,dword ptr [eax+8] ; attr->length
mov  dword ptr [ebp-18h],ecx ; сумма
PM MAIL   Вверх
xvr
Дата 21.9.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Logree @  20.9.2010,  17:39 Найти цитируемый пост)
(BYTE *) !=== (LPBYTE)?
Равен он, равен  smile 


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.3658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.