Я разобрал кряк с помощью IDA Freeware, и среди прочего была эта строка:

mov     eax, ss:success_str[ebp]

Я знаю это:

mov     eax, ss:success_str

В основном это означало бы eax = ss * 0x10 + success_str, однако я не могу понять, что означает часть [ebp] в конце.

Я посмотрел байты инструкции: 8B 85 94 30 40 00

В этой таблице указано, что код операции 8B равен {{X0} }. Итак, в основном я полагаю (поправьте меня, если я ошибаюсь), что строка выше эквивалентна:

mov    eax, [00403094h] ; 0x403094 is actually the address of success_str

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

0
GuiTeK 14 Фев 2018 в 22:00

1 ответ

Лучший ответ

См. Расчет эффективного адреса операндов памяти Intel x86. «ss» - сегментная часть логического адреса, в данном случае имя сегментного регистра. Только в реальном режиме это влияет на физический адрес, как вы и предполагали. В большинстве режимов защищенной памяти (которые используются во всех современных ОС) это не так; вместо этого значение базы сегмента сохраняется во внутренней таблице сегментов; он заранее загружен специальными инструкциями. Однако в контексте режима приложения (т. Е. Если вы не рассматриваете функции ОС для изоляции физических адресов и т. Д.) Во многих случаях можно спокойно игнорировать сегментацию.

почему такой необычный синтаксис и как его читать?

Потому что это архитектура Intel IA-32 и Intel 64 , и у нее очень сложные режимы адресации (приведенный у вас пример даже не средней сложности, учитывая, как операнды адресуются в расширении AVX-512 ISA) . Обозначение, которое вы видите, называется «синтаксисом Intel». Существует также так называемый «синтаксис AT&T», который используется так же часто и который некоторые люди считают даже более неинтуитивным (я привык работать с обоими вариантами, и, честно говоря, мне все равно). Чтобы узнать, как его читать, загрузите "Руководство по разработке программного обеспечения Intel" здесь. и прочтите первые главы тома 2A.

1
Grigory Rechistov 15 Фев 2018 в 00:17