Как получить более подробную информацию о сборке? - PullRequest
1 голос
/ 08 ноября 2011
40087e:       48 8b 05 cb 01 20 00    mov    0x2001cb(%rip),%rax        # 600a50 <__CTOR_LIST__+0x8>

Выше приведен вывод objdump.

Однако я хочу знать, какая часть 48 8b 05 cb 01 20 00 представляет mov, 0x2001cb(%rip) ...

То есть, есть ли инструмент для взлома машинного кода?

1 Ответ

2 голосов
/ 08 ноября 2011

48 8b 05 cb 01 20 00 mov 0x2001cb (% rip),% rax

48 - это REX prefix, который обычно используется для указания того, что операнды инструкции (регистры или память)местоположения) должен быть 64-битным вместо 32-битным (т.е. RAX вместо EAX в этой инструкции).Префиксы REX также используются в инструкциях, управляющих регистрами R8 - R15.

8b - это инструкция MOV opcode.Другие значения используются для других инструкций.Например, 2b означало бы SUB, а 8d означало бы LEA.

05 - это байт ModR/M, который в 64-битном режиме обозначает RIP+disp32 адресацию памяти (вместо просто disp32 в32-битный режим).Это кодируется в битовых полях Mod и R/M байта.Битовое поле Reg этого байта дополнительно указывает использовать регистр RAX для другого операнда.

cb, 01, 20 and 00 образует часть disp32 операнда памяти, и это смещение равно 2001CBH.

Собрав все это вместе, мы получаем MOV RAX, [RIP+2001CBH].

Существует несколько способов декодирования инструкций:

  • вручную с использованием руководств по процессорам от Intel или AMD
  • с автономным дизассемблером, например, ndisasm, который поставляется вместе с NASM
  • с вашим любимым отладчиком;просто поместите байты интересующей инструкции где-нибудь в памяти программ (вы можете ввести их) и попросите дизассемблер показать вам разборку расположения этой инструкции
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...