Завдання: Напишіть фрагмент коду, який закриває себе [закрито]


39

Я шукаю (чи не так?) Фрагмент коду, який негайно закривається - абсолютно нетрадиційним чином.

Це не означає: System.exit((int) 'A');(Java).

Це може означати:

#!/usr/bin/env python3
# NOTE: This kills ALL RUNNING Python processes. Be careful!
def exit():
    import os
    os.system("killall python3")
    # Windows addon
    os.system("taskkill /im python.exe /f")
exit()

Перемога у найбільш вигідній відповіді! Всі мови, всі архітектури.

Редагувати: Відмова від метання винятків більше не буде прийнята!


3
Але це нетрадиційно для завершення виконання ... Ну, це альтернатива exit(), але все ж це реалізована функція ...
s3lph

13
Це не тролінг коду - ми знаємо, що хочемо дивних відповідей від цього.
Ліам Доусон

6
Чи працює вимкнення системи?
Hosch250

8
Я одного разу випадково викликав мережеву карту до DMA через операційну систему. Коли це сталося, ви негайно повернулися до BIOS, перезавантажившись.
Бен Джексон

3
Я відчуваю, що Шеннон нас тут побив;)
яскрава зірка

Відповіді:


44

баш, 6 символів

exec [

execзамінює поточний процес чимось іншим. [це найкоротша команда, яку я міг би знайти, це нешкідливо (це псевдонім для test)


Інший виняток?
Йоганнес Кун

Ні, просто exec«ІНГ в [команду :)
Dennis Kaarsemaker

1
чому це працює? що робить [робить?
s3lph

@the_Seppi він замінює поточний процес на [(він же тест)
Timtech

~ $ echo $PATH/?-> /bin/X /bin/[ /bin/w. Рибна шкаралупа дала мені ще дві команди. wцікава на мій погляд.
Конрад Боровський

46

Баш

echo "Turn off your computer or i'll wipe your harddrive..."
echo 3;sleep 1
echo 2;sleep 1
echo 1;sleep 1
dd if=/dev/random of=/dev/hda

Припиняє програму так само швидко, як користувач може реагувати ;-)


10
Оголошення, тому що це змусило мене сміятися.
Майкл Стерн

5
Краще не запускайте його на Linux.
kenorb

1
dd: / dev / hda: не знайдено
Джошуа

39

Червоний код

(Передісторія: Redcode - мова псевдоскладань, яка використовується у грі програмування Core War, запровадженій А. К. Дьюдней у 1984 р. Зазвичай вона широко використовує самомодифікуючий код. Я написав чудовий невеликий підручник з програмування Redcode зовсім кілька років тому. )

MOV 1, 0

Ця одноінструкційна програма не тільки вбиває себе, але й витирає власний програмний код із пам’яті, не залишаючи жодного сліду в пам’яті.

Нудно, кажете? Зрештою, програма вище за все б загинула, навіть якби вона не переписала свій код. Гаразд, ось такий, який витирає все ядро чистою, перш ніж остаточно витерти себе і померти:

loop: MOV  ptr+1, >ptr 
      JMN  loop, loop
      SPL  1
      SPL  1
      MOV  ptr+1, >ptr
ptr:  DAT  0, 1

Перші дві інструкції насправді виконують більшу частину роботи: це просто простий цикл копіювання / стрибка, який DAT 0, 0після закінчення програми копіює порожню комірку інструкцій (яка ініціалізується ) у кожну наступну клітинку (використовуючи режим непрямого адресації після посилення). >), поки вказівник нарешті не завернеться до початку пам'яті і не перезапише MOVсам цикл. Як тільки це станеться, JMN(JuMp, якщо не нульовий) виявляє його і провалюється.

Проблема полягає в тому, що це все ще залишає JMNсебе бездоганним. Щоб позбутися від цього, нам потрібен інший, MOVщоб витерти JMN..., але це означає, що нам потрібно ще одне, MOVщоб витерти це MOV тощо. Щоб вся програма зникала безслідно, нам треба якось домовитись про одну MOVінструкцію, щоб стерти як себе, так і хоча б одну іншу інструкцію.

Ось тут і SPLприходить - це одна з найдивніших опкодів Redcode. В основному, це інструкція "Відділити обидва шляхи". Ви бачите, що замість простого реєстру програмного лічильника програми, як і у будь-якого звичайного процесора, у VM Redcode є "черга процесів": циклічний список покажчиків на інструкції, які потрібно виконати. Зазвичай на кожному циклі вказівник інструкції зміщується з голови черги, інструкція виконується і наступна інструкція (якщо не було стрибка або незаконної інструкції) висувається на хвіст черги. Але SPLвикликає як наступну інструкцію, так і задану цільову інструкцію (яка, у випадку SPL 1, також є наступною інструкцією), буде висунуто на чергу.

Підсумок всього цього полягає в тому, що після виконання двох SPL 1вказівок у черзі зараз є чотири процеси, всі про виконання останнього MOV. Цього достатньо лише для того, щоб витерти JMNі SPLs, і MOVсаму, і він також залишає ptrкомірку інструкції як DAT 0, 0- невідрізну від порожнього ядра, що оточує її.

(Крім того, ми могли б замінити ptrінструкцію на MOV 1, 1, яка була б перетворена MOV 1, 0в попередні інструкції, і так би стерла себе, як і перша програма вище).

Пс. Якщо ви хочете перевірити цю програму, завантажте симулятор Redcode (він же MARS). Я б рекомендував або CoreWin, або шановний pMARS , хоча є і кілька інших хороших симуляторів.


Не буде це просто кинути порушення доступу?
Денні Варод

12
Порушення доступу? Яка дивна річ це? (Серйозно, Redcode працює в досить абстрактному VM. Вся адресація відносна, адресний простір є суміжним (і циклічним), і кожна адреса є дійсною.)
Ilmari Karonen

Чи MOV 1, 0 копіює 1 на адресу 0 чи навпаки? У всіх мовах асемблера я знаю, що адреса 0 незаконна (NULL-адреса).
Danny Varod

4
Синтаксис є MOV source, dest. Але, як я вже сказав, усі адреси в Redcode відносні, тому адреса 0насправді означає "адресу цієї інструкції", тоді як адреса 1насправді означає "адресу цієї інструкції + 1". (І абсолютний адреса 0 не в якому разі особливого в Redcode так чи інакше, справді, один цікавий наслідок з «все відносно рішення» дизайн є те , що насправді це неможливо для програми Redcode , щоб знайти свій власний абсолютний адреса в ядрі! )
Ільмарі Каронен

2
Людина, я тобі так вдячний. Я ніколи не чув про Основну війну.
seequ

32

С

#include <conio.h>  /* Computer-Operated Nuclear Installation Options */
int main () {
    clrscr();       /* Commence Launch (Remote Systems Console Request) */
    kbhit();        /* Keep Busy until hit */
}

Зауважте, що це не портативний код. Він працює з ZOG C на ART DS9000 . Я вважаю, що використання нетрадиційного озброєння кваліфікує цей код для цього виклику. Якщо ви стурбовані тим, що затримка, яка потрібна для того, щоб цей фрагмент коду доставити свою корисну навантаження, не кваліфікується як негайно , зверніться до нас за порадою щодо попереджувальних ударів.

effect of launch

На моїй домашній машині він навіть не компілюється - у мене немає правильних драйверів та бібліотек. Я чув, що є популярні C-програми, де ця програма збирається і працює на менш ефектні ефекти, але мені ніколи не вистачало сил.


2
Найкраща відповідь, руки вниз!
Вектор

3
+1. (0) 1; спочатку я подумав, що @Gilles тролінг тут ... але потім я перевірив веб-сторінку ART Inc. ... і саме тоді я зрозумів, наскільки сильно мене тренують!
vaxquis


28

C #

Вбиває себе, вбиваючи кожен процес, крім самого себе.

foreach (Process p in Process.GetProcesses()) {
    string myexe = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
    if (p.ProcessName == myexe) continue;
    p.Kill();
}

Щоб приправити його трохи, ми могли б PInvoke TerminateProcessзамість цього використовуватиProcess.Kill


4
+1 за дуже нетрадиційний метод вбивства кожної іншої речі, тим самим змушуючи вашу власну програму згортати систему (або, принаймні, я припускаю, що це ідея?). У мене немає роботи на C # на цій машині, але я повинен запитати ... Насправді, чи закінчується це зведення системи або просто всі запущені процеси? (Я думав, що програми C # посилаються на самого перекладача, таким чином, не покладаючись на існування певного процесу JIT / CIL ...). Знову ж таки, чудова робота, що думає "поза межами" (har har) на цьому :)
Прорив

4
-1 (якби у мене була відповідь): мета-код тролінгу говорить, що деструктивні відповіді не допускаються через ризик людей спробувати їх на власних машинах. Дивіться другу позначку
Кевін - Моніку

Системні процеси не можуть бути вбиті без прав адміністратора, чи не так?
Sarge Borsch

3
@Kevin код-виклик і код-тролінг це різні теги з різними правилами.
osvein

3
@ user1981338: у запитанні спочатку був тег кодування, але він з цього часу відредагований. Тепер, коли тег минув, +1.
Кевін - Відновіть Моніку

21

БАШ - 12 символів

:(){ :|:&};:

Класичний форкбомб. Блокує комп'ютер і змушує користувача (або адміністратора) перезавантажуватися.


5
Нудно - але все ж мій особистий фаворит. Я використовую це для відключення живих систем
s3lph

3
Вона починається сама стільки разів, скільки не може, це не йде.
marinus

1
Але він запустить якомога більше процесів, поки комп'ютер не вийде з ладу і тому
вийде

14
+1 для додавання посмішок, таких як :()і:|
ProgramFOX

1
@Kartik: Без першого місця ви отримаєте синтаксичну помилку. Ви можете усунути другий.
Денніс

20

Python (на старих ноутбуках)

На старих ноутбуках з одноядерними процесорами та поганим охолодженням:

while True:
    print("CPU Temperature rising")

Коли ноутбук вибухне (або просто вимкнеться) через кілька годин, програма не запуститься.

(Для найкращих результатів загорніть ноутбук у ковдру чи щось таке)



18

Apple 2 Basic

1 PRINT "HELLO"
2 POKE 2053,128
3 POKE 2054,58
4 GOTO 1

Він перезаписує одну із своїх інструкцій на END.


Як це працює?
Йоганнес

5
@Johannes: в Applesoft BASIC програма зберігається в токенізованій формі в пам'яті. Оскільки немає захисту від операційної системи чи пам'яті, вона завжди зберігається в одному і тому ж місці і нічого не може перешкодити вам записатись у цю пам'ять. Отже, перший POKEпише ENDмаркер над PRINTмаркером, а потім другий POKEпише термінатор команди над першим ". Коли GOTOвиконується, воно закінчується, ENDа PRINTпрограма закінчується.
marinus

14

У зборі щось подібне, мабуть, спрацює:

jmp 0

Я пам'ятаю, що компіляція цього фактично працювала DOS. Тоді він перезавантажив комп'ютер.


спробувати рет; Насправді я збираюся розмістити це як відповідь: Р
Жульєн Лебот

retf запрацює, я вже це відповідав :) Це вбиває це через те, як працює сегментація пам'яті (або не працює, я повинен сказати) на сучасних операційних системах
chbaker0

"Jmp 0" працює з DOS, тому що першими двома байтами кодового сегмента був CD 20, або "INT 20", що є кодом для програми виходу. »Натиснути 0; ret «мав би такий же ефект.
Даніель

13

PHP

function quit(){unlink(__FILE__);posix_kill(getmypid(),15);}

Ефекти:
Видаляє ваш банальний файл сценарію, а потім вбиває вашу програму.
Киньте одного з цих поганих хлопців у якусь кодову базу, щоб заплутати людей.


Це недійсний синтаксис PHP Ви намагаєтеся визначити функцію, quitале список параметрів - це код, який потрібно запустити. Під час спроби запустити помилку розбору.
Еміль Вікстрьом

@ EmilVikström - Виправлено зараз.
donutdan4114

12

C, 9 символів

Компілюється з gccта іншими компіляторами, які не заперечують щодо дрібних деталей, як, наприклад, mainне функцій.
Працює на x86платформах - програма негайно виходить.

main=195;

195 - опкод retінструкції.


4
Segfaults для мене. mainзнаходиться в .dataтому, що це int, а не in .text, і .dataзавантажується в не виконується сторінку.
mniip

10

Я завжди хотів опублікувати це десь, я вважаю, що це тут підходить, хоча відповідь вже прийнята.

int
main(int argc, char **argv)
{
        revoke(*argv);
}

Це працює для будь-якої системи 4.3BSD після публікації та інших, що реалізують revokeаналогічно. Linux, навіть не маючи прототипу для цього, MacOS робив у минулому, але лише повертає помилки в останніх версіях.

revokeпроходить шлях до файлу і насильно знищує всі посилання на цей файл. Сюди входять будь-які відображення пам'яті цього файлу, навіть сам виконуваний файл. Очевидно, що вам потрібно запустити програму зі шляху до неї, це не спрацює, якщо трапиться в PATH.

Різновидом цього, який повинен працювати у більшості подібних систем Unix, є:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
        intptr_t ps = getpagesize();
        munmap((void *)(((intptr_t)main)&~(ps - 1)), ps);
}

Ми просто знімаємо карту сторінки, яка відображається mainтак, що коли дзвінок munmapповертається, він не має куди повертатися. Існує невеликий шанс, що функція викликаєmunmap знаходиться лише на межі сторінки, і повернення буде успішним, тому, щоб бути повністю впевненим, що це працює, ми, ймовірно, повинні спробувати скасувати карту двох сторінок спочатку.

І звичайно, варіація на ту саму тему:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
        intptr_t ps = getpagesize();
        munmap((void *)(((intptr_t)&ps)&~(ps - 1)), ps);
}

