Как декомпилировать c
Перейти к содержимому

Как декомпилировать c

  • автор:

Декомпиляция .exe в исходник

Написал прогу на работе и при переустановке системы потёр сам проект. Среда разработки VS2010. Проект C++/CLI Windows Forms. Попытки восстановить проект различными рекавери к успеху не привели, очевидно, что многие сектора были перезаписаны. Остался только сам релиз.
Копания в гугле привели к выводу, что можно дизассемблировать экзешник и из полученного кода получить нечто С-подобное, но толковых описаний процесса не нашёл. Всё в очень общих чертах и довольно старо.
Буду признателен за любую помощь или подсказку куда копать.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Декомпиляция скрипта оО
Есть длл нужно её декомпилировать и как то запустить исходный код в висуал студио 2010 Как можно.

Декомпиляция программы
Как декомпилировать программу? И как узнать на каком языке она написана?

Декомпиляция dll
Возможна ли декомпиляция dll’ки, защищенной Themida, если есть ThemidaSDK.h и Obfuscator.cpp, с.

Декомпиляция программы, поиск кодировки в полученном коде
Добрый день, Есть необходимость создать программу которая будет которая будет формировать отчеты.

Эксперт .NET

6451 / 3980 / 1587
Регистрация: 09.05.2015
Сообщений: 9,340

Ставите IDA+Hex-Rays, и декомпилите (можно хоть каждую функцию по отдельности, или все сразу). Очень поможет наличие pdb файла. Но все равно код будет очень далек от исходника.

Регистрация: 26.10.2013
Сообщений: 118

Ставил IDA 7.0 + Hex-Rays, дизассемблировал экзешник. а вот что дальше делать не понимаю и мануал толковый найти не получается.
Вопрос мой даже, вероятно, стоит скорректировать: можно ли вообще получить на выхлопе нечто понятное именно для визуал студии?
Прога в принципе закончена, изменений логики, во всяком случае, серьёзных не будет. А вот правки внешнего вида интерфейса было бы неплохо иметь возможность сделать. В студии это удобнее.

Эксперт .NET

6451 / 3980 / 1587
Регистрация: 09.05.2015
Сообщений: 9,340

Лучший ответ

Сообщение было отмечено Dozentos как решение

Решение

Я вот не обратил сначала внимания что у вас там С++/CLI, его же можно тем же dotPeek’ом (или ILSpy, JustDecompile, Reflector), декомпилировать в C# например. И потом скомпилировать VS обратно в exe.
Но это только если вы нативным кодом там не злоупотребляли.

Эксперт С++

3571 / 2826 / 450
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22

ЦитатаСообщение от Dozentos Посмотреть сообщение

можно ли вообще получить на выхлопе нечто понятное именно для визуал студии?

нет.
нативный код, даже после иды, не читаем.
сначала вы получите мнемонику ассемблера, потом hex rays переведёт её в С-подобный код.
его нужно переписывать.
ида даст вам представления о функциях, некоторые константы, и прочую мелочовку, и всё это нужно править ручками.

а т.к. у вас проект .net, то нужно воспользоваться советом Someone007 и попробовать его декомпилировать (а не дизассемблировать).

Регистрация: 26.10.2013
Сообщений: 118

Someone007, спасибо, совет достойный 1000 благодарностей! Jetbrains dotPeek выдал проект на шарпе, выглядящий практически, как «родной». Только такое впечатление, что код обфусцирован кучей символов юникода. Как следствие, 11539 ошибок компиляции вида:

Кликните здесь для просмотра всего текста

C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(7,7): ошибка CS1056: Непредвиденный знак "\u003C" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(7,37): ошибка CS1056: Непредвиденный знак "\u003E" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(78,21): ошибка CS1056: Непредвиденный знак "\u003C" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(78,33): ошибка CS1056: Непредвиденный знак "\u003E" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(78,54): ошибка CS1056: Непредвиденный знак "\u003C" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(78,66): ошибка CS1056: Непредвиденный знак "\u003E" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(82,9): ошибка CS1056: Непредвиденный знак "\u0024" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(82,24): ошибка CS1056: Непредвиденный знак "\u0024" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(82,30): ошибка CS1056: Непредвиденный знак "\u0024" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(82,36): ошибка CS1056: Непредвиденный знак "\u0024" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(82,47): ошибка CS1056: Непредвиденный знак "\u0040" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(83,26): ошибка CS1056: Непредвиденный знак "\u003C" C:\Users\ADMIN\Documents\Visual Studio 2010\Projects\ktu_analyser\ktu_analyser\f_view_tabel.cs(83,38): ошибка CS1056: Непредвиденный знак "\u003E"

