Перейти к содержанию
Авторизация  
CHBS

Назначение опкодов, при создании сигнатуры

Рекомендуемые сообщения

Я заранее извиняюсь если создал тему не в том разделе, но посчитал что это будет ближе к ассемблеру.

Вопрос возник при изучении исходного кода одного из сканнеров сигнатур https://github.com/LWSS/McDota/blob/master/src/Scanner.cpp

 

Если мы допустим откроем что нибудь в отладчике, увидим набор инструкций и их опкодов с аргументами, вопрос вот в этом моменте

// 55                      push    rbp
// 48 89 E5                mov     rbp, rsp
// 41 56                   push    r14
// 4C 8B 35 F3 A8 2A 02    mov     r14, cs:_g_pGameEntitySystem
// 41 55                   push    r13
// 49 89 FD                mov     r13, rdi
// 41 54                   push    r12
// 53                      push    rbx
// 31 DB                   xor     ebx, ebx
// C6 87 D0 00 00 00 01    mov     byte ptr [rdi+0D0h], 1
// 49 8B 3E                mov     rdi, [r14]
// E8 EA 4B E2 FF          call    CGameEntitySystem__GetHighestEntityIndex

PatternFinder::FindPatternInModule("libclient.so", "55 48 89 E5 41 56 4C 8B 35 ?? ?? ?? ?? 41 55 49 89 FD 41 54 53 31", "reinitPredictables");

Не могу понять какой байт имеет опкод push? если посмотреть на первую строку из кода то мы видим 55, но почему не указан аргумент rbp?

Т.е я предполагал что если идет опкод с аргументом, то должно быть его байтовое обозначение, т.е например из первой строки

55[push] 89[rbp] например.

В следующей же строке это все присутствует

48[mov] 89[rbp] e5[rsp]

 

Так почему же в первой строке где у нас push rbp, не указан байт-аргумент?

Так-же почему  3-ья строка имеет другой опкод отличный от первого?

41[push] 56[r14], если push вроде как должен быть 55?


Я знаю что я как-то не так интерпретирую информацию, что очень скажется на конечном результате изучения, поэтому и задал вопрос, поставьте сразу на правильный путь, почему отладчик так выводит назначение опкодов  и аргументов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
12 минут назад, CHBS сказал:

Не могу понять какой байт имеет опкод push?

Разный в зависимости от компиляции, вообще push размером в 1 байт это зарезервированные опкоды от 50 до 57

 

50 push rax
51 push rcx
52 push rdx
53 push rbx
54 push rsp
55 push rbp
56 push rsi
57 push rdi

Ну и табличка:
image.thumb.png.f6ddd8cbaa310e463b97cece3d919706.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, partoftheworlD сказал:

50 push rax
51 push rcx
52 push rdx
53 push rbx
54 push rsp
55 push rbp
56 push rsi
57 push rdi

 

// 41 55                   push    r13

Тогда почему тут 41?

Изменено пользователем CHBS
П.9

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для того чтобы читать табличку, советую использовать интеловские доки (глава 3) там объясняется, что все это значит.
Да и вообще интеловские доки, являются некой библией для каждого реверсера, так что, если думаешь серьезно заняться реверсом, советую прочитать их и использовать как справочник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, partoftheworlD сказал:

советую прочитать их и использовать как справочник.

Да там же 5 тысяч страниц, https://en.wikipedia.org/wiki/X86_instruction_listings

Даже тут не указано про что инструкция push может иметь назначение опкода 41.

// 41 55                   push    r13

Если я все правильно понял, то r13 это регистр общего назначения, и push у него должен быть соответственно в диапазоне 0x50-0x57, в чём подвох?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
11 минут назад, CHBS сказал:

в чём подвох?

 

Префикс для r регистров r8-r15

 

Спойлер

0:  50                      push   rax
1:  51                      push   rcx
2:  52                      push   rdx
3:  53                      push   rbx
4:  54                      push   rsp
5:  55                      push   rbp
6:  56                      push   rsi
7:  57                      push   rdi
8:  41 50                   push   r8
a:  41 51                   push   r9
c:  41 52                   push   r10
e:  41 53                   push   r11
10: 41 54                   push   r12
12: 41 55                   push   r13
14: 41 56                   push   r14
16: 41 57                   push   r15

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
22 минуты назад, partoftheworlD сказал:

 

Расширение для r регистров r8-r15

Всё равно не ясно, ведь 41 опкод зарезервирован для инструкции INC, та же кстати история с

// C6 87 D0 00 00 00 01    mov     byte ptr [rdi+0D0h], 1
// 49 8B 3E                mov     rdi, [r14]

Даже если документацию открыть на 1169 странице,

https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf,

