Агитка (Котлин)

Всё это, конечно, хорошо. Но плохо то, что очень часто, после компиляции, вставляется байткод 0x00, aka NOP.
 
Да? Не знал. Но это же вроде никак не влияет на скорость там и прочее?
 
Ну в джаве JIT, так что не знаю во что оно превратится. В машинном коде просто так прожирает такт процессора. Только ты не заметишь. В любом случае, байткод этот лишний.
 
Ну я думаю JIT догадывается их выпиливать, разу уж более сложные вещи выпиливает. Но вот нафиг они нужны хызы, надо поискать штоле.
 
В С++, обычно, используется. Я читал на хабре, что можно хук вставить. Ну в Джаве достаточно вставить нужный байткод и передать ему параметры.

NOP хранится в .class. Это не очень хорошо. Байт мало, да, но ведь отсутствие байткода еще меньше. А JIT сам решает, что убирать, а что вставлять. Но ведь храниться будет в классе этот байткод.

Javac, кстати, не вставляет 0х00 никуда.
 
wilah написал(а):
В С++, обычно, используется. Я читал на хабре, что можно хук вставить.

В первый раз о таком слышу (хотя я С++ не знаю и изучать не собираюсь), можешь дать ссылку?
По моему nop используется:
1) Во всяких микроконтроллерах (преимущественно простых) для задержек
2) Для выравнивания команд на некоторых процессорах.
Например, процессор может читать данные из памяти по 32 бита за раз по адресам кратным 4 байтам, а команды имеют переменную длину от 1 бата. Тут иногда целесообразно вставить nop, чтобы следующие команды считались за одну пересылку по шине.
3) Из-за особенностей организации конвейера выполнения команд на некоторых процессорах, команда nop вставленная в нужном месте может немного ускорить выполнение программы.
4) Использование ошибок переполнения буффера для выполнения произвольного кода.

Во втором и третьем случае что-либо сделать вручную весьма трудно, это делают компиляторы. Еще несколько раз я вставлял в код на Си nop, чтобы поставить на него точку останова в отладчике.
Разумеется все эти случаи применительно к джаве не имеют смысла, поэтому зачем нужен nop в джаве для меня загадка.
 
Я тоже не знаю, зачем он там нужен. Однако он есть. Ссылка на хабр: https://m.habrahabr.ru/company/infopulse/blog/140456/
 
Asd73 написал(а):
4) Использование ошибок переполнения буффера для выполнения произвольного кода.

Звучит интересно, можно по-подробнее?
 
Я этими вещами не слишком увлекаюсь, поэтому могу привести лишь один пример.
Код:
int main() {
   char buf[10];
   gets(buf);
   printf("%s\n", buf);
   return 0;
}
В Си для х86 стек возвратов используется не только для хранения адресов возврата из функций, но и для передачи аргументов и хранения локальных переменных.

Функция gets считывает строку и помещает ее в буффер. Но эта функция не учитывает размер буффера, поэтому можно напечатав определенные символы изменить сохраненный в стеке адрес возврата.
Можно еще загрузить в стек какой-нибудь код, который может выполниться. nop тут нужен когда неизвестен адрес по которому загрузился наш код. Конечно, вряд ли кто-то будет использовать эту функцию, но тем не менее похожую ошибку можно сделать с другим кодом.
Но этот способ сейчас вроде бы не работает, т.к. через какие-то механизмы запрещено выполнение кода из стека. Хотя другие похожие способы все равно работают.
 
Во имя сатаны котлина!
OVVAwq2.png
 
Назад
Сверху