Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Dekompilacja C++] Skąd tyle rzutowań?

Ostatnio zmodyfikowano 2017-06-07 21:30
Autor Wiadomość
Kinexity
Temat założony przez niniejszego użytkownika
[Dekompilacja C++] Skąd tyle rzutowań?
» 2017-06-06 22:45:13
Witam wszystkich!
Ostatnio pobrałem dekompilator o nazwie Snowman (https://derevenets.com/ - link dla zainteresowanych) - być może istnieją lepsze i bardziej zaawansowane, ale już mi się nie chciało szukać.
Moje pytanie odnosi się do jednej rzeczy - czemu w zdekompilowanym kodzie programu tak często występuje
reinterpret_cast <>()
?

Zrzut ekranu - https://drive.google.com/file​/d/0BwLxpuSgHpzsd21xbUJaYnhXbUU​/view

Jakby coś to nie należę do tych, którym trzeba tłumaczyć, że nie odzyskam poprzez dekompilator kodu źródłowego.
P-162165
pekfos
» 2017-06-06 23:02:47
W asmie nie ma niejawnych rzutowań, ani typowanych wskaźników.
P-162166
DejaVu
» 2017-06-06 23:48:32
A czy licencja zezwala na dekompilację tej aplikacji?
P-162171
Kinexity
Temat założony przez niniejszego użytkownika
» 2017-06-07 00:22:52
@DejaVu W pewnym sensie zezwala... ponieważ to jest mój program :P
@pefkos Że tak to ujmę - raczej się w tych kwestiach nie znam.
P-162181
Elaine
» 2017-06-07 07:44:34
Disclaimer: ten post nie stanowi porady prawnej.

A czy licencja zezwala na dekompilację tej aplikacji?
To nie ma żadnego znaczenia, zgodnie z ustawą z dnia 4 lutego 1994 r. o prawie autorskim i prawach pokrewnych, jakiekolwiek zapisy w licencji zabraniające dekompilacji są nieważne (art. 76). Warunek jest jedynie taki, by aplikacja była nabyta legalnie, a dekompilacja była dokonywana w celu współdziałania z innymi aplikacjami (art. 75) – pod co można podciągnąć naprawdę wiele rzeczy.
P-162182
jankowalski25
» 2017-06-07 20:59:36
Skąd tyle rzutowań?
To jest cecha specyficzna tego dekompilatora. Widzę nazwy rejestrów, a to oznacza, że sama dekompilacja poszła "tak sobie". Jeśli chcesz to nieco uprościć, to:
1. Sprawdź, czy w wyniku kompilacji tego wszystkiego otrzymujesz coś choć trochę podobnego pod względem binarnym. Jeśli nie, to dekompilator jest za słabo dopasowany do kompilatora.
2. Wyeliminuj powtórzenia. Na screenie widać ich sporo, więc pewnie da się to jakoś uprościć. Nadaj typy zmiennym na podstawie pierwszego użycia i rzutuj tylko, jeśli rzeczywiście typ ulega zmianie.
3. Zapisz wywołania funkcji normalnie, czyli zamiast
flush_basic_ostream_DU_char_traits_D_std_std_QEAAAEAV12_XZ();
 będzie coś w stylu
std::cout.flush();
, ewentualnie
C/C++
std::cout << cokolwiek; //niejawne wywołanie flush()
nie odzyskam poprzez dekompilator kodu źródłowego
Dlaczego nie? Sama dekompilacja jest jak najbardziej możliwa, jednak jakość otrzymanego kodu zależy od tego, na ile nauczysz dekompilator tworzyć taki kod, jaki sam piszesz, na ile dopasujesz go do swojego kompilatora i jego specyficznych cech oraz do jakiego efektu końcowego dążysz. Przy bardziej złożonych programach może to zająć więcej czasu, niż napisanie zamiennika od zera, niemniej jednak to za mało, aby uznać ten proces za niemożliwy (choćby dlatego, że oryginalny kod należy do zbioru rozwiązań, a jeśli dekompilator będzie wystarczająco dobry, to weźmie pod uwagę Twój styl programowania, użyte flagi kompilatora, dostanie słownik z sensownymi nazwami zmiennych i po uwzględnieniu wszystkiego, co tylko się da, wygeneruje odpowiedni kod).

Dopisano:
Widzę, że po lewej stronie na screenie masz instrukcje w asmie. Możesz również sprawdzić, czy na tym etapie wszystko jest w porządku i przepuścić to przez jakiś kompilator asma (a następnie porównać pliki binarne). A jeśli tutaj są problemy, to dość ciekawą techniką jest "dezasemblacja poprzez emulację", czyli uruchamiasz program na jakimś emulatorze jednocześnie zrzucając instrukcje do jakiegoś pliku (uważaj na pętle - najlepiej od razu upraszczać wszelkie powtórzenia, aby nie mieć gigabajtowych plików - ewentualnie stosować jakąś "kompresję w locie" lub użyć formatu dbającego o odpowiedni poziom entropii; przy okazji możesz się dowiedzieć o różnych dziwactwach, chociażby wykorzystywaniu tych samych kodów operacji kilka razy - to też trzeba jakoś uwzględnić podczas dekompilacji).
P-162216
Kinexity
Temat założony przez niniejszego użytkownika
» 2017-06-07 21:30:45
@jankowalski25 dzięki za konkretną odpowiedź. Pytanie, które zadałem było raczej typu "A ciekawi mnie dlaczego..." - ani nie tworzę dekompilatora, ani nie mam problemu z zagubionym kodem źródłowym, a na rozgryzanie procesu dekompilacji też trochę dla mnie za wcześnie.
P-162218
« 1 »
  Strona 1 z 1