Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Помогите понять


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

Код

        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


Автор: Dem_max 20.2.2010, 12:02
uchar = UCHAR = BYTE = unsigned char
 
Цитата

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


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

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

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

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


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

Собственно если не ошибаюсь (int*)0x0044213E разыменовывение адреса памяти. 

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

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

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

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

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

Автор: GoldFinch 20.2.2010, 15:50
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 скорее всего лишний

Автор: bra1ny 20.2.2010, 15:53
Да поторопился , каюсь =) 

Автор: Kirgston 20.2.2010, 16:39
Цитата(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" ?

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


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

Автор: GoldFinch 20.2.2010, 17:15
* смещение считается от конца jmp

Автор: Kirgston 20.2.2010, 19:05
Благодарю! А где можно еще почитать о опкодах? Те которые вы писали?

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

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

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


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

Автор: bra1ny 21.2.2010, 14:09
Советую заказать бумажные издания,если они еще бесплатные. 

Автор: Kirgston 23.2.2010, 20:01
Цитата(bra1ny @  21.2.2010,  14:09 Найти цитируемый пост)
Советую заказать бумажные издания,если они еще бесплатные. 

Там я увидел только СД, где можно найти бумагу?

Автор: bra1ny 23.2.2010, 20:19
я заказывал год назад наверное)

Автор: Kirgston 24.2.2010, 10:26
Спасибо, благодарю! =) может просто распечатаю))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)