Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 101, средняя оценка - 4.96
Akkanee
2 / 2 / 0
Регистрация: 09.01.2013
Сообщений: 65
#1

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

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

Здравствуйте,
интересен такой вопрос - существуют ли декомпиляторы в С++ ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 09:55     декомпиляторы С++
Посмотрите здесь:

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

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

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


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,408
Записей в блоге: 17
26.02.2013, 17:23     декомпиляторы С++ #16
Цитата Сообщение от WhiteP Посмотреть сообщение
ну там адоб
У Адоб кстати к примеру для фотошопа защита фиговая ибо достаточно подменить один файл...

Не помню название, но есть декомпилятор, который по мимо ASM кода, еще составляет приблизительный код на языке Си
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
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 Посмотреть сообщение
компиляторы это умеют делать.
конечно же я имел ввиду "дизассемблеры"

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

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

Ко всему - компиляторы высокоуровневых языков редко проворачивают такие фокусы, что становится сложно определить код/данные. Когда код самописный ассемблерный/сишный и написан с целью усложнить исследование - тут другой разговор.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
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;
}
очень похоже на исходный код?
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
26.02.2013, 18:37     декомпиляторы С++ #20
Цитата Сообщение от WhiteP Посмотреть сообщение
"Какой-то макрос" в дизассемблере раскроется в ...
да это понятно, просто я не стал писать код вывода строки на экран, т.к. суть примера не в этом.

Цитата Сообщение от WhiteP Посмотреть сообщение
Именно. Если трейсить программный код - можно сформировать представление о том, где данные, а где код.
Это да, но пример был с целью показать, что не всегда "на глаз" можно отличить данные от кода.
Цитата Сообщение от WhiteP Посмотреть сообщение
Ко всему - компиляторы высокоуровневых языков редко проворачивают такие фокусы, что становится сложно определить код/данные.
Я бы даже сказал они такого вообще не делают. Ну может какой-то специфичный компилятор под специфичную платформу может такое сделать (и то с каким-нибудь хитрым ключом компиляции )
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
26.02.2013, 18:38     декомпиляторы С++ #21
Цитата Сообщение от Avazart Посмотреть сообщение
который по мимо ASM кода, еще составляет приблизительный код на языке Си
Hex-Rays прилуда для IDA Pro.
но чаше всего такое дает, что лучше бы не создавал
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
26.02.2013, 18:41     декомпиляторы С++ #22
и даже без защиты восстановить Сишный исходник нереально, оптимизатор постарается
например
ValeryS, да понятно, я знаю это. Декомпилирование != дизассемблирование. Алгоритм восстановить возможно тем не менее. Один к одному исходник - нет.

Вот пример со строкой в коде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
int main()
{
    int a;
    char * str;
    __asm
    {
        mov a, 78
        add eax, 77
        jmp jmphere
lbl: 
        _emit 's'
        _emit 't'
        _emit 'r'
        _emit 0
jmphere:
        lea eax, lbl
        mov str, eax
 
    }
    std::cout<<str;
 
    return 0;
}

Вот листинг IDA как он есть. Правда с PDB символы есть. Но cout оно и так знает.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.text:00401276                 mov     [ebp+a], 4Eh
.text:0040127D                 add     eax, 4Dh
.text:00401280                 jmp     short jmphere
.text:00401282 ; ---------------------------------------------------------------------------
.text:00401282
.text:00401282 lbl:                                    ; DATA XREF: _main:jmphereo
.text:00401282                 jnb     short loc_4012F8
.text:00401284                 jb      short $+2
.text:00401286
.text:00401286 jmphere:                                ; CODE XREF: _main+10j
.text:00401286                 lea     eax, lbl
.text:0040128C                 mov     [ebp+str], eax
.text:0040128F                 mov     edx, [ebp+str]  ; _Val
.text:00401292                 mov     ecx, ds:__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; _Ostr
.text:00401298                 call    ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char const *)
Видно, что хотя IDA задизасмила строку - ссылка указывает, что к данному участку есть обращение как к данным. Так это я вручную строку в код влепил. Часто такое компиляторы вытворяют?
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
26.02.2013, 18:42     декомпиляторы С++ #23
Цитата Сообщение от ValeryS Посмотреть сообщение
и даже без защиты восстановить Сишный исходник нереально
Тот же Касперски не помню в какой книге рассказывал, что именно так исходники Unix попали в Россию.
В каком-то институте группа программистов дизассемблировала Unix и восстановила сишный код, который при компиляции давал один в один ассемблерный код.
Но тогда компиляторы, конечно же, были совершенно другие. С сегодняшним уровнем оптимизации восстановить сишный код наверное реально невозможно, хотя можно постараться, чтоб твой код компилировался в такой же (или очень похожий) ассемблерный код.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
26.02.2013, 18:43     декомпиляторы С++ #24
Цитата Сообщение от WhiteP Посмотреть сообщение
Часто такое компиляторы вытворяют?
очень даже
компиляторы под микроконтроллеры
Kastaneda
Форумчанин
Эксперт С++
4511 / 2853 / 227
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
26.02.2013, 18:46     декомпиляторы С++ #25
Цитата Сообщение от WhiteP Посмотреть сообщение
Часто такое компиляторы вытворяют?
Что? Вставляют данные в секцию кода? Наверное ни один вменяемый компилятор такого делать не будет.

Добавлено через 28 секунд

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
компиляторы под микроконтроллеры
а ну хз, я с такими не знаком)

ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,731
26.02.2013, 18:48     декомпиляторы С++ #26
Цитата Сообщение от WhiteP Посмотреть сообщение
Алгоритм восстановить возможно.
приблизится к нему
например
отличи вот эту структуру
C++
1
2
3
4
5
6
7
struct A
{
int A1;
int A2;
int A3;
int A4;
}
от массива
C++
1
int B[4];
но чаще всего это и не нужно главное логику понять и написать свое
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
26.02.2013, 19:02     декомпиляторы С++ #27
Цитата Сообщение от ValeryS Посмотреть сообщение
отличи вот эту структуру
Ну да, не отличишь. Ибо это одно и то же по сути. По определенным характеристикам все же можно попробовать определить структура это или массив (например, если данные разного типа в структуре и обращаются к ним по разному, соответственно). По обращению с неким указателем можно попытаться понять что это (хотя не всегда возможно).
iifat
2225 / 1378 / 102
Регистрация: 05.06.2011
Сообщений: 3,799
27.02.2013, 02:21     декомпиляторы С++ #28
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вставляют данные в секцию кода? Наверное ни один вменяемый компилятор такого делать не будет
Смутно припоминаю, правда, не помню уж, на каких компах, возможно, ЕС -- параметры складывались сразу за вызовом процедуры, так что адрес возврата на них указывал. Подпрограмма перед возвратом сдвигала адрес.
Yandex
Объявления
27.02.2013, 02:21     декомпиляторы С++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru