0

я прочитал в this SO ответить на этот вопросСтатически связанные библиотеки: как узнать, находится ли код в смежной области в исполняемом файле?

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

Мне было интересно, если в общем случае этот код находится в смежной области. Я узнал от another SO ответить, что это может быть не всегда так:

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

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

  • Можно ли узнать, находится ли код из статически связанной библиотеки в смежной области в исполняемом файле? Если это невозможно в общем случае, существуют ли какие-либо эвристики или индикаторы?
  • Зачем компоновщику помещать код библиотеки в разных местах исполняемого файла? Думаю, это были бы редкие случаи, верно?
+1

Вторая ссылка в вашем вопросе, кажется, отвечает на второй вопрос (почему линкер переупорядочивает код?). В общем, он будет делать это для эффективности, если вы попросите его; как правило, вам необходимо предоставить профилирующую информацию для компоновщика, чтобы иметь возможность выполнить эту оптимизацию. См. Документацию 'gcc' для' -freorder-functions' – rici

ответ

1

Если вы хотите проанализировать исполняемый файл, вы можете использовать инструменты для декомпиляции и просмотра кода. Люди здесь могут помочь вам в этом: https://reverseengineering.stackexchange.com/

Что касается причин, то это может быть оптимизация, в основном для исполняемого размера, для перемещения этой области вокруг или разделения ее на удобные размеры отверстий. Еще одна важная причина - предотвратить атаки на библиотечные атаки. В принципе, выполнение защиты по памяти не позволяет злоумышленнику записывать произвольный код в буфер данных и выполнять его. В ответ, крекеры иногда строят атаки вместе из библиотечного кода, поэтому позиции библиотеки рандомизированы. Это не то, что вы пытаетесь сделать, верно?

+0

Благодарим вас за ответ. У меня возникла идея, почему код библиотеки не может находиться в смежной области. Что касается первого вопроса (как узнать, находится ли он в области продолжения), я постараюсь задать более точные вопросы по поводу reverseeeningine.stackexchange.com – stackoverflowwww