Napisz prosty program, który sam się kopiuje po uruchomieniu.
Twój program powinien być jakimś plikiem wykonywalnym w systemie Windows, Linux itp., Powinien wygenerować nowy plik wykonywalny, który jest identyczny z oryginalnym plikiem wykonywalnym, z losową nazwą i zakończony.
Twój program nie powinien obejmować żadnego odczytu lub kopiowania plików. Dozwolone jest tylko zapisywanie plików w celu wygenerowania nowego pliku wykonywalnego.
(PS. Byłem bardzo zawstydzony, gdy w Wikipedii Self-replicating program
przekierowałem do Computer virus
artykułu ...: / ...)
Wygrywa najmniejszy plik wykonywalny. Twoja odpowiedź może być kodem programistycznym z odpowiednim systemem operacyjnym i kompilatorem, kodem zestawu lub zrzutem HEX pliku wykonywalnego.
Odpowiedzi:
Bash, 236
Dłużej niż to absolutnie konieczne, ale nienawidzę długich linii. Końcowy znak nowej linii nie jest opcjonalny.
źródło
Zestaw dla systemu Linux x86, 106 bajtów
To jest dla asemblera nasm. Zbuduj plik binarny za pomocą wiersza polecenia:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Oto ten sam plik co zrzut heksowy:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 62 2E 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 62 2E 6F 75 74 00 6A 00 00 00 6A 00 00 00 05 00 00 00 00 10 00 00 B0 05 BB 36 00 62 2E B1 41 66 BA B6 01 CD 80 8D 51 29 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Zgodnie z żądaniem program kopiuje się do osobnego pliku. (Program mógłby być znacznie krótszy, gdyby pozwolono mu po prostu pisać na standardowe wyjście i pozwolić użytkownikowi na przekierowanie do pliku).
Unikałem używania jakichkolwiek sztuczek na granicy, aby zmniejszyć rozmiar. Powinien to być w pełni zgodny 32-bitowy plik binarny ELF.
Edytowano, aby dodać : W powyższej wersji utworzony plik jest zwykłym plikiem, ale przychodzi mi do głowy, że za kilka bajtów (i mały zakręt reguł) możesz stworzyć coś bardziej interesującego. Ta wersja jest tylko dwa bajty dłuższa i ma 108 bajtów:
Nazwij tę wersję
asr
dla „samoreplikatora”:nasm -f bin -o asr asr.asm && chmod +x asr
Wersja zrzutu szesnastkowego dla osób z upośledzeniem nasm:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 01 00 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 01 00 61 73 72 00 6C 00 00 00 6C 00 00 00 07 00 00 00 00 10 00 00 B0 05 BB 38 00 01 00 FE 03 B1 41 66 BA FF 01 CD 80 8D 51 2B 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Po uruchomieniu tworzy prawie identyczny plik o nazwie
bsr
, ale taki, który sam jest wykonywalny. Uruchomienie go spowoduje utworzenie kolejnego pliku binarnego o nazwiecsr
. I tak dalej.(Zauważ, że irytujące rzeczy zaczynają się później
zsr
. Zastanawiałem się nad stworzeniem wersji, która kaskadowo zmieniałaby nazwy naatr
itd., Ale myślę, że większość ludzi wcześniej się nudzi, więc prawdopodobnie nie jest to warte wszystkich dodatkowych bajtów. )źródło
Oto proof-of-concept (niemodyfikowany), który pokazuje, w jaki sposób można korzystać z usług kompilacji w .NET do kompilacji kodu źródłowego w locie w celu wygenerowania identycznego wyniku. Pierwsza kopia nie jest identyczna z oryginałem, ale kolejne kopie z kolejnych uruchomień są dokładnie identyczne z losowymi nazwami plików:
Dane wyjściowe demonstracji w wierszu polecenia:
źródło
Partia
Wersja 1 (30 bajtów)
Wygrałem! :)
źródło
Plik COM systemu DOS - 50 bajtów
Tworzy plik, w
X.COM
którymX
jest zastępowany cyfrą one aktualnego czasu. Pliki COM są po prostu ładowane do pamięci z przesunięciem100h
segmentu danych (CS i DS są ustawione tak samo), dzięki czemu możemy po prostu zapisać tę pamięć do pliku.źródło nasm
źródło
Plik DOS .COM, 29 bajtów
„@” Jest losowo zastępowane nieparzystą literą w pierwszej połowie + część alfabetu (A, C, E, G itp.). Pliki wyjściowe mają 255 lub 256 bajtów. Początkowe rejestry w rzeczywistym DOS (w przeciwieństwie do debuggera) to AX = 0000, CX = 00FF, SI = 0100.
źródło
Plik COM DOS - 36 bajtów
Nazwa pliku wyjściowego jest określona w wierszu polecenia, obcięta do formatu 8.3, spacje OK (spacje w nazwach plików DOS są dozwolone). Testowane przy użyciu wiersza polecenia WinXP.
źródło