Вы не в курсе, отчего сие? И нет ли способа с этим бороться, кроме как квадратно-гнездовым проходом по всем файлам вручную? Может какие настройки dotPeek’а нужно выставить или самой студии?

Декомпилятор для С++

Я учусь С++ и тут узнал, что существуют декомпиляторы. Я читал, что невозможно обратно получить исходный код из откомпилированной программы на С++. Это так? Если да, то можно ли сделать так, чтобы это невозможно было? И какие программы декомпилируют программы на С++?

Отслеживать
задан 8 дек 2016 в 11:00
332 2 2 золотых знака 7 7 серебряных знаков 22 22 бронзовых знака
Можно получить только код на assambler с помощью диссамсамблера
8 дек 2016 в 11:11

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Полноценная декомпиляция для C++ в общем случае невозможна: имена переменных и функций не сохраняются.

Отслеживать
29.6k 3 3 золотых знака 17 17 серебряных знаков 36 36 бронзовых знаков
ответ дан 8 дек 2016 в 11:18
Владимир Мартьянов Владимир Мартьянов
9,649 4 4 золотых знака 21 21 серебряный знак 35 35 бронзовых знаков
а если я хочу защитить свой проект от декомпиляции? то это возможно или просто смириться нужно?
8 дек 2016 в 11:26
Смиритесь. Надо будет — расковыряют так или иначе.
8 дек 2016 в 11:30

@Developer Вопрос упирается в соотношение стоимость взлома/полученная выгода 🙂 Текст на ЯВУ не получится, это понятно, но опять же — раз процессор какой-то код выполняет — то этот код уже известен 🙂

8 дек 2016 в 11:52
А можно хоть как то защитить от декомпиляции или нет?
8 дек 2016 в 11:55
а способ защиты от декомпиляции — вынести код на сервер и пусть там считает).
8 дек 2016 в 15:08

Дизассемблер IDA PRO — инструмент для исследования, отладки и, при необходимости, модификации уже скомпилированных программ, когда нет исходных текстов. Декомпиляторы в псевдокод С++, конечно, имеются (IDA тоже это умеет), но проку от них будет мало. Только ассемблер!

Вот скриншот IDA PRO:

введите сюда описание изображения

Отслеживать
20.1k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
ответ дан 22 янв 2021 в 9:13
2,004 4 4 серебряных знака 10 10 бронзовых знаков
Продублирую и тут, раз вы дублируете ответ: не единственный и не незаменимый.
22 янв 2021 в 9:26

@insolor так я без задней мысли написал, как есть. Если вы можете предложить серьёзные альтернативы IDA, как минимум с такими же широкими возможностями и удобствами для исследования бинарников, то я тоже буду рад про них узнать. За исправление опечатки, кстати, спасибо.

22 янв 2021 в 15:44

«как минимум с такими же широкими возможностями и удобствами для исследования бинарников» — нет, так не пойдет. В ответе вы написали только про «единственный и незаменимый», я отвечаю конкретно на это. В большинстве случаев не нужно всех этих широких возможностей, достаточно более простых инструментов — а таких простых инструментов, способных заменить IDA полно. Если нужен список, то вот: radare2, Cutter, Ghidra, x64dbg, OllyDbg, и т.д.

22 янв 2021 в 16:19

@insolor а ещё WinHex, PE Tools, ImpRec и другие специальные инструменты. Это всё дополнительные средства, которые могут понадобиться, но идут в списке, начиная с номера 2 после IDA. Олькой, кстати, я в своё время очень активно пользовался, когда IDA ещё не имел встроенного отладчика. Но должен заметить, что OllyDbg мне больше нравился, чем отладчик IDA. Гораздо удобней в нём было «на лету» патчить отлаживаемую программу. Жаль что проект этот был давным-давно заброшен.

22 янв 2021 в 16:36

«Это всё дополнительные средства, которые могут понадобиться, но идут в списке, начиная с номера 2» — это конкретно ваш стиль работы, это не значит, что это единственный путь. Для многих задач достаточно простого дизассемблера, не уходящего в анализ на несколько минут, а дизассемблирующего конкретно то что ему укажут. Того же radare2 например. Так легко IDA становится инструментом номер 2, который достаешь только для каких-то сложных задач.

22 янв 2021 в 17:41