То опкоды MOV начинаются с 88+, что там делает в первой строке 87 мне не понятно, а еще более не понятен порядок байт, должно быть либо с лева, либо с права на лево, а опкоды по середине почему-то.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
19 минут назад, CHBS сказал:

Всё равно не ясно, ведь 41 опкод зарезервирован для инструкции INC

это в x86 "41", а в x64 это "FF C1". (inc ecx)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
46 минут назад, CHBS сказал:

 


// C6 87 D0 00 00 00 01    mov     byte ptr [rdi+0D0h], 1
// 49 8B 3E                mov     rdi, [r14]

Даже если документацию открыть на 1169 странице,

https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf,

То опкоды MOV начинаются с 88+, что там делает в первой строке 87 мне не понятно, а еще более не понятен порядок байт, должно быть либо с лева, либо с права на лево, а опкоды по середине почему-то.

 


 

 

[C6 /0 ib] -  [MOV r/m8, imm8]

// C6 87 D0 00 00 00 01    mov     byte ptr [rdi+0D0h], 1

 

 

 

[REX.W + 8B /r] - [MOV r64,r/m64]
// 49 8B 3E  mov rdi, [r14]

 

 

(стр 1170)

Использование префикса REX.W продвигает работу до 64 бит.

Изменено пользователем Hack

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не загоняйся по ерунде, на практике все равно будешь использовать 5-10 основных опкодов и инструкций, плюс есть утилиты и онлайн дизассемблеры, где можно посмотреть байты и какие инструкции они представляют для любой архитектуры, если уж так сильно захочется..

 

1 час назад, CHBS сказал:

опкоды MOV начинаются с 88+, что там делает в первой строке 87 мне не понятно

 

это двойной опкод, С6 87 - mov byte rdi, в таблице интеловских доков написано ведь.

 

image.png.38b0deba0acf1351119ba54f6f6e8a2d.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Криса Касперски есть отличная книга "Дизассемблирование в уме". Там он приводит примеры формирования опкодов. Весьма рекомендую к прочтению.

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16 часов назад, Hack сказал:

(стр 1170)

Использование префикса REX.W продвигает работу до 64 бит.

Спасибо за информацию, а [C6 /0 ib] -  [MOV r/m8, imm8]  из этой инструкции, /0 ib чем является?

 

16 часов назад, partoftheworlD сказал:

Не загоняйся по ерунде, на практике все равно будешь использовать 5-10 основных опкодов и инструкций, плюс есть утилиты и онлайн дизассемблеры, где можно посмотреть байты и какие инструкции они представляют для любой архитектуры, если уж так сильно захочется..

 

 

это двойной опкод, С6 87 - mov byte rdi, в таблице интеловских доков написано ведь.

 

image.png.38b0deba0acf1351119ba54f6f6e8a2d.png

 

О, как, спасибо большое, я просто голову ломал из-за порядка байт, разворачивал но получалось 87 C6 D0 00 00 00 01, стало намного яснее.
По поводу не загоняйся - мне просто стало интересно из чего сигнатура строится, еще нужно бы понимать, какие аргументы меняются и как их определять, понятное дело что mov это опкод и он будет неизменным в сигнатуре, но вот может ли сменится регистр в блоке инструкций или он уже назначен на rdi? Просто у него сигнатуру кончилась до этого опкода, если же посмотреть на предыдущую инструкцию

// 4C 8B 35 F3 A8 2A 02    mov     r14, cs:_g_pGameEntitySystem

35 тут к чему будет относится?

9 часов назад, Xipho сказал:

У Криса Касперски есть отличная книга "Дизассемблирование в уме". Там он приводит примеры формирования опкодов. Весьма рекомендую к прочтению.

Спасибо, она? [CENSORED]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, CHBS сказал:

Спасибо, она?

Да, она.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
21 час назад, CHBS сказал:

// 4C 8B 35 F3 A8 2A 02    mov     r14, cs:_g_pGameEntitySystem

35 тут к чему будет относится?

 

image.png.d6981290fa190aeccb742a9c96fe4c56.png

 

4C 8B 35 это конструкция mov r14, [rip] или mov r14, cs:[0], следующие 4 байта, указывают на смещение относительно этой инструкции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, CHBS сказал:

Спасибо за информацию, а [C6 /0 ib] -  [MOV r/m8, imm8]  из этой инструкции, /0 ib чем является?

 

b == 8 (byte)
w == 16 (word)
d == 32 (dword)

ib == imm8 ( i == imm, b == 8 )

imm – immediately непосредственное значение const которое записано в коде.


rb == регистр 1 байт
rw == регистр 2 байта
rd == регистр 4 байта

 

/0 пока точно не понял.

Изменено пользователем Hack

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.