2 / 2 / 0
Регистрация: 09.01.2013
Сообщений: 65
1

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

26.02.2013, 09:55. Показов 39293. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
интересен такой вопрос - существуют ли декомпиляторы в С++ ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2013, 09:55
Ответы с готовыми решениями:

Декомпиляторы С++ кода
Декомпиляторы С++ кода Доброго вечера!! Перечислите поджалуста, назовите. Ссылки, это, крайне...

Декомпиляторы
Ребята, какой на ваше мнение лучший декомпилятор, какой максимально точно код востанавливает???...

Приложение требует ввести пароль, задача его узнать (декомпиляторы, dex)
Есть приложение, которое требует ввести пароль, задача его узнать. Имеем файл Test.apk и...


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

Или воспользуйтесь поиском по форуму:
27
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.02.2013, 10:07 2
существуют только дизассембляторы), любой бинарник можно перевести в ассемблерный код, а вот собрать из него более высокоуровневый язык (и так что бы было правильно) я про такое не слышал
0
2 / 2 / 0
Регистрация: 09.01.2013
Сообщений: 65
26.02.2013, 10:12  [ТС] 3
А бинарник в ассемблер переводится правильно? Если знать ассемблер можно понять всю логику EXE-шника?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.02.2013, 10:24 4
да правильно, ибо бинарник это почти и есть набор ассемблерных команд,
Цитата Сообщение от Akkanee Посмотреть сообщение
Если знать ассемблер можно понять всю логику EXE-шника?
да ты совершенно прав, но это не очень тривиальная задача
0
2 / 2 / 0
Регистрация: 09.01.2013
Сообщений: 65
26.02.2013, 10:40  [ТС] 5
Какие есть качественные дизассемблеры?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
26.02.2013, 10:42 6
знаю 2, CheatEngine и OllyDebugger, в обоих можно посмотреть дизассемблированый бинарь
0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 794
26.02.2013, 13:03 7
Цитата Сообщение от Akkanee Посмотреть сообщение
Какие есть качественные дизассемблеры?
IDA Pro. В нем и декомпилятор Hex-Rays есть, который в си код перемалывает.
Только вот если ассемблер и внутреннее устройство типичной С++ программы не знаешь, то пока не разберешься можешь даже не пытаться восстановить исходник.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
26.02.2013, 14:09 8
Цитата Сообщение от Akkanee Посмотреть сообщение
А бинарник в ассемблер переводится правильно?
Зависит от качества дизассемблера. Некоторые могут код с данными спутать, и например строку "Hello, World" могут интерпретировать как последовательность инструкций ассемблера.
0
2 / 2 / 0
Регистрация: 09.01.2013
Сообщений: 65
26.02.2013, 14:29  [ТС] 9
А какие дизассемблеры наиболее качественные? Не обязательно чтоб в дизассемблере был декомпилятор.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
26.02.2013, 15:13 10
Уже ж ответили выше - из известных IDA Pro и OllyDebuger.
0
2680 / 1742 / 178
Регистрация: 05.06.2011
Сообщений: 5,048
26.02.2013, 15:37 11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Зависит от качества дизассемблера. Некоторые могут код с данными спутать
Зависит, но совершенно другое: как часто он это будет проделывать и вообще -- удобство работы. Спасибо фон Нейману, код от данных ничем и никак не отличить, так что не стоит надеяться, что дизассемблер сам чего-нить осмысленное сделает -- половина работы твоя, если не 90%.
Кстати, помнится, есть ещё один -- SR чего-то там, полностью пакетный -- дизассемблирует, смотришь результат, правишь, снова пропускаешь, он, с учётом твоих правок, дизассемблирует чуть правильнее и т.п.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
26.02.2013, 16:16 12
Цитата Сообщение от iifat Посмотреть сообщение
Спасибо фон Нейману, код от данных ничем и никак не отличить, так что не стоит надеяться, что дизассемблер сам чего-нить осмысленное сделает
Можно отличить когда код и данные в разных сегментах (не те сегменты, которые в сегментных регистрах, а те, которые в PE файле) и компиляторы это умеют делать.
Когда данные наперемешку с кодом, то тут уже конечно задача лежит на человеке.
0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 794
26.02.2013, 16:32 13
Цитата Сообщение от iifat Посмотреть сообщение
Зависит, но совершенно другое: как часто он это будет проделывать и вообще -- удобство работы. Спасибо фон Нейману, код от данных ничем и никак не отличить, так что не стоит надеяться, что дизассемблер сам чего-нить осмысленное сделает -- половина работы твоя, если не 90%.
Зависит напрямую от кода.
По косвенным признакам всегда можно с определенной вероятностью определить где данные, а где код. Причем вероятность довольно высока. Если файл собран со стандартными опциями, то первая подсказка - секции (кода, данных и т.д) и их атрибуты (разрешены чтение, запись, выполнение). Вторая подсказка - ссылки на области памяти, т.е. если код читает в регистр байты по какому-то адресу и производит с ними некоторые вычисления - скорее всего это данные (понятно, что это может быть дешифровка кода, пермутация и т.п., но в реальном стандартном коде такое встречается мягко говоря не часто (чуть чаще чем никогда). IDA Pro вполне успешно определяет код и данные плюс еще и стандартные функции опознает. IDA как раз и позволяет интерактивно работать с кодом (Interactive DisAssembler).
Ко всему прочему - процессор ведь как-то выполняет именно код, и можно это сэмулировать в крайнем случае (ясно, что 100% покрытие кода вряд ли получится, но хотя бы так).
0
2680 / 1742 / 178
Регистрация: 05.06.2011
Сообщений: 5,048
26.02.2013, 16:40 14
Скажем так, это, конечно, помогает. Но если, например, в переменных хранить адрес процедуры... В общем, декомпиляция сколь нибудь серьёзной программы -- тот ещё геморрой. Кому интересно, возьмите хоть Hello, world и попробуйте декомпилить. Удачи!

Добавлено через 6 минут
Цитата Сообщение от WhiteP Посмотреть сообщение
дешифровка кода, пермутация и т.п., но в реальном стандартном коде такое встречается мягко говоря не часто
Нечасто? Защита коммерческой проги от воровства, кряка, отладки? Ну, не знаю. Просто не знаю. Но таки, помнится, уже через сотню-другую команд начинается такая каша... В общем, люди справляются, конечно. Но занятие не из лёгких.
0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 794
26.02.2013, 16:48 15
Цитата Сообщение от iifat Посмотреть сообщение
Нечасто? Защита коммерческой проги от воровства, кряка, отладки?
Ну если дизассемблирование применять исключительно для взлома/исследования защиты, где код специально написан так, чтобы запутывать исследователя и в эту защиту вложено тысячи $ (крупными софтверными компаниями типа... ну там адоб), то да - непросто. Дизассемблируют ведь не только для этого...
А простые шароварщики либо навесную защиту вешают, которую можно ломать тупо по статьям если есть немного знаний, либо пишут свой велосипед, который опытные исследователи снимают за день в худшем случае.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.02.2013, 17:23 16
Цитата Сообщение от WhiteP Посмотреть сообщение
ну там адоб
У Адоб кстати к примеру для фотошопа защита фиговая ибо достаточно подменить один файл...

Не помню название, но есть декомпилятор, который по мимо ASM кода, еще составляет приблизительный код на языке Си
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
26.02.2013, 18:09 17
Цитата Сообщение от WhiteP Посмотреть сообщение
По косвенным признакам всегда можно с определенной вероятностью определить где данные, а где код
Assembler
1
2
3
4
5
6
7
mov eax, ebx
jmp lbl
str:
db 'H', 'e', 'l' ; и т.д.
lbl:
print str ; допустим есть какой то макрос print
cmp eax, ebx
тут нереально отличить данные от кода

Цитата Сообщение от WhiteP Посмотреть сообщение
процессор ведь как-то выполняет именно код
если данные вшиты в секцию кода, то программист (или компилятор) позаботиться о том, чтобы они не выполнялись (как в примере выше).
А так системе известно, что есть секция _text, которую и нужно выполнять.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
компиляторы это умеют делать.
конечно же я имел ввиду "дизассемблеры"

0
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 794
26.02.2013, 18:21 18
Цитата Сообщение от Kastaneda Посмотреть сообщение
print str ; допустим есть какой то макрос print
"Какой-то макрос" в дизассемблере раскроется в последовательность команд, (под Windows ведущие к API WriteFile в конечном итоге (либо сразу к ядреным (syscall, int 2e) сервисам в очень хитром коде), а под дос либо к собстаенному коду записи в видеопамять, либо к соотв. прерываниям), которые будут напрямую обращаться к адресу со строкой (push 00402100, например, либо lea eax, xxx push eax).

Цитата Сообщение от Kastaneda Посмотреть сообщение
если данные вшиты в секцию кода, то программист (или компилятор) позаботиться о том, чтобы они не выполнялись (как в примере выше).
Именно. Если трейсить программный код - можно сформировать представление о том, где данные, а где код.
Можно и сэмулировать работу процессора для обхода всяческих антиотладочных/антидизасмовых уловок (сложно, медленно, но можно).

Ко всему - компиляторы высокоуровневых языков редко проворачивают такие фокусы, что становится сложно определить код/данные. Когда код самописный ассемблерный/сишный и написан с целью усложнить исследование - тут другой разговор.
0
Модератор
Эксперт по электронике
8873 / 6649 / 910
Регистрация: 14.02.2011
Сообщений: 23,409
26.02.2013, 18:35 19
Цитата Сообщение от WhiteP Посмотреть сообщение
либо пишут свой велосипед, который опытные исследователи снимают за день в худшем случае.
это смотря какой велосипед
у Касперски описано в "Фундаментальные основы хакерства" как он ломал компилятор Харона
защита, шифрование проверка кода
и даже без защиты восстановить Сишный исходник нереально, оптимизатор постарается
например
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
 int x;
A(int m){x=m;};
};
int main ()
{
A a(5);
return a.x;
}
превратит в
Assembler
1
2
3
main:
mov eax,5;
ret
что соответствует
C++
1
2
3
4
int main ()
{
return 5;
}
очень похоже на исходный код?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
26.02.2013, 18:37 20
Цитата Сообщение от WhiteP Посмотреть сообщение
"Какой-то макрос" в дизассемблере раскроется в ...
да это понятно, просто я не стал писать код вывода строки на экран, т.к. суть примера не в этом.

Цитата Сообщение от WhiteP Посмотреть сообщение
Именно. Если трейсить программный код - можно сформировать представление о том, где данные, а где код.
Это да, но пример был с целью показать, что не всегда "на глаз" можно отличить данные от кода.
Цитата Сообщение от WhiteP Посмотреть сообщение
Ко всему - компиляторы высокоуровневых языков редко проворачивают такие фокусы, что становится сложно определить код/данные.
Я бы даже сказал они такого вообще не делают. Ну может какой-то специфичный компилятор под специфичную платформу может такое сделать (и то с каким-нибудь хитрым ключом компиляции )
0
26.02.2013, 18:37
Ответ Создать тему
Опции темы

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