Можем ли мы исправлять двоичные файлы напрямую, не резервируя место для NOP?

Многие компиляторы позволяют нам исправлять работающий двоичный файл, резервируя некоторое пространство для NOP, которое будет заменено инструкциями для перенаправления на недавно исправленную функцию. Например, MSVC поддерживает горячее исправление, оставляя 2 байта для mov edi, edi в начале функции и 6 байтов заполнения для jmp new_func до этого, и в GCC у вас есть -fpatchable-function-entry вариант

-fpatchable-function-entry=N[,M]

  • Сгенерируйте N NOP прямо в начале каждой функции, с точкой входа в функцию перед Mth NOP. Если M опущено, то по умолчанию оно равно 0, поэтому запись функции указывает на адрес только в первом NOP. Команды NOP резервируют дополнительное пространство, которое можно использовать для исправления в любом желаемом инструментарии во время выполнения при условии, что сегмент кода доступен для записи.

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

Почему мы должны сохранять старый двоичный файл при исправлении?

0 ответов

Другие вопросы по тегам