30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
1

Можно ли декомпилировать исполняемый файл?

11.12.2022, 01:42. Показов 3555. Ответов 29

Author24 — интернет-сервис помощи студентам
На выходе компилятора(ранее были отдельные процессы трансляции, а затем компиляции) мы получаем исполняемый файл. А можно ли из исполняемого файла получить исходник, точнее, псевдоисходник на С/С++ или же только можно получить псевдоисходник на ассемблере с помощью кроссассемблера? И можно ли тогда из этого псевдоисходника на ассемблере получить псевдоисходник на С/С++?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2022, 01:42
Ответы с готовыми решениями:

Потерял cpp файл, а ехе-шник остался. Можно как-то декомпилировать файл обратно?
Потерял cpp файл, а ехе-шник остался. Можно как-то декомпилировать файл обратно?

Как создать программу в С++, чтобы его можно было запускать как исполняемый .exe файл?
Здравствуйте! Собственно вся суть сабжа содержится содержится в сабже :) допустим: //...

Можно ли создать исполняемый файл книги
Здравствуйте. Подскажите как перевести в формат .exe проект VB созданный в Excel.

Как декомпилировать .class файл обратно в .java файл?
Как декомпилировать .class файл обратно в .java файл?

29
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
11.12.2022, 04:46 2
Hex Rays
Правда не знаю можно ли по правилам тут это озвучивать
0
30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
11.12.2022, 09:34  [ТС] 3
brian778, а что она дает на выходе? Насколько выдаваемый псевдоисходник близок к исходнику? При повторной декомпиляции она выдает одно и то же или кое-что, все же, модефицирует?
0
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
11.12.2022, 11:20 4
Никто вам не воссаздаст исходник из C++. Это не Java / C#
Это плагин для IDA который попытается перевести тот код что был на asm в с++ читаемый вариант, что не значит что вы сможете его запихнуть в компилятор и он соберётся
0
30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
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
Цитата Сообщение от Able man Посмотреть сообщение
Что и где там дополнительно "вылазиет", что процесс компиляции не пойдет до конца?
Зачем столько вопросов? Попробуйте сами и получите все ответы
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
12.12.2022, 14:12 7
Цитата Сообщение от Able man Посмотреть сообщение
что можно получить исходник на C# и/или Java?
Можно, если для этого не было предпринято специальных усилий.

Цитата Сообщение от Able man Посмотреть сообщение
как называется "плагин для IDA, который попытается перевести тот код, что был на asm в с++"?
http://www.idasoft.ru/manual/

Цитата Сообщение от Able man Посмотреть сообщение
транслятор преобразует исходник на С/С++ в ассемблер, компилятор затем преобразует его в процессорный код, а уж затем компоновщик преобразует его в исполняемый код, т.е. в исполняемый файл.
Ассемблер (как язык) не участвует в этой цепочке.
Типичный компилятор имеет трехуровневую организацию:
1) Front-end - анализ и построения абстрактного внутреннего представления программы (AST)
2) Middle-end- преобразование (например, оптимизации)
3) Back-end - генерация кода.
Back-end из преобразованного внутреннего представления сразу делает машинный код для заданной платформы, в современном компиляторе нет смысла использовать ассемблер в качестве промежуточного этапа.

Цитата Сообщение от Able man Посмотреть сообщение
Декомпиляция происходит в обратном порядке: декомпоновщик преобразует исполняемый файл в процессорный код, затем декомпилятор преобразует его в ассемблер, а уж детранслятор(эдесь это плагин) преобразует его в один из вариантов исходника("псевдоисходник") на С/С++!
Теоретически да, но процесс компиляции - это преобразование с потерями. Т.е. на этапе компиляции есть гораздо больше информации, чем есть на этапе декомпиляции. Большее количество информации превратить в меньшее (или изменить ее состав) гораздо проще, чем произвести обратное действие.
Java и C# в этом смысле лучше поддаются декомпиляции именно потому, что в их случае компиляция выполняется без потерь. Т.е. сохраняется метаинформация, позволяющая восстановить исходный вид кода. Подробнее:
https://learn.microsoft.com/en... on-process
Кликните здесь для просмотра всего текста
When compiling to managed code, the compiler translates your source code into Microsoft intermediate language (MSIL), which is a CPU-independent set of instructions that can be efficiently converted to native code. MSIL includes instructions for loading, storing, initializing, and calling methods on objects, as well as instructions for arithmetic and logical operations, control flow, direct memory access, exception handling, and other operations. Before code can be run, MSIL must be converted to CPU-specific code, usually by a just-in-time (JIT) compiler. Because the common language runtime supplies one or more JIT compilers for each computer architecture it supports, the same set of MSIL can be JIT-compiled and run on any supported architecture.
0
30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
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
Цитата Сообщение от Able man Посмотреть сообщение
Почему при компиляции исходника на С/С++ теряется метаинфа, а при компиляции С# и Java - нет. Если сможешь, пожалуйста, поясни подробней! Я так думаю, что здесь причина в отличительных конструкциях этих языков. Так в че"м они заключаются?
В том что первое собирается в машинный код, а второе виртуальные машины

Добавлено через 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
Цитата Сообщение от Able man Посмотреть сообщение
1)С back-end, вроде, все" понятно. С middle - частично, а с front-end - "нифига" не понятно! Если сможешь, поясни, пожалуйста, подробнее и, желательно, на примере
Ну не, я не буду. Это долго очень.
Лучше вот видео посмотрите: https://www.youtube.com/watch?v=WeA29bNSPe4

Цитата Сообщение от Able man Посмотреть сообщение
Почему при компиляции исходника на С/С++ теряется метаинфа, а при компиляции С# и Java - нет.
Ну потому что оно так сделано.
Процессор работает с машинным кодом, он ничего не знает ни про какие классы, типы, перегрузку методов, инкапсуляцию и т.д. Все это так или иначе присутствует в исходном коде, но отсутствует в машинном коде. Поэтому сохранять информацию об этом просто нет смысла. Т.е. та теоретическая декомпиляция, которая возможна, просто будет калькой с этого машинного кода, без всех тех синтаксичесих и семантичеких свойств, который были изначально. Их просто неоткуда взять. Стоит заметить, что некоторые приемы оптимизации являются типовыми, поэтому по их результату можно догадаться, как примерно выглядел код, который его породил. Но не более того. Обычно восстановление исходного программы по машинном коду заключается в том, что человек вручную и/или с помощью инструментария исследует машинный код, понимает что и как он делает, а потом пишет новый код, так сказать, по мотивам, который делает тоже самое. Т.е. задача восстановить именно оригинальный код вообще не стоит.

За примером в общем-то не надо далеко ходить. Вот есть сайт, напишите какой-нибудь код, и сразу же увидите что из него осталось в машинном коде (там для удобства показан его дизассемблер).
Например: https://godbolt.org/z/Mjc9qM4aG
Там я написал вот такой ни на что не претендующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
 
class A {
public:
   void foo() {
        std::printf("%d\n", a);
   }
 
private:
   int a = 10;
};
 
int main() {
    A b;
    b.foo();
}
Как видно, тут у меня есть класс, у которого есть состояние a, у класса также есть функция foo(), которая выводит значение a на консоль. Все это написано внутри функции main.
Теперь посмотрим, что из этого осталось в маш. коде (который мы смотрим в виде ассемблера):
Assembler
1
2
3
4
5
6
7
8
9
10
11
.LC0:
        .string "%d\n"
main:
        sub     rsp, 8
        mov     esi, 10
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        call    printf
        xor     eax, eax
        add     rsp, 8
        ret
Так. Функция main осталась. Однако никакого класса нет. Нет ни единого упоминания, что он вообще был. Также нет состояния, которое мы в этом классе задали. Нет и функции foo, компилятор ее убрал.
Вот код, который может быть выдал бы нам какой-нибудь декомпилятор:
C++
1
2
3
4
5
#include <stdio.h>
 
int main() {
    printf("%d\n", 10);
}
Т.е. мы получили рабочую программу, которая делает то же самое, что и первая программа, но совершенно очевидно, что это другая программа, потому что часть информации о типах и структуре данных была утеряна при компиляции.
В более сложных случаях, может быть даже затруднительно восстановить исходный смысл каких-то конструкций. Например в коде написана реализация какой-нибудь формулы, компилятор на этапе компиляции посчитал часть этой формулы и записал в код результат этого расчета. При декомпиляции без знания предметной области скорее всего вы не сможете понять какой вид имела исходная формула. У вас будет только это записанное в код число и все.

Что касается управляемых языков, то тут уже все сказано в статье, которую я выше скинул.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
17.12.2022, 13:01 11
...
0
1017 / 1905 / 178
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.12.2022, 18:08 12
В свое время мы с приятелями-студентами раскручивали в исходный код экзешники Борландовского паскаля 5.5. Ну, понятное дело, что фактически мы получали код с обфускацией, то есть речь об осмысленных именах переменных и ф-ций не шла, да и оптимизация там была довольно слабенькая. Удастся ли такое на современных компиляторах? Возможно, да, но попотеть придется изрядно.
0
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
19.12.2022, 20:47 13
Цитата Сообщение от vantfiles Посмотреть сообщение
Удастся ли такое на современных компиляторах?
Вы скорей всего через DeDe делали. Сейчас другие инструменты, но суть сохранилась
0
1017 / 1905 / 178
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.12.2022, 21:37 14
Цитата Сообщение от brian778 Посмотреть сообщение
через DeDe
Не знаком.

Если интересовались полиморфными вирусами и их обнаружением, то вот что-то очень близкое к этому использовали. Маски, шаблоны, в таком духе.

Добавлено через 4 минуты
нашел, делфи еще в проекте не существовал
0
30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
19.12.2022, 23:55  [ТС] 15
Всем спасибо, кто принял участие в этой теме и, особенно, DrOffset.
Приглашаю всех участников темы в главную тему о способах защиты от декомпиляции.
DrOffset, я так понимаю, что при декомпиляции чем выше "поднимаешься" вверх к исходнику, тем сложнее его восстановить. Отсюда вывод - надо предусмотреть защиту от декомпиляции на самом низком уровне и/или каким-то образом "вводить" в разброс структуры декомпилируемого файла на ранней стадии, чтобы выше, в процессе декомпиляции, труднее можно было понять логику работы программы и восстановить, хотя бы, псевдоисходник!
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
23.12.2022, 19:44 16
Able man, а смысл чего-то защищать? Наоборот свой код надо стараться выкладывать на гитхаб публично!
0
30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
24.12.2022, 21:58  [ТС] 17
Kuzia domovenok, к сожалению, Вы узко и поверхностно мыслите(не обижайтесь, но это факт)! Выкладывают на github.com, обычно, те, кому надо заявить о себе и/или продвинуться. И это, как в рекламе. А есть и другой более разумный путь - создать, как min хорошую и востребованную программу, которая сама себя разрекламирует и привлечёт внимание, а потому и будет нуждаться в защите от взлома, т.к. талантливых и способных очень мало, а халявщиков - "до хрена и больше"!
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
24.12.2022, 22:33 18
Able man, да кому твои программы нужны. Ты там себя Илоном Маском возомнил что ли? "Самый умный что ли?" Тебя так в детстве не опускали на землю?

Программирование это искусство а не средство для эгоистов.
0
30 / 30 / 2
Регистрация: 24.04.2022
Сообщений: 552
Записей в блоге: 2
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2022, 23:58
Помогаю со студенческими работами здесь

Как можно декомпилировать?
Буду очень благодарен

Как можно декомпилировать программу?
буду благодарен ! Декомпиляция - по сути взлом программы. Взлом запрещён правилами форума,...

Можно ли декомпилировать экзещник и получить полный исходник?
Здравствуйте, уважаемые форумчане. Я тут точнее в этой ветке новичок по этому не судите строго....

Как декомпилировать DLL файл
есть dll файл хотелось бы чтобы был похожий исходник на оригинал , а если точней то интересуют...

Как декомпилировать рус-файл
подскажите чем декомпилировать рус файл в читабельный ру? для 2 и 3 питона т.к не знаю на чем...

Декомпилировать опубликованный в один файл exe
Доброго времени суток. Поделись опытом если имеется: опубликованный одним файлом .Net сервис...

Открыть исполняемый файл, если запущен конкретный файл
Доброго времени суток! Вот такая проблемка мучает: мне нужно решить следующую задачу: открыть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru