Tworzenie własnego kompilatora

Tworzenie własnego kompilatora

Wątek przeniesiony 2021-12-20 23:29 z Delphi i Pascal przez flowCRANE.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5555
1
pieczarek napisał(a):

Obecnie wykorzystuje się generatory parserów, które na podstawie definicji, generują kod parsera. Popularne to Yacc,/BISON czy lex/flex dla języka C.

Idris, PureScript, Elm czy Husk Scheme nie korzystają z generatorów parserów. Ale jak wiadomo programiści Haskella są dziwie i wszystko wolą pisać sami :P

Robert Karpiński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 133
0

@Mariusz Bruniewski:

Mariusz Bruniewski napisał(a):

Wymyśliłem coś jeszcze łatwiejszego. Na spokojnie.:-) bez kompilacji exe.

No to prosimy o podzielenie się tym pomysłem !!

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5227
3

@pieczarek:

Na pewno to nie jest czas stracony - ale uczyć się pisać kompilatory to nie pomoże w dobrym nauczeniu się programowania w danym języku... bo to jest specyficzny problem. Jak najbardziej polecam naukę Javy oraz czystej architektury jak pisać duże systemu oparte na mikroserwisach, wydzielanie warstw dostępu do danych, providerów, testy jednostkowe, modularność etc

Wiesz, niekoniecznie.

Zaletą tego typu projektu jest na pewno to, że jest on "pure", jesteś tylko Ty, input.txt z kodem i np. AST wydrukowane na konsolce czy tez LLVM IR wyemitowany. Żadnego GUI, przycisków, WebAPI, frameworków jsowych, bazek danych, dockerów, rabbitów, redisów i JWT.

Uważam że projekt kompilatora bardzo dobrze sprawdza wiedzę z OOP oraz modelowania, bo zazwyczaj trzeba żonglować jakimiś danymi pomiędzy "oddalonymi kawałkami" logiki i trzeba to jakoś sensownie zrobić aby uniknąć jakichś haków, ifków, wielu pustych property i innych obejść.

Trzeba mocno przemyśleć oraz sensownie zaimplementować całą hierarchię Nodów aby nie tylko miało to sens, ale dało się z tym pracować, a nie że nagle chcesz emitować IR i brakuje ci 10 informacji. A następnie jak userzy będą z tego korzystać? jakie API im wystawisz? to są zagadnienia które są w każdym innym sofcie.

Naprawdę polecam tego typu projekt jeżeli ktoś chce się zmierzyć z modelowaniem, niestety jest to czasochłonne.

Nie mówię też jako tylko programista, ale i przedsiębiorca. Szlag mnie trafia jak ktoś wymyśla koło od nowa.

No chyba że na ta konkretna rzecz jest corem twojego businessu, to wtedy wypadałoby mieć nad nią pełną kontrole :P

Mariusz Bruniewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Świecie
0

A teraz mam do Was pytanie. Jest exe i plik dll. Czy kod w dll może być i w pliku txt? A może.:-) Mało tego dll musisz kompilować plik txt zmieniasz w notatniku :-) To już stworzyłem. Mogę zmieniać kod pseudo pliku dll w notatniku. Nie skompresowany lecz w pliku pas. To jest dopiero radość dokonać takiego czegoś.

Robert Karpiński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 133
3
Mariusz Bruniewski napisał(a):

A teraz mam do Was pytanie. Jest exe i plik dll. Czy kod w dll może być i w pliku txt? A może.:-) Mało tego dll musisz kompilować plik txt zmieniasz w notatniku :-) To już stworzyłem. Mogę zmieniać kod pseudo pliku dll w notatniku. Nie skompresowany lecz w pliku pas.

Ja najmocniej przepraszam, ale ja nic z tego nie rozumiem. Ponawiam prośbę o jakąś krótką listę oczekiwanej funkcjonalności. Co to ma robić ! Po co ten dll ? Po co ten plik txt ?
Ja rozumiem, że jest to najfajniejszy etap w projektowaniu, bo pomysły buzują w głowie jak fajerwerki ... Ale jak mamy się tylko temu przyglądać - to ok. Ale po co zatem te pytania na forum ?

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1

No to wychodzi że napisałeś interpreter a nie kompilator. Chcesz z delphi zrobić język skryptowy?
Już ktoś takie coś zrobił https://www.delphitools.info/dwscript/

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 256
1

On pisze chyba o dynamicznym budowaniu asembly... No to jest wielka dziura to ataku RCE... DLL zawsze jest kompilowany i ma określoną strukturę - patrz na dokumentację od MS. Plik pas to plik pas a nie pseudo dll...

Robert Karpiński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 133
0
obscurity napisał(a):

No to wychodzi że napisałeś interpreter a nie kompilator. Chcesz z delphi zrobić język skryptowy?

Już ktoś takie coś zrobił https://www.delphitools.info/dwscript/

pieczarek napisał(a):

On pisze chyba o dynamicznym budowaniu asembly... No to jest wielka dziura to ataku RCE... DLL zawsze jest kompilowany i ma określoną strukturę - patrz na dokumentację od MS. Plik pas to plik pas a nie pseudo dll...

Oj coś mi się wydaje, że nastąpił nieoczekiwany zwrot akcji :) Od kompilatora do .... no właśnie do czego ????

Mariusz Bruniewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Świecie
0

Dll może być i w notatniku pisany i podłączony do pliku exe. Wielu osób pisało,że kompilator tylko kompiluje ale jest jeszcze jedno on deszyfruje aby kodu z pliku pas nieodzyskac. Nie wiem czy stosują XOR. To nie jest zwykła kompilacjaplikow dcu.

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 256
0

Nie. W notatniku nie zrobisz dll. To dużo się nie różni od exe. Nie nie jest to szyfrowane. Zwykle dll można odczytać - inaczej jak CPU i system wykonuje dll? Skąd bierze klucz do deszyfrowania? Zagladnij do linków i dokumentacji developera windows a nie zmyślasz.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
5
Mariusz Bruniewski napisał(a):

Wielu osób pisało,że kompilator tylko kompiluje ale jest jeszcze jedno on deszyfruje aby kodu z pliku pas nieodzyskac. Nie wiem czy stosują XOR.

Tak, kompilator szyfruje pliki pas xorem, dzięki temu nie da się odzyskać kodu z powrotem. Tylko to robi

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
2

Zawartość pliku wykonywalnego (i wielu innych) może być obfuskowana, szyfrowana czy kompresowana. Pewne rzeczy może zrobić sam kompilator w trakcie procesu kompilacji, a inne rzeczy mogą robić zewnętrzne narzędzia, takie jak choćby UPX czy PELock (pozdrowienia dla autora).

Mariusz Bruniewski napisał(a):

Dll może być i w notatniku pisany i podłączony do pliku exe.

Ciekawe jak w notatniku wklepiesz znaki kontrolne. Tak więc co najwyżej w hex-edytorze, ale i tak powodzenia.

Wielu osób pisało,że kompilator tylko kompiluje ale jest jeszcze jedno on deszyfruje aby kodu z pliku pas nieodzyskac.

Kod źródłowy w Pascalu i skompilowany do kodu maszynowego jest niemożliwy do odtworzenia z powrotem. Są narzędzia pozwalające na dezasemblację i odtworzenie kodu w języku wysokiego poziomu (zarówno z maszynowego, jak i pośredniego), ale to jest dalekie od stanu sprzed kompilacji. Tyle że to jest normalne zachowanie, taka jest natura kompilacji — nie jakaś magia kompilatora.

Mariusz Bruniewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Świecie
0

Nie piszemy o kompresji plików exe typu programami upx. Mogę Tobie napisać program w d7 nawet skompresowany upx gdzie żadnym programem najwyższej półki nie zdeszyfrujesz go. Do normalnej postaci exe jak to robi program PCExplorer. Nawet gdy zdeszyfrujesz pozostaje procedura pliku kontrolnego sumy kontrolnej CRC i inne zabezpieczenia więc o czym Ty do mnie piszesz. Sam dokonuje zabezpieczeń programów.

Nawet, gdy zdecydujesz się zastosować upx do exe czy Twojego dll i usuniesz z tych plików UPX O i UPX 1 To programy i tak wyszukana że program był skompresowany metoda UPX.

MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
1
Mariusz Bruniewski napisał(a):

Nie piszemy o kompresji plików exe typu programami upx. Mogę Tobie napisać program w d7 nawet skompresowany upx gdzie żadnym programem najwyższej półki nie zdeszyfrujesz go.

Czyżby? Jak w takim razie CPU wykonuje rozkazy procesora zawarte w tym plik exe? Jak coś jest wykonywane na CPU, to musi być wcześniej odszyfrowane. Żaden problem ustawić pułapkę, zatrzymać wykonywanie programu i zapisać odszyfrowany plik. Nie zawsze jest to trywialne, ale da się zrobić. Ba, są do tego nawet dedykowane narzędzia.

Mariusz Bruniewski napisał(a):

Nawet gdy zdeszyfrujesz pozostaje procedura pliku kontrolnego sumy kontrolnej CRC i inne zabezpieczenia więc o czym Ty do mnie piszesz. Sam dokonuje zabezpieczeń programów.

To się zdecyduj, czy zdeszyfruję, czy nie? Poza tym jak mam odszyfrowany plik to mogę sobie podmienić procedurę porównującą wyliczone CRC oryginalnym CRC. Ewentualnie podmienić CRC na te po zmianie exe'ca. Co więcej CRC jest na tyle proste i dawno złamane, że zmiana kilku bajtów w całym pliku exe pozwoli na dokonanie kolizji i CRC nawet po dużej zmianie exe'ca będzie takie samo. To świadczy, że piszesz o rzeczach o jakich nie masz pojęcia. CRC do takich celów jest już dawno skompromitowane i wykazano cały szereg ataków pozwalających robić różne fajne rzeczy.

Co więcej posługiwanie się CRC albo czymś innym (wiesz czym?) na zasadzie if'a jest naiwne. Takie zabezpieczenie to nie zabezpieczenie. Co innego jak wyliczoną wartość byś wykorzystywał dalej w jakichś obliczeniach/deszyfrowaniu pewnych struktur danych, najlepiej dynamicznie zmieniających się z każdym uruchomieniem programu. Wtedy to może by i miało sens. Na razie Twoje pisanie pokazuje jak bardzo nie masz pojęcia o tym o czym piszesz.

Mariusz Bruniewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Świecie
0

Upx kompresja działa inaczej wielu ludzi zastanawiało się czy co może uzyskać ta kompresja? Czy cieszyć się z tego, że ma mały plik wykonywalny czy? No właśnie to czy dotyczy,że Windows po dwóch wpisach w pliku exe to UPX O i UPX 1 odwołuje się do pamięci w ten sposób,że exe jest rozpakowywany w pamięci RAM komputera. Czy jest to szybsze? Od dużego exe. Moim zdaniem tak.

MY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1107
2

Odpowiem tu, bo nie chce mi się pisać w komentarzu. Czytelniej będzie jako post.

@Mariusz Bruniewski kolejny raz pokazujesz, że coś tam słyszałeś. Jednak nie do końca wiesz w którym kościele dzwoni. To nie Windows po wpisach UPX w pliku odwołuje się inaczej do pamięci. Ale taki program zachowuje się zupełnie inaczej. Na początku pliku exe jest mały procedura startowa (i to ją uruchamia Windows), która nie jest zaszyfrowana, po to aby Windows mógł wystartować taki plik bez problemów. Następnie ta procedura wypakowuje z zasobów pliku exe właściwy program do pamięci i go uruchamia. To oczywiście tak z grubsza. Ale sam Windows nic nie wie o czymkolwiek i jakimkolwiek pakowaniu plików wykonywalnych.

Robert Karpiński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 133
0

A tak z ciekawości zapytam, bo i tak skaczemy po tematach jak żabki ...
Ktoś z Was jeszcze z UPX i podobnych korzysta ? Ja kiedyś korzystałem, ale w sumie to nawet nie wiem teraz po co. Może jakaś moda była ...

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Dawno temu miało to sens. Później, gdy przestało mieć sens, ludzie nadal go używali. Teraz, kiedy nie ma to absolutnie żadnego sensu, ludzie nadal go używają. Zapytałem dlaczego i za każdym razem jest ta sama odpowiedź — „bo lubię mieć małe pliki wykonywalne”.

A później jeden z drugim jęczy, że jakieś AV się czepiają, bo ich heurystyka wykrywa potencjalne zagrożenie i atakuje użytkowników ostrzeżeniami. I problemem nie jest to, że sami sobie taki los zgotowali, a to, że całą winę jak zwykle zwalają na „niedorobione antywirusy”.

Mariusz Bruniewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Świecie
0

Posłuchaj co psychologia stanowi o tym co piszesz? Ja przedstawiłem coś raz. Ty cały czas próbujesz wałkować o wiele razy niż ja. Zatem, żyjesz ludźmi sprawami. Szkoda bo masz własne życie...

Mariusz Bruniewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Świecie
0

Nadal mówicie, że błądzę a na programach ludzi błądzących zarabiacie. Gdzie tu logika, a może zazdrość?

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9024
1

Nadal mówicie, że błądzę

Chyba pomyliłeś słowa. Nie błądzę ale bredzę.

@furious programming - nie chcę za bardzo grzebać/rządzić się w Twojej kategorii, ale nie uważasz, że czas zakończyć tą nierówną walkę i przenieść całość do Perełki? Raczej nikt już tutaj niczego mądrego nie napisze.

Robert Karpiński
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 133
1
Mariusz Bruniewski napisał(a):

Nadal mówicie, że błądzę a na programach ludzi błądzących zarabiacie

Ja nie wiem, czy błądzisz - bo nigdy nie określiłeś co dokładnie zamierzasz zrobić.
Na razie traktuję ten wątek jako mocno rozrywkowy :0

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.