Ну если очень хочется защитить программу от взлома, то есть специальные программы-обфускаторы. Они запутывают инструкции процессора, в которые собирается программа. Тот, кто захочет взломать Вашу программу, будет дезассемблировать Ваш исполняемый файл. Получить текст программы на ЯВУ он не сможет из-за особенностей С++. Ассемблер нормальным людям итак читать сложно, а тут он ещё и превращён в жуткую кашу обфускатором. Это хакера помучает изрядно. Но остановить полностью навряд ли сможет. И при этом есть повышенный риск ошибок и замедление быстродействия в обработанном обфускатором куске кода. Так что ценность метода под вопросом, если конечно Вы не проект ААА-класса разрабатываете. Там все средства хороши.

Отслеживать
ответ дан 8 дек 2016 в 16:35
Yury Plinto Yury Plinto
787 1 1 золотой знак 4 4 серебряных знака 15 15 бронзовых знаков

«нормальным людям» а кто такой нормальный человек? И можно примеры таких программ, которые реально запутывают ассемблерный код до нормального уровня, вроде бы все оффлайн игры взломали поэтому и вопрос.

8 дек 2016 в 18:02

@pavel естественно все оффлайн игры взломали. Обфускация — это не шифрование. Невозможно высчитать эффективность её применения с помощью математики. Шифрование гарантирует, что взломщик не сможет вообще ничего понять в полученном им шифрованном тексте до тех пор пока не получит/подберёт/угадает ключ. Взломостойкость шифра определяет произойдёт ли это вообще, и если да, то сколько времени шифр продержится гарантированно. А запутанный код хакер начнёт разбирать с первой секунды. Просто он будет это делать медленнее, чем читал бы не запутанный код. А насколько медленнее — зависит от хакера)

13 дек 2016 в 9:57

Допустим некую игру хотят взломать 3 хакера: Вася, Петя и Вова. Вася в запутанном коде вообще не разберётся из-за плохих навыков, Петя потратит 2 месяца чтобы разобраться, а Вова 1 неделю. В итоге всё зависит от того, какой хакер возьмётся за взлом. И от того посчитает ли он нужным тратить своё время на Ваш проект. Последнее — самое важное. Почти все проекты ААА класса взломаны. А вот среди программ и игр «второго эшелона» множество так и не покорились хакерам. Потому что тратить силы и время на второсортный проект мало кому хочется. Всё упирается в то, насколько Ваш проект нужно взломать.

13 дек 2016 в 10:07

А по поводу «нормальных людей» — я имел ввиду, что языки высокого уровня ориентированы на удобство чтения человеком. Ассемблер ориентирован на эффективную работу с железом. Тексты на нём читать тяжелее, чем на ЯВУ для большинства программистов. Везде есть исключения, но даже для самых больших знатоков ассемблера, чтение текстов на нём — процесс более медленный, чем чтение текста на ЯВУ. Просто меньше информации в том же объёме текста и ниже уровень абстракции от железа.

13 дек 2016 в 10:14

А примеры обфускаторов: Stunnix C++ Obfuscator, StarForce C++ Obfuscate, Morpher C/C++ Obfuscator, Semantic Design C und C++ Obfuscators. Об этих программах только слышал, сам не пользовался. Ибо проектов, для которых этот софт применять имело бы смысл, у меня не было. Поэтому оценить степень эффективности работы каждого не могу.

13 дек 2016 в 10:19

Highly active question. Earn 10 reputation (not counting the association bonus) in order to answer this question. The reputation requirement helps protect this question from spam and non-answer activity.

  • c++
  • декомпиляция

Где взять декомпилятор для Си?

Нигде. И никак. Только в ассемблер и из него весьма приблизительно в исходник на C.

Или тут (дорого), или тут (бесплатно).

Решения вопроса 1

Zoominger

System Integrator
Найдите любой дизассемблер.
Ответ написан более двух лет назад

lik173

lik173 @lik173 Автор вопроса
а где прочитать .text?
Ответы на вопрос 2

CityCat4

Внимание! Изменился адрес почты!

Только в тех редких случаях, когда в программе почему-то сохранилась отладочная информация, можно составить приблизительное представление о коде. Если же там было простяцкое gcc test.c -o test (или даже gcc -O2 test.c -o test ) — усе, только дизассемблер.

Ответ написан более двух лет назад
Комментировать
Нравится 4 Комментировать

mogen

reverse engineer

IDA, Radare2, Ghidra. В этих инструментах есть декомпиляторы для Си. Но декомпиляторы не всегда точны.

Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

reverse-engineering

  • Reverse engineering
  • +1 ещё

Как отредактировать dll-файл?

  • 1 подписчик
  • 10 часов назад
  • 59 просмотров

