CHBS Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 Я заранее извиняюсь если создал тему не в том разделе, но посчитал что это будет ближе к ассемблеру. Вопрос возник при изучении исходного кода одного из сканнеров сигнатур 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? Я знаю что я как-то не так интерпретирую информацию, что очень скажется на конечном результате изучения, поэтому и задал вопрос, поставьте сразу на правильный путь, почему отладчик так выводит назначение опкодов и аргументов? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 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 Ну и табличка: Ссылка на комментарий Поделиться на другие сайты Поделиться
CHBS Опубликовано 7 ноября, 2019 Автор Поделиться Опубликовано 7 ноября, 2019 (изменено) 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? Изменено 7 ноября, 2019 пользователем CHBS П.9 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 Для того чтобы читать табличку, советую использовать интеловские доки (глава 3) там объясняется, что все это значит. Да и вообще интеловские доки, являются некой библией для каждого реверсера, так что, если думаешь серьезно заняться реверсом, советую прочитать их и использовать как справочник. Ссылка на комментарий Поделиться на другие сайты Поделиться
CHBS Опубликовано 7 ноября, 2019 Автор Поделиться Опубликовано 7 ноября, 2019 2 минуты назад, partoftheworlD сказал: советую прочитать их и использовать как справочник. Да там же 5 тысяч страниц, https://en.wikipedia.org/wiki/X86_instruction_listings Даже тут не указано про что инструкция push может иметь назначение опкода 41. // 41 55 push r13 Если я все правильно понял, то r13 это регистр общего назначения, и push у него должен быть соответственно в диапазоне 0x50-0x57, в чём подвох? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
CHBS Опубликовано 7 ноября, 2019 Автор Поделиться Опубликовано 7 ноября, 2019 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 мне не понятно, а еще более не понятен порядок байт, должно быть либо с лева, либо с права на лево, а опкоды по середине почему-то. Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 19 минут назад, CHBS сказал: Всё равно не ясно, ведь 41 опкод зарезервирован для инструкции INC это в x86 "41", а в x64 это "FF C1". (inc ecx) Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 (изменено) 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 бит. Изменено 7 ноября, 2019 пользователем Hack Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 7 ноября, 2019 Поделиться Опубликовано 7 ноября, 2019 Не загоняйся по ерунде, на практике все равно будешь использовать 5-10 основных опкодов и инструкций, плюс есть утилиты и онлайн дизассемблеры, где можно посмотреть байты и какие инструкции они представляют для любой архитектуры, если уж так сильно захочется.. 1 час назад, CHBS сказал: опкоды MOV начинаются с 88+, что там делает в первой строке 87 мне не понятно это двойной опкод, С6 87 - mov byte rdi, в таблице интеловских доков написано ведь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 8 ноября, 2019 Поделиться Опубликовано 8 ноября, 2019 У Криса Касперски есть отличная книга "Дизассемблирование в уме". Там он приводит примеры формирования опкодов. Весьма рекомендую к прочтению. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
CHBS Опубликовано 8 ноября, 2019 Автор Поделиться Опубликовано 8 ноября, 2019 16 часов назад, Hack сказал: (стр 1170) Использование префикса REX.W продвигает работу до 64 бит. Спасибо за информацию, а [C6 /0 ib] - [MOV r/m8, imm8] из этой инструкции, /0 ib чем является? 16 часов назад, partoftheworlD сказал: Не загоняйся по ерунде, на практике все равно будешь использовать 5-10 основных опкодов и инструкций, плюс есть утилиты и онлайн дизассемблеры, где можно посмотреть байты и какие инструкции они представляют для любой архитектуры, если уж так сильно захочется.. это двойной опкод, С6 87 - mov byte rdi, в таблице интеловских доков написано ведь. О, как, спасибо большое, я просто голову ломал из-за порядка байт, разворачивал но получалось 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] Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 8 ноября, 2019 Поделиться Опубликовано 8 ноября, 2019 4 минуты назад, CHBS сказал: Спасибо, она? Да, она. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 8 ноября, 2019 Поделиться Опубликовано 8 ноября, 2019 21 час назад, CHBS сказал: // 4C 8B 35 F3 A8 2A 02 mov r14, cs:_g_pGameEntitySystem 35 тут к чему будет относится? 4C 8B 35 это конструкция mov r14, [rip] или mov r14, cs:[0], следующие 4 байта, указывают на смещение относительно этой инструкции. Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 8 ноября, 2019 Поделиться Опубликовано 8 ноября, 2019 (изменено) 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 пока точно не понял. Изменено 8 ноября, 2019 пользователем Hack Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения