Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2012, 03:27   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Смещение по структуре и преобразование

Здравствуйте самые Уважаемые форумчане всей планеты. Не давно занялся вплотную дизассемблированием PE приложений, получается вроде ничего но сталкиваются иногда такие моменты которые не подвластны моим мозгам.

Например, один из следующих вариантов.

MyObj - это указатель на некую огромную структуру размером почти в 10к байт.
Обычно мне встречались простые конструкции которые выплевывала IDA но с ними все понятно, смещаемся по структуре до поля равным байту 500 и получаем значение.

Код:
DWORD var = *(DWORD*)(MyObj + 500);
Но что происходит здесь? Забыл уточнить что в структуре хранятся не только стандартные типы но и пользовательские тоже.

Код:
v10 = **(_DWORD **)(MyObj + 1076) >> 16;
 v11 = **(_WORD **)(MyObj + 1076);
Как это так мы смещаемся по структуре и потом еще и сдвигаемся вправо на 16 позиций этож слишком жетско... не?

Последний раз редактировалось coNsept; 25.08.2012 в 03:53.
coNsept вне форума Ответить с цитированием
Старый 25.08.2012, 04:17   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Обычно мне встречались простые конструкции которые выплевывала IDA но с ними все понятно, смещаемся по структуре до поля равным байту 500 и получаем значение.
Цитата:
MyObj - это указатель на некую огромную структуру размером почти в 10к байт.
если это так, то
Код:
DWORD var = *(DWORD*)(MyObj + 500);
взять DWORD из 500-ой структуры, а не из 500-го байта (если указатель конечно типизированный)

Код:
v10 = **(_DWORD **)(MyObj + 1076) >> 16;
тут уже по-видимому MyObj - указатель на указатель на струкруту. опять же берем DWORD из 1076 структуры, отбрасывая 2 младших байта

если указатель не типизированный, тогда еще проще. значит по такому то смещению лежит указатель на указатель на DWORD (либо любой другой двойной указатель, но берем sizeof(DWORD))
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 25.08.2012 в 04:32.
pproger вне форума Ответить с цитированием
Старый 25.08.2012, 04:37   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Скорее всего это указатель на указатель на DWORD. v10 как раз идет типа WORD поэтому скорее всего и отбрасывается 2 младших байта. Спасибо pproger навел на мысли.

Код:
unsigned short wVal = MyObj->ToObj->m_dwField >> 16; // Как-то так наверное

Последний раз редактировалось coNsept; 25.08.2012 в 04:42.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смещение pastuhdima Помощь студентам 0 19.11.2011 00:37
Смещение Зод Win Api 1 26.08.2011 13:40
Смещение рисунка skrudjmagdak Общие вопросы Delphi 5 27.03.2010 15:23
Смещение компонента Volt Общие вопросы Delphi 9 20.01.2010 00:36
Смещение ячеек Zulius Microsoft Office Excel 3 26.11.2009 12:30