Как декомпилировать программу?

QC38Nzz.png

Здравствуйте. Только начал пробовать участвовать в ctf, возник вопрос, как декомпилировать простую программу, написанную на С, скомпилированную для linux? Скачал IDA, открыл файл и обнаружил много раздробленного кода на ассемблере:

Так и должно быть? Как во всём этом разобраться? Мне бы хотя бы примерно понять структуру программы.
На моём линуксе эта программа еще и не запускается почему-то — просто пишет «No such file or directory.», Linux Ubuntu x86_64, программа 32 битная. В чем может быть проблема?
Сама программа, на всякий случай тут.

  • Вопрос задан более трёх лет назад
  • 9665 просмотров

Комментировать
Решения вопроса 1
Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 4

Rsa97

Для правильного вопроса надо знать половину ответа

Как разобраться? Для начала освоить ассемблер, хотя бы на базовом уровне, чтобы понимать смысл команд. Затем определить стандарт передачи данных в подпрограммы для варианта компиляции вашей программы. Потом изучать все эти подпрограммы sub_XXXX и пытаться понять, что они делают. По ходу изучения переименовывать подпрограммы и адреса данных в удобочитаемую форму. Когда смысл всех подпрограмм станет ясен, можно будет понять, что в целом делает программа.

Ответ написан более трёх лет назад
Нравится 2 4 комментария
TAnonim @TAnonim Автор вопроса

Однако здесь, в разборе решения, bruce30262.logdown.com/posts/1256093-33c3-ctf-2016. приводятся прямо куски нормального кода на С. Как он мог их получить?

Rsa97

TAnonim: С опытом приходит понимание того, как структуры данных и команды C переводятся на ассемблер. Накопив определённый базис можно восстанавливать примерный исходный код на C, а зная, что делает программа и давать осмысленные названия переменным.

ruzzz

TAnonim: В платной версии IDA есть плагин Hex-Rays Decompiler, внутри функции нажимаете F5, и возможно получите некий Си код с помощью этого плагина.

TAnonim @TAnonim Автор вопроса
Руслан: Спасибо, действительно помогает!
С новым годом 🙂

На моём линуксе эта программа еще и не запускается почему-то — просто пишет «No such file or directory.»,

Как вы её запускаете то? Нужно указывать полный путь, или относительный. Но начальная компонента в пути обязательно должна быть.

Ответ написан более трёх лет назад
Нравится 1 7 комментариев
TAnonim @TAnonim Автор вопроса

естественно. тот же ls показывает, что программа есть, а когда пытаюсь запустить через ./babyfengshui (находясь в каталоге с ней) выкидывает ошибку.
С наступающим 🙂

TAnonim: И вас с наступающим! А права на исполнение у файла есть?
TAnonim @TAnonim Автор вопроса
fshp: Спасибо. Да, пробовал и через sudo и через chmod давать права -xu вроде. Этого достаточно?
TAnonim: это вы отобрали права.
TAnonim: поставьте 777
TAnonim @TAnonim Автор вопроса

fshp: даже смешно немного. Ну chmod я ставил правильный до этого, это я вам не так сказал, сейчас, на всякий случай, попробовал переставить на 777, но все равно та же история — no such file.

TAnonim @TAnonim Автор вопроса

Кстати, та же команда file выводит информацию о приложении: «ELF 32-bit LSB executable». Linux у меня, как я уже говорил, Ubuntu x86_64. Может это всё-таки из-за разрядности?

Rou1997

Вы используете только дизассемблер, а необходим еще декомпилятор C++ (например Hex-Rays — скачайте и установить его в IDA), а также отладчик как средство отслеживания и контроля программы в работе, для UNIX очевидным выбором является отладчик gdb , да и для других ОС он тоже применяется хотя порой с меньшим успехом.
К тому же у вас совсем нет опыта иначе бы вы хотя бы догадались что сперва нужно открыть функцию main в списке слева, поскольку выполнение executable начинается с этой функции.

Сама программа, на всякий случай тут.

На тот случай, если я недостаточно устал от работы, чтобы еще и вами заниматься, а то нечего мне тут бездельничать на Новый год, да? 🙂

Только начал пробовать участвовать в ctf

Лучше бы вы работали.
Это сложное дело, для него требуется обрести новые навыки, а то и слегка перестроить мышление, для такой перестройки нужен серьезный стимул, например заказ на фрилансе на большую сумму и с уже выплаченным большим авансом, а не спонтанно захотел и сделал, как хотели бы многие.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *