• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Co to jest dekompilator?

Object Storage Arubacloud
0 głosów
656 wizyt
pytanie zadane 20 grudnia 2020 w C i C++ przez Code_ Użytkownik (520 p.)
Mam kilka pytań:

1.Czym jest dekompilator ()
2.Czy jest możliwe dostać się do kodu pliku wykonywalnego?
3. Jeżeli odpowiedź na drugie pytanie to tak, to dlaczego jeszcze nikt nie wydobył kodu źródłowego Windowsa czy jakiejś popularnej gry komputerowej np. GTA, czy CS

Z góry dziękuję za odpowiedź.

3 odpowiedzi

+1 głos
odpowiedź 21 grudnia 2020 przez profesorek96 Szeryf (91,420 p.)
wybrane 21 grudnia 2020 przez Code_
 
Najlepsza

Twoje pytanie nie jest trywialne. Zacznijmy od tego że komputery pracują w oparciu o język zrozumiały dla nich. Językiem tym jest język maszynowy składający się z liczb. Dla człowieka zapis poleceń jako liczb nie jest zbyt czytelny dlatego powstał język Asembler zamiast liczb oznaczających instrukcję procesora zawiera napis. Język asembler to język bardzo bliski temu co robi procesor. Pierwsze komputery właśnie programowało się w tym języku. Niestety napisanie bardziej skomplikowanych programów było bardzo trudne i czasochłonne. Jak to mówią potrzeba matką wynalazków. Wymyślono aby stworzyć język bardziej zbliżony do języka naturalnego ludzi. Następnie stworzono program który tłumaczył by ciąg instrukcji na kod maszynowy. Taki program nosi nazwę kompilator. Pierwsze kompilatory tłumaczyły jeden do jedne kod napisany w językach wyższego poziomu na kod maszynowy. Tłumaczenie to nie było zbyt optymalne, na pewno wybitny programista asemblera napisał by taki program lepiej, bardziej optymalnie. Jednak nie było to aż tak złe, przyspieszało pracę nad twożenia oprogramowania że można było to pominąć. Oczywiście twórcy kompilatorów nie próżnują, obecnie kompilatory wykonują magię. Posiadają możliwość różnych ustawień pozwalających na optymalizację. W tym miejscu pragnę zauważyć że skoro kompilatory robią różne sztuczki to kod maszynowy powstały na podstawie kodu języka C czy C++ może się różnić od tego co programista napisał w kodzie źródłowym. Nie jest to tłumaczone jeden do jedne. Owszem działanie jest takie jak zaprogramował programista w C jednak sposób realizacji jest troszkę inny. Przykładowo w języku asembler nie ma czegoś takiego jak pętla, każda pętla zamieniana jest na instrukcje skoku.

Oczywiście że są na rynku dostępne programy które umożliwiają dekompilację. Takie programy to np. IDA, Ghidra, Binary Ninja, Radare2.  Jednak programy te nie potrafią z plik wykonywalnego odtworzyć idealnie wyglądający kod źródłowy.

Na przykład ty jako programista stworzyłeś program w którym alokujesz pamięć dynamicznie, napisałeś takie coś:

int *t=malloc(5*sizeof(int));

Odwracając plik wykonywalny dekompilator mógłby zwrócić takie coś:

void *t=malloc(5*sizeof(int));

Kod zwrócony przez dekompilaotr jest inny, ciężko się połapać co jest co. Analiza kodu jest utrudniony. Dodam że istnieją specjalne techniki zaciemniające, pozwalające znacznie utrudnić reverse engineering. Tak właśnie nareszcie padło to słowo :)

Ta technika to nic innego jak Reverse engineering czyli po Polsku Inżynieria Odwrotna. Sztuka badania przedmiotów już powstałych (nie tylko programów) tak aby na podstawie gotowego produktu odtworzyć sposób jego działania, jego stworzenia.

Takie wydobywanie nie jest legalne, większość licencji tego zabrania. Jednak mimo to ludzie robią to do czego nie zachęcam. Myślisz jak powstają Craki, generatory kluczy. Ktoś musiał poznać jak działa zabezpieczenie producenta by móc stworzyć jego obejście. Oczywiście jest to nielegalne.

Reverse engineering to nie tylko brudna robota, firmy antywirusowe używają deasamblerów, aby dowiedzieć się jak dany złośliwy program działa.

Pragnę jeszcze zaznaczyć że to co opisałem nie ima się języków takich jak Java czy C#. Języki te są kompilowane do tak zwanego byte code, nie do pliku binarnego. Byte code jesteśmy w stanie odwrócić prawie jeden do jeden tak jak programista to napisał. Oczywiście i tutaj istnieją specjalna narzędzia zaciemniające kod tak by techniki inżynierii wstecznej były utrudnione.

+1 głos
odpowiedź 20 grudnia 2020 przez Tomek Sochacki Ekspert (227,510 p.)
edycja 20 grudnia 2020 przez Tomek Sochacki
ad 1. https://pl.wikipedia.org/wiki/Dekompilator

ad 2. no to właśnie pytasz chyba o to samo co w pkt. 1 (aczkolwiek niech się wypowiedzą tu mądrzejsi ode mnie, nie jestem specjalistą w tym zakresie)

ad 3. A po co? Po pierwsze to dekompilacja nie stworzy Ci kodu czytelnego na tyle, aby można to uznać za wersję "oryginalna", która umożliwia w miarę łatwy development. A po drugie to nawet jeśli udało by Ci się na podstawie takiego kodu zrobić coś z tą apką to i tak nie wydasz jej pod swoim nazwiskiem bo dopadnie Cię prawo plagiatu itp. itd. I druga sprawa, nie jesteś w stanie w pojedynkę, czy małym zespołem zrobić nowego windowsa, GTA itp. Do tego potrzebny jest duży team, a nikt zakładając poważną firmę nie będzie się pchał w takie plagiaty bo nic na tym nie zyska, lepiej iść we własny produkt i zrobić go porządnie. A jak chcesz się pobawić otwartym kodem systemu to masz kod linuxa, ale wątpię abyś bez większej wiedzy i doświadczenia w programowaniu był w stanie coś sensownego z takim kodem zrobić, to nie takie proste jak pokazują w filmach hakerskich :)
+1 głos
odpowiedź 20 grudnia 2020 przez wizarddos Nałogowiec (25,930 p.)
1.dekompilator to program który przeprowadza dekompilację. Czyli odwrotność kompilacji

2.plik wykonywalny to zbiór 0 i 1 więc jest to dość trudne i chyba nie możliwe

3.co do gier to pewnie dla tego że ich większość nie jest jako exe na kompie tylko jak skróty internetowe. A kod wydobyć to wydobywali. I to wiele razy. Nie słyszałeś o akcji z XP?
1
komentarz 20 grudnia 2020 przez Wiciorny Ekspert (270,170 p.)

co do pkt 2. nie koniecznie 0/1 bo plik wykonywalny dla VJM wygląda tak :)
 

 0:   iconst_2
 1:   istore_1
 2:   iload_1
 3:   sipush  1000
 6:   if_icmpge       44
 9:   iconst_2
 10:  istore_2
 11:  iload_2
 12:  iload_1
 13:  if_icmpge       31
 16:  iload_1
 17:  iload_2
 18:  irem
 19:  ifne    25
 22:  goto    38
 25:  iinc    2, 1
 28:  goto    11
 31:  getstatic       #84; //Field java/lang/System.out:Ljava/io/PrintStream;
 34:  iload_1
 35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
 38:  iinc    1, 1
 41:  goto    2
 44:  return

 

Podobne pytania

0 głosów
1 odpowiedź 391 wizyt
pytanie zadane 23 września 2021 w HTML i CSS przez KFC Użytkownik (610 p.)
0 głosów
1 odpowiedź 2,675 wizyt
pytanie zadane 31 grudnia 2017 w C i C++ przez ciamciam Początkujący (350 p.)
0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez Ebay_05 Początkujący (400 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...