Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Перебиралка всех кобенаций паролей по маске на сишке, где функции через стек из указателей на функции друг друга вызывают через воиды.
http://govnokod.ru/20137#comment333406 отсюда:
Надо конечно typedef всунуть для функции, но там жопа с рекурсивным определением функции X = (int()(char **, X **))
По сути, надо чтобы функция в качестве аргумента принимала указатель того же типа, что и та сама функция, а такое рекурсивное определение типа в Си нельзя делать
Пфф, ну например если ты делаешь свой нано-JIT. Если посмотреть на инструкции x86-64 в хексах, то например
48c7c0010000 - это mov rax, 1
48c7c1010000 - это mov rcx, 1
48c7c2010000 - mov rdx, 1
^^
Тут меняется этот с0 c1 c2 байтик
вот зная особенности кодирования инструкций, можно эффективно из них в рантайме собирать код. Кроме того, есть такие инструкции, которые напрямую не написать на асме. Например mov rax, 0 может быть разной длины. Разное числн нулей
В смысле генерить в райнтайме не асмовые мнемоники, а байт коды, и как-то использовать тот факт что mov rax и mov rcx отличаются на 1? Ну, это отлично конечно, но это не значит что "ассемблер не позволяет делать особые извраты".
j123123 не смог найти удачных примеров. А ведь умели же раньше люди писа́ть! Классический пример — прыжок в середину CISC-инструкции, продемонстрированный нашей любимой компанией Борланд: http://govnokod.ru/13242
Это слишком неинтересный пример, который разве что в вирусне(для запутывания кода) и всяких сплоитах для ROP-ов применяется. К программированию мало отношения имеет. К тому же сам прыжок можно осуществить без всяких машинных кодов, просто сместив метку при джампе
Я пока не могу найти применения трюка с байтом mod-R/M (типа замены mov rax, 1 на mov rcx, 1), кроме как для написания самомодифицирующегося кода или для сокращения кода компилятора (скорее всего, последнее будет экономией на спичках).
Ну я практически 100% уверен, что в коде ассемблеров (nasm, yasm, fasm этц) такие трюки используются. И в коде эмуляторов, которые эмулируют чужую архитектуру. И в коде дизассемблеров
Варианты:
1. Ради выравнивания следующей инструкции, чтобы НОПы почём зря не вставлять.
2. А вдруг у инструкций разной длины пирфоманс разный? Например, на некоторых процессорах INC EAX быстрее, чем ADD EAX, 1, а на некоторых наоборот; на некоторых LOOP @1 быстрее, чем DEC ECX; ECXZ @1, а на некоторых наоборот и т. п.
Ой я тебя умаляю, в си все можно
разве что такие опкоды, которые транслятор тупо не знает.
Тут меняется этот с0 c1 c2 байтик
вот зная особенности кодирования инструкций, можно эффективно из них в рантайме собирать код. Кроме того, есть такие инструкции, которые напрямую не написать на асме. Например mov rax, 0 может быть разной длины. Разное числн нулей
http://govnokod.ru/13242
Я пока не могу найти применения трюка с байтом mod-R/M (типа замены mov rax, 1 на mov rcx, 1), кроме как для написания самомодифицирующегося кода или для сокращения кода компилятора (скорее всего, последнее будет экономией на спичках).
http://www.masmforum.com/board/index.php?topic=1622.msg12575#msg12575
Можно в rasm2 протестировать (из http://radare.org/r/ ) через консолечку
Ассемблеру нельзя сказать, чтоб он эту длинную говноинструкцию с нулями сделал
А зачем нахуя она тебе?
Ради места, в которое потом можно будет воткнуть что-то ненулевое?
1. Ради выравнивания следующей инструкции, чтобы НОПы почём зря не вставлять.
2. А вдруг у инструкций разной длины пирфоманс разный? Например, на некоторых процессорах INC EAX быстрее, чем ADD EAX, 1, а на некоторых наоборот; на некоторых LOOP @1 быстрее, чем DEC ECX; ECXZ @1, а на некоторых наоборот и т. п.
- Кастуй указатели на функцию, блять, на, кастуй указатели.
- Как я кастовать-то буду?!
- Вот так вот, быстро, (*)(*)(*)(*)*! Кастуй!