Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять 
V
    Опции темы
Kirgston
Дата 20.2.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток! Мне предстоит разобраться с чужим кодом. Несколько "недопонимаю" как он работает. Есть ДЛЛ которая "вшывается" в одно приложение. Собственно если я не ошибаюсь область памяти становиться общая. В итоге прямо в памяти мы "фиксим" нужные нам вещи. 

Код

        unsigned char Serial0BPSHop[] = {0xE9,0xA2,0x00,0x00,0x00,0x90};
        memcpy ((int*)0x0044213E, Serial0BPSHop, sizeof(Serial0BPSHop));


То есть я вижу что оно делает так:
1) Создаем массив из разных указанных елементов (тобиш в каждый элемент записываем значение)
2) Адрес 0x0044213E переводим в число типа int
3) в это число записываем наш массив

Собственно теперь непонятки...
1) uchar == 1 бит ( то есть 1 элемент если не ошибаюсь 1 бит) собственно int == 4 бита . Массив содержит 6 элементов. 6 элементов == 6 бит. Значит мы уже вылезаем за область int ... я прав? Почему так? Зачем так?

2) Каждое число в НЕХ соответствует определенной команде. То есть число 0x90 соответствует команде "NOP" (ASM) . Откуда я это взял? С исходняка:

Код

void SetNop(DWORD dwOffset, int Size){
    for(int n=0; n < Size; n++){
        *(BYTE*)(dwOffset+n) = 0x90;
    }
}
void SetRetn(DWORD dwOffset){
    *(BYTE*)(dwOffset) = 0xC3;

}
void SetByte(DWORD dwOffset, BYTE btValue){
    *(BYTE*)(dwOffset) = btValue;
}


Что тогда значит 0xE9 , 0xA2 и зачем писать 0х00 ?? 

Собственно скрин дампа памяти:

http://s005.radikal.ru/i211/1002/7f/f69e75070730.png


PM MAIL   Вверх
Dem_max
Дата 20.2.2010, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



uchar = UCHAR = BYTE = unsigned char
 
Цитата

2) Адрес 0x0044213E переводим в число типа int


0x0044213E это адрес в памяти, а (int*)0x0044213E указатель на область памяти

Что тогда значит 0xE9 , 0xA2 и зачем писать 0х00 ?? 
Ну кто ж его знает зачем писать, так задумано кодописателем


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Kirgston
Дата 20.2.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dem_max @  20.2.2010,  12:02 Найти цитируемый пост)
uchar = UCHAR = BYTE = unsigned char

Ну да само собой))


Цитата(Dem_max @  20.2.2010,  12:02 Найти цитируемый пост)
0x0044213E это адрес в памяти, а (int*)0x0044213E указатель на область памяти

Собственно если не ошибаюсь (int*)0x0044213E разыменовывение адреса памяти. 
PM MAIL   Вверх
Dem_max
Дата 20.2.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



(int*)0x0044213E
нет мы компилятору говорит что это указатель на область памяти


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Andrey44
Дата 20.2.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(Kirgston @  20.2.2010,  10:55 Найти цитируемый пост)
uchar == 1 бит

uchar != 1 бит  uchar == 1 байт
Цитата(Kirgston @  20.2.2010,  10:55 Найти цитируемый пост)
собственно int == 4 бита

int != 4 бита   int == 4 байта


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
bra1ny
Дата 20.2.2010, 15:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



хех , как все хорошо запоминается 
E9 опкод jmp
A2 опкод mov  addr , al (?)(точно не помню уточните в справочнике). 

Это сообщение отредактировал(а) bra1ny - 20.2.2010, 15:22
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
GoldFinch
Дата 20.2.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



bra1ny, e9 это  конечно опкод jmp rel32,
но те не кажется, что в "e9 a2 00 00 00"  a2 - это не опкод, а смещение? smile

вобщем e9 a2 00 00 00 90 это 
Код

jmp $+5+0xa2
nop

или
Код

    jmp there
......... 0xa2 каких-то байт
there:


nop скорее всего лишний
PM MAIL ICQ   Вверх
bra1ny
Дата 20.2.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да поторопился , каюсь =) 
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
Kirgston
Дата 20.2.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Andrey44 @  20.2.2010,  14:11 Найти цитируемый пост)
uchar != 1 бит  uchar == 1 байт


Цитата(Andrey44 @  20.2.2010,  14:11 Найти цитируемый пост)
int != 4 бита   int == 4 байта


Каюсь =) перепутал, но сути мало меняет...


GoldFinch, извините за глупый вопрос... но откуда взялось

jmp $+5+0xa2

Ну то есть понял что это смещение... но откуда взялась "5" ?
PM MAIL   Вверх
W4FhLF
Дата 20.2.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



Цитата(Kirgston @  20.2.2010,  16:39 Найти цитируемый пост)
Ну то есть понял что это смещение... но откуда взялась "5" ?


Размер команды: e9 a2 00 00 00 -- пять байт. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GoldFinch
Дата 20.2.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



* смещение считается от конца jmp
PM MAIL ICQ   Вверх
Kirgston
Дата 20.2.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Благодарю! А где можно еще почитать о опкодах? Те которые вы писали?
PM MAIL   Вверх
artsb
Дата 20.2.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



Цитата(Kirgston @  20.2.2010,  10:55 Найти цитируемый пост)
Значит мы уже вылезаем за область int ... я прав? Почему так? Зачем так?

memcpy


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
W4FhLF
Дата 21.2.2010, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



Цитата(Kirgston @  20.2.2010,  19:05 Найти цитируемый пост)
А где можно еще почитать о опкодах?


http://www.intel.com/products/processor/manuals/


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
bra1ny
Дата 21.2.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Советую заказать бумажные издания,если они еще бесплатные. 
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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