- 1
http://ache.vniz.net/demos.html
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−47
http://ache.vniz.net/demos.html
> Cвоеобразный программисткий подвиг совершил Дима Бурков. В то время начали появляться первые PC. Unix на них выглядел неубедительно. Linux еще не появился, зато повился Venix. Хачить его было невозможно - не было исходных текстов ядра. Дима Бурков реассемблировал ядро, потом писал программы на Си, которые давали тот же текст ассемблера - так появились тексты ядра на Си ... работа не для слабонервных.
А вот интересно, можно ли сделать декомпилятор таким способом? Например, если известна точная версия GCC и флаги компиляции, которые использовались (ну и естественно исходники компилятора должны быть в наличии) то перебирать с эвристиками некий Си-код, пользуясь дизасм-листингом для подсказки и сравнения. Какой подход использует Hex-Rays например? Вряд ли они исходники GCC ковыряли
Antervis 28.06.2016 21:18 # +6
guestinho 28.06.2016 21:24 # +5
inkanus-gray 29.06.2016 00:47 # +9
guestinho 28.06.2016 21:22 # 0
Кстати, я тоже так могу сделать, как Дима. С помощью inline assembly
gost 28.06.2016 22:09 # +1
inkanus-gray 29.06.2016 00:38 # 0
Вряд ли. IDA умеет распознавать (правда, на уровне подсказок в комментариях, а не полного декомпилятора) фрагменты кода, сгенерированного компиляторами с закрытым кодом, например, Турбо Паскаль, Delphi, Borland C, MSVC, Zortech C, вроде ещё какие-то позабытые компиляторы поддерживались.
Как можно получить декомпилятор? Написать тестовые примеры для всех конструкций языка, которые декомпилятор собирается распознать, скомпилировать со всевозможными параметрами оптимизации и собрать листинги.
Пример:
Выхлоп gcc 5.3 для x86 без оптимизации:
Мы видим, что for(int i = 42; i < 265; i++) { соответствует фрагмент:
А завершению цикла соответствует
Увидев в листинге дизассемблера похожие фрагменты, декомпилятор может сгенерировать цикл for.
guestinho 29.06.2016 00:45 # 0
inkanus-gray 29.06.2016 00:50 # 0
inkanus-gray 29.06.2016 01:06 # +2
Правда, внутри было примерно шесть килобайт отборного царского кода, который мне пришлось так и оставить в двоичном виде, не декомпилируя.
Вот фрагмент того фарша, который удалось провернуть назад:
guestinho 29.06.2016 01:39 # +2
ахуеть код
inkanus-gray 29.06.2016 13:01 # +2
Но вообще тут просто праздник какой-то: выделяем на 8..16 байт больше, чем требуется, выравниваем, а потом лишний кусок освобождаем. Да, освобождаем кусок памяти по указателю, для которого явно не делали GetMem. Функции GetMem и FreeMem делала та же корпорация, что и модуль Graph, для них очевидно, ко-ко-ко-ко-как эти функции работают.
Antervis 29.06.2016 05:54 # +2