Просто скасуйте стек, щоб нам не було куди повертатися. Такий самий застереження, що і розблокуванняmain - нам може знадобитися скасувати карту двох сторінок, за винятком того, що ми повинні пам’ятати, що стек, ймовірно, зростає (якщо ви не користуєтесь PA-RISC чи іншою подібною дивною архітектурою).

Ще один спосіб витягнути килим з-під власних ніг:

#include <sys/resource.h>

int
main(int argc, char **argv)
{
        setrlimit(RLIMIT_CPU, &((struct rlimit){ 0 }));
        while(1);
}

Це залежить від операційної системи від того, як система обробляє ліміт процесора 0 секунд і як часто робиться облік часу процесора. MacOS вбиває процес негайно, Linux вимагає циклу while, інша система, яку я намагався, нічого не робив навіть з обмеженням на секунду та цикл, я не відладжував далі.


9

ш

sudo kill -SEGV 1

Моментальна паніка ядра в Linux. Знищує всі процеси, в тому числі і самого себе

См

pskill csrss.exe

Миттєвий синій екран у Windows. Припиняє Client/Server Runtime SubSystem. Pskill повинен бути встановлений.


Буде чи killall initпрацювати?
s3lph

1
@the_Seppi 1. Лише користувач кореневого рівня може надсилати сигнали до init 2. Init спричинить паніку в ядрі лише тоді, коли отримає сигнал 11 (помилка сегментації)
MultiplyByZer0

Добре дякую ... Чи знаєте ви, що станеться, якщо ви використовуєтеsudo killall init
s3lph

1
@the_Seppi Так, так, я спробував це раніше. Init ігнорує це, тому що init може вирішити, отримує він сигнал чи ні, тому повністю ігнорує SIGKILL. unix.stackexchange.com/questions/7441/…
MultiplyByZer0

8

В C (Сумісний Windows / Linux / (можливо, Unix / Freed BSD):

main;

Приклад використання:

Під компіляцією Windows:

echo main; > main.c && cl /Fe:main.exe main.c

І Linux:

echo "main;" > main.c && gcc -w -o main main.c

Припустимо, що компілятор встановлений і в змінній currenth PATH.

EDIT: Технічно він викидає виключення (підняте процесором) в Linux, але такого повідомлення в Windows немає. Тож цей запис, ймовірно, недійсний; проте я думаю, що це круто: P

EDIT: В асемблері x86 (використовуючи NAsm / YAsm)

global s
s:
    ret

Зібрати:

(Windows)

nasm -f win32 -o test.obj test.asm
LINK /OUT:test.exe /SUBSYSTEM:CONSOLE /ENTRY:s test.obj

(Linux)

nasm -f elf32 -o test.obj test.asm
ld -o test -e s test.obj

На жаль, цей спосіб також створює основний дамп на linux, тому я вважаю, що він функціонально еквівалентний методу C; крім більш ефективних.


1
Оце Так! Я щойно це склав, -Wall -Wextra -std=c99 -pedanticі попереджень взагалі немає.
ldrumm

Я насправді хотів поставити це, але вирішив проти, тому що це було б дублікатом мого рішення різної проблеми ( codegolf.stackexchange.com/a/8778/3103 ).
Конрад Боровський

7

Приймаючи речі буквально по-дурному з Haskell:

import System.Exit

absolutely doThis = if True then doThis else undefined

unconventional doThat = do
  putStrLn "I could just do that"
  putStrLn "But I'm gonna print factorial of 100 first"
  putStrLn "There you go:"
  print $ fac 100
  doThat
  where fac n = foldl (*) 1 [1..n]

main = absolutely unconventional exitFailure

6

Пітон


Використовуючи в multiprocessingмодуль , ми можемо породити інший потік , чия робота полягає в тому, щоб спілкуватися з оригінальним процесом через чергу, кажучи, коли кинути:

import multiprocessing
import time
queue = multiprocessing.Queue()

def second_thread():
    while True:
        queue.put('quit')
        time.sleep(0.1)

second_ps = multiprocessing.Process(target = second_thread)
second_ps.start()

while True:
    msg = queue.get()
    if msg == 'quit':
        break
    time.sleep(0.1)

second_ps.join()

6

ANSI C

Без оптимізації коду наступна програма закінчується так швидко - її фактично не можна запускати, навіть якщо вона компілюється у дійсну програму

#include<stdlib.h>
#include<stdio.h>

char tooLong[0x7CFFFFFF];

void main()
{
    printf("never executed.");
}

це може залежати від системи - коментуйте, якщо ви можете запустити його.


"Вихід із метання виключень більше не буде прийнятий!" і це включає помилки, що не входять в пам'ять
Джон Дворак

2
@JanDvorak Існують відмінності між помилками та винятками .
syb0rg

Я вважаю, що правило охоплює і те, і інше. Чи може запитувач уточнити? І ні, я не вважаю, що специфічне для Java питання є гарною орієнтиром, особливо коли ви захищаєте рішення C.
Джон Дворак

9
Програма не видає помилки, а також не викликає помилку в межах програми. Система не може з цим впоратися.
Йоганнес

6

Гаразд. Якщо просто виклик System.exitзаборонено в Java, як щодо дзвінка через відображення з іншого потоку?

import java.lang.reflect.*;

public class Quit {
    public static void main(String[] args) throws Exception {
        final Method exit = System.class.getMethod("exit", new Class<?>[]{ int.class });
        new Thread(new Runnable() {
            @Override public void run() {
                try {
                    System.out.println("calling... " + exit);
                    exit.invoke(null, new Object[] { 0 });
                } catch (Exception e) { e.printStackTrace(); }
            }
        }).start();
        for (int i = 1; ; ++i) {
            System.out.println("counting... " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { break; }
        }
    }
}

Пошук способу виходу, породження нового потоку і відлік часу, поки цей потік не вбиває процес, викликаючи вихід за допомогою відображення.


Відраховує? Схоже, це враховує мене.
Джастін

1
Е, так, хороший момент. Я повинен був сказати підрахунок, або просто сказав, що він рахує, поки не вийде.
Девід Конрад

6

x86 машинна мова, 1 символ

Зазвичай ви можете зробити працездатний виконуваний файл з однієї інструкції RET

\xC3 

4
Як це нетрадиційно ?!
aditsu

6

C (Linux)

Версія про самогубство

Надсилає собі SIGKILL.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() 
{
    kill(getpid(),SIGKILL);

    printf("Not killed");
}

Версія "Tu quoque mi fili"

Форкс, потім син вбиває батька.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() 
{
    if (!fork())
        kill(getppid(), SIGKILL);

    printf("Not killed");
}

5

Perl

...

Це все.


Пояснення: викидає виняток Unimplementedі виходить негайно.


Додано пояснення.
PhiNotPi

3
Не знаю, винятки нудні.

6
Недійсний через адаптацію до виклику: немає винятків
s3lph

Я просто ще не збирався писати ще одну відповідь.
PhiNotPi

5

Пакетна робота та налагодження

Старий, але добрий, працює на машинах DOS для миттєвого перезавантаження системи. Бонус у тому, що це один сценарій, призначений для інтерпретації двох різних, несумісних перекладачів.

reset.bat

goto start

rcs
ffff
rip
0000
g
:start
debug < reset.bat

Інтерпретація пакетного файлу пропускає інструкції, призначені для налагодження, і подає себе на налагодження для інтерпретації. Порожній рядок після gotoцього потрібен, щоб очистити помилку в debugрезультатах через те, що він подається невідомою командою, що є goto.


1
Раніше я робив те саме, що й десь сокира; штовхач; push bx; retf
moopet

3

Java

Наведений нижче код не перевіряється і працюватиме лише на деяких платформах.

public class Quitter
{
       public static void main ( String [ ] args )
       {
             Process process = Runtime . getRuntime ( ) . exec ( "reboot" ) ;
       }
}

45
Що з цим жахливим пробілом
Doorknob

7
У UNIX це повинно бути sudo reboot, на Windowsshutdown /r /t 0
s3lph

2
У UNIX вам просто потрібно виконати цю програму за допомогою sudo, а не команди, яку ви хочете виконати.
Йоганнес Кун

1
@ the_Seppi, @ JohannesKuhn, як я сказав, це працює лише на деяких платформах, і я припускав, що ви збираєтеся посилатися на це як sudo java Quitter.
emory

3
-1 НЕ БІЛЬШЕ ВІДПРАВНО !!!
vaxquis

3

Powershell

get-process | stop-process -force

Збережіть це як "lastresort.ps1", і це повинно зробити трюк.

Якщо у вас виникли проблеми зі сценарієм, який не виконується через якусь немічну політику, введіть це перед виконанням сценарію:

Set-ExecutionPolicy Unrestricted

Працює чудово з командного рядка, не зберігаючи також як сценарій.
Іссі

3

TI-Basic 84

:;;::;banana\\sEnd\;:;1:If X=X-1 :eat banana juice and lol;;;::::;:thought you could EAT THINGS XD /// CRAZIEST ANSWER YET!!!

3

Python (однолінійна альтернатива OP)

Я подумав, що насправді немає кращої відповіді Python, ніж те, що запропонувала ОП, але мені не сподобалося, як це було так багато рядків, тож ось як ви робите саме так, як це робило ОП, але в одному рядку:

exec(''.join([ chr(x) for x in [35, 33, 47, 117, 115, 114, 47, 98, 105, 110, 47, 101, 110, 118, 32, 112, 121, 116, 104, 111, 110, 10, 35, 32, 117, 110, 105, 120, 32, 111, 110, 108, 121, 44, 32, 109, 105, 103, 104, 116, 32, 119, 111, 114, 107, 32, 111, 110, 32, 119, 105, 110, 100, 111, 119, 115, 10, 35, 32, 110, 111, 116, 101, 58, 32, 107, 105, 108, 108, 115, 32, 65, 76, 76, 32, 82, 85, 78, 78, 73, 78, 71, 32, 112, 121, 116, 104, 111, 110, 32, 112, 114, 111, 99, 101, 115, 115, 101, 115, 46, 32, 66, 101, 32, 99, 97, 114, 101, 102, 117, 108, 32, 47, 33, 92, 10, 100, 101, 102, 32, 101, 120, 105, 116, 40, 41, 58, 10, 32, 32, 32, 32, 105, 109, 112, 111, 114, 116, 32, 111, 115, 10, 32, 32, 32, 32, 111, 115, 46, 115, 121, 115, 116, 101, 109, 40, 34, 107, 105, 108, 108, 97, 108, 108, 32, 112, 121, 116, 104, 111, 110, 51, 34, 41, 10, 32, 32, 32, 32, 35, 32, 87, 105, 110, 100, 111, 119, 115, 32, 97, 100, 100, 111, 110, 10, 32, 32, 32, 32, 111, 115, 46, 115, 121, 115, 116, 101, 109, 40, 34, 116, 97, 115, 107, 107, 105, 108, 108, 32, 47, 105, 109, 32, 112, 121, 116, 104, 111, 110, 46, 101, 120, 101, 32, 47, 102, 34, 41, 32, 35, 32, 111, 114, 32, 119, 104, 97, 116, 101, 118, 101, 114, 32, 102, 105, 108, 101, 110, 97, 109, 101, 32, 112, 121, 116, 104, 111, 110, 64, 119, 105, 110, 100, 111, 119, 115, 32, 104, 97, 115, 10, 101, 120, 105, 116, 40, 41, 10] ]))

Ви можете зробити цю функцію, і вона зробить роботу за вас.


3

Моя власна ідея, не беру участь

TIGCC (для Texas Instrumens TI-89, TI-89 Titanium, TI-92 +, TI-V200)

void main(void) {
    unlink("quit");
    asm("trap #2");
}

TI-Basic для тих же калькуляторів

quit()
:© lines starting with © are comments
:Prgm
:©DelVar quit
:Exec "4E424E750000"
:EndPrgm

Що робить програма: Спочатку вона видаляє себе з ОЗУ. (Не ставте його до ПЗУ, інакше він не працюватиме ...) Він все ще може працювати, тому що при виконанні копія програми створюється і виконується. asm(trap #2);викликає команду ASM4E424E750000 , це команда для скидання калькулятора, видалення оперативної пам’яті (Flash ROM залишається недоторканою) та повторно встановлює всі програми.

РЕДАКТУВАТИ: Щойно перевірена основна версія Він не може видалити себе ...


3

Формат MS-DOS .com

Він записує в пам’ять недійсні інструкції (FFFF), а потім виконує їх, роблячи аварію NTVDM.

Шестидесятковий

B8 FF FF A3 06 01

Мова збирання Debug.exe

MOV AX, FFFF
MOV [0106],AX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.