1 | |
Можно ли декомпилировать исполняемый файл?11.12.2022, 01:42. Показов 3555. Ответов 29
На выходе компилятора(ранее были отдельные процессы трансляции, а затем компиляции) мы получаем исполняемый файл. А можно ли из исполняемого файла получить исходник, точнее, псевдоисходник на С/С++ или же только можно получить псевдоисходник на ассемблере с помощью кроссассемблера? И можно ли тогда из этого псевдоисходника на ассемблере получить псевдоисходник на С/С++?
0
|
11.12.2022, 01:42 | |
Ответы с готовыми решениями:
29
Потерял cpp файл, а ехе-шник остался. Можно как-то декомпилировать файл обратно? Как создать программу в С++, чтобы его можно было запускать как исполняемый .exe файл? Можно ли создать исполняемый файл книги Как декомпилировать .class файл обратно в .java файл? |
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
|
|
11.12.2022, 04:46 | 2 |
Hex Rays
Правда не знаю можно ли по правилам тут это озвучивать
0
|
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
|
|
11.12.2022, 11:20 | 4 |
Никто вам не воссаздаст исходник из C++. Это не Java / C#
Это плагин для IDA который попытается перевести тот код что был на asm в с++ читаемый вариант, что не значит что вы сможете его запихнуть в компилятор и он соберётся
0
|
12.12.2022, 00:03 [ТС] | 5 |
brian778, давайте кое-что уточним и разбиремся. Во-1-х, "Hex Rays" это не программа, а фирма-производитель, которая выпустила "интерактивчик" или IDA Pro; во-2-х, что можно получить исходник на C# и/или Java?; в-3-х, как называется "плагин для IDA, который попытается перевести тот код, что был на asm в с++"?; в-4-х, транслятор преобразует исходник на С/С++ в ассемблер, компилятор затем преобразует его в процессорный код, а уж затем компоновщик преобразует его в исполняемый код, т.е. в исполняемый файл. Декомпиляция происходит в обратном порядке: декомпоновщик преобразует исполняемый файл в процессорный код, затем декомпилятор преобразует его в ассемблер, а уж детранслятор(эдесь это плагин) преобразует его в один из вариантов исходника("псевдоисходник") на С/С++! Правильно так будет?!
Мне непонятно почему "псевдоисходник" может не пройти компиляцию? Что и где там дополнительно "вылазиет", что процесс компиляции не пойдет до конца?
0
|
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
|
|
12.12.2022, 05:45 | 6 |
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
12.12.2022, 14:12 | 7 |
Можно, если для этого не было предпринято специальных усилий.
http://www.idasoft.ru/manual/ Ассемблер (как язык) не участвует в этой цепочке. Типичный компилятор имеет трехуровневую организацию: 1) Front-end - анализ и построения абстрактного внутреннего представления программы (AST) 2) Middle-end- преобразование (например, оптимизации) 3) Back-end - генерация кода. Back-end из преобразованного внутреннего представления сразу делает машинный код для заданной платформы, в современном компиляторе нет смысла использовать ассемблер в качестве промежуточного этапа. Теоретически да, но процесс компиляции - это преобразование с потерями. Т.е. на этапе компиляции есть гораздо больше информации, чем есть на этапе декомпиляции. Большее количество информации превратить в меньшее (или изменить ее состав) гораздо проще, чем произвести обратное действие. Java и C# в этом смысле лучше поддаются декомпиляции именно потому, что в их случае компиляция выполняется без потерь. Т.е. сохраняется метаинформация, позволяющая восстановить исходный вид кода. Подробнее: https://learn.microsoft.com/en... on-process Кликните здесь для просмотра всего текста
0
|
14.12.2022, 03:11 [ТС] | 8 |
DrOffset, большое спасибо за разъяснение. Это то что надо! Однако остались не раскрыты некоторые ньюансы. 1)С back-end, вроде, все" понятно. С middle - частично, а с front-end - "нифига" не понятно! Если сможешь, поясни, пожалуйста, подробнее и, желательно, на примере.;2)Почему при компиляции исходника на С/С++ теряется метаинфа, а при компиляции С# и Java - нет. Если сможешь, пожалуйста, поясни подробней! Я так думаю, что здесь причина в отличительных конструкциях этих языков. Так в че"м они заключаются?
По поводу предпринятых спецмер - это в самую точку ты попал! Дело в том, что эта тема неосновная, а только разобраться что к чему. Все поймешь, как, надеюсь, разбере"мся здесь и открою главную тему!
0
|
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
|
|
14.12.2022, 09:36 | 9 |
В том что первое собирается в машинный код, а второе виртуальные машины
Добавлено через 20 минут https://ru.wikipedia.org/wiki/Dalvik https://ru.wikipedia.org/wiki/.NET_Framework
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||||||||||||
14.12.2022, 13:31 | 10 | |||||||||||||||
Ну не, я не буду. Это долго очень.
Лучше вот видео посмотрите: https://www.youtube.com/watch?v=WeA29bNSPe4 Ну потому что оно так сделано. Процессор работает с машинным кодом, он ничего не знает ни про какие классы, типы, перегрузку методов, инкапсуляцию и т.д. Все это так или иначе присутствует в исходном коде, но отсутствует в машинном коде. Поэтому сохранять информацию об этом просто нет смысла. Т.е. та теоретическая декомпиляция, которая возможна, просто будет калькой с этого машинного кода, без всех тех синтаксичесих и семантичеких свойств, который были изначально. Их просто неоткуда взять. Стоит заметить, что некоторые приемы оптимизации являются типовыми, поэтому по их результату можно догадаться, как примерно выглядел код, который его породил. Но не более того. Обычно восстановление исходного программы по машинном коду заключается в том, что человек вручную и/или с помощью инструментария исследует машинный код, понимает что и как он делает, а потом пишет новый код, так сказать, по мотивам, который делает тоже самое. Т.е. задача восстановить именно оригинальный код вообще не стоит. За примером в общем-то не надо далеко ходить. Вот есть сайт, напишите какой-нибудь код, и сразу же увидите что из него осталось в машинном коде (там для удобства показан его дизассемблер). Например: https://godbolt.org/z/Mjc9qM4aG Там я написал вот такой ни на что не претендующий код:
a , у класса также есть функция foo() , которая выводит значение a на консоль. Все это написано внутри функции main.Теперь посмотрим, что из этого осталось в маш. коде (который мы смотрим в виде ассемблера):
main осталась. Однако никакого класса нет. Нет ни единого упоминания, что он вообще был. Также нет состояния, которое мы в этом классе задали. Нет и функции foo , компилятор ее убрал.Вот код, который может быть выдал бы нам какой-нибудь декомпилятор:
В более сложных случаях, может быть даже затруднительно восстановить исходный смысл каких-то конструкций. Например в коде написана реализация какой-нибудь формулы, компилятор на этапе компиляции посчитал часть этой формулы и записал в код результат этого расчета. При декомпиляции без знания предметной области скорее всего вы не сможете понять какой вид имела исходная формула. У вас будет только это записанное в код число и все. Что касается управляемых языков, то тут уже все сказано в статье, которую я выше скинул.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
17.12.2022, 13:01 | 11 |
...
0
|
19.12.2022, 18:08 | 12 |
В свое время мы с приятелями-студентами раскручивали в исходный код экзешники Борландовского паскаля 5.5. Ну, понятное дело, что фактически мы получали код с обфускацией, то есть речь об осмысленных именах переменных и ф-ций не шла, да и оптимизация там была довольно слабенькая. Удастся ли такое на современных компиляторах? Возможно, да, но попотеть придется изрядно.
0
|
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
|
|
19.12.2022, 20:47 | 13 |
Вы скорей всего через DeDe делали. Сейчас другие инструменты, но суть сохранилась
0
|
19.12.2022, 21:37 | 14 |
Не знаком.
Если интересовались полиморфными вирусами и их обнаружением, то вот что-то очень близкое к этому использовали. Маски, шаблоны, в таком духе. Добавлено через 4 минуты нашел, делфи еще в проекте не существовал
0
|
19.12.2022, 23:55 [ТС] | 15 |
Всем спасибо, кто принял участие в этой теме и, особенно, DrOffset.
Приглашаю всех участников темы в главную тему о способах защиты от декомпиляции. DrOffset, я так понимаю, что при декомпиляции чем выше "поднимаешься" вверх к исходнику, тем сложнее его восстановить. Отсюда вывод - надо предусмотреть защиту от декомпиляции на самом низком уровне и/или каким-то образом "вводить" в разброс структуры декомпилируемого файла на ранней стадии, чтобы выше, в процессе декомпиляции, труднее можно было понять логику работы программы и восстановить, хотя бы, псевдоисходник!
0
|
24.12.2022, 21:58 [ТС] | 17 |
Kuzia domovenok, к сожалению, Вы узко и поверхностно мыслите(не обижайтесь, но это факт)! Выкладывают на github.com, обычно, те, кому надо заявить о себе и/или продвинуться. И это, как в рекламе. А есть и другой более разумный путь - создать, как min хорошую и востребованную программу, которая сама себя разрекламирует и привлечёт внимание, а потому и будет нуждаться в защите от взлома, т.к. талантливых и способных очень мало, а халявщиков - "до хрена и больше"!
0
|
24.12.2022, 22:33 | 18 |
Able man, да кому твои программы нужны. Ты там себя Илоном Маском возомнил что ли? "Самый умный что ли?" Тебя так в детстве не опускали на землю?
Программирование это искусство а не средство для эгоистов.
0
|
24.12.2022, 23:49 [ТС] | 19 |
Kuzia domovenok, пишешь, что "да кому твои программы нужны. Ты там себя Илоном Маском возомнил что ли? "Самый умный что ли?"", так поживём - увидим и время покажет, а что я самый умный - никогда не заявлял, но далеко и неглупый. Ты, просто, обиделся и со злости говоришь! А программирование, как таковое, отчасти искусство, а больше рутина, нежели алгоритмизация! И при чём тут эгоизм?
0
|
brian778
|
24.12.2022, 23:58
Можно ли декомпилировать исполняемый файл?
#20
|
Не по теме: Внезапно всё скатилось в OpenSource vs Proprietary
0
|
24.12.2022, 23:58 | |
24.12.2022, 23:58 | |
Помогаю со студенческими работами здесь
20
Как можно декомпилировать? Как можно декомпилировать программу? Можно ли декомпилировать экзещник и получить полный исходник? Как декомпилировать DLL файл Как декомпилировать рус-файл Декомпилировать опубликованный в один файл exe Открыть исполняемый файл, если запущен конкретный файл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |