Номеронабиратель (War Dialer) из «Военных игр» (1983 год)
Чёрный ящик из «Тихушников» (1992 год)
Недавно я вспомнил эту сцену из «Терминатора 2», поэтому начал гуглить «лэптоп из Терминатора 2».
Оказалось, что это Atari Portfolio — первый в мире палмтоп-компьютер («наладонный» компьютер). Он был выпущен в июне 1989 года.
Компьютер имел монохромный ЖК-дисплей с разрешением 240×64 пикселей или 40 символов x 8 строк и работал от трёх батареек AA.
Потом я задумался, насколько трудно будет написать такую программу. Не программу, которая на самом деле взламывает PIN дебетовых карт (не думаю, что это на самом деле возможно при помощи последовательного кабеля и алюминиевой фольги, намотанной на карту), а программу, которая сможет симулировать вывод на экран палмтопа в этой сцене.
Для начала изучим нужные технические требования!
Если посмотреть видео внимательно, то видно, что первым делом отображается баннер программы.
Изображение достаточно чёткое, чтобы мы могли с лёгкостью скопировать баннер.
PPPPP IIIIIII N N
P PP I NN N IDENTIFICATION
P PP I N N N
PPPPP I N N N PROGRAM
P I N NN
P IIIIIII N N
Strike a key when ready ...
После этого Джон нажимает на Enter и на экране начинают прокручиваться числа. Если посмотреть спустя несколько кадров:
то мы увидим, что первая строка чисел выглядит так:
12345678901234567890123457890123456780
Можно было бы предположить, что это просто повторяющиеся четыре раза цифры с 1 по 0, но при внимательном изучении выясняется, что строка длиной всего 38 символов. В третьем повторе пропущена цифра 6, а в последнем — цифра 9.
Принцип уменьшения чисел тоже неочевиден, но похоже, что программа выводит примерно по 5 строк определённой длины, а затем уменьшает длину на 1, однако после следующего набора она уменьшает длину на 2, а затем попеременно использует уменьшение на 1 и 2, пока не определит PIN из четырёх цифр, который выводит в командную строку.
Ну, всё выглядит довольно просто. Я осваивал Python, поэтому написал скрипт на Python 3:
#!/usr/bin/env python3
import time
import random
delay = 0.025
print("PPPPP IIIIIII N N")
time.sleep(delay)
print("P PP I NN N IDENTIFICATION")
time.sleep(delay)
print("P PP I N N N")
time.sleep(delay)
print("PPPPP I N N N PROGRAM")
time.sleep(delay)
print("P I N NN")
time.sleep(delay)
print("P IIIIIII N N")
time.sleep(delay)
print('')
input("Strike a key when ready ...")
print("nn12345678901234567890123457890123456780")
lines = 1
length = 38
decrease = 1
while True:
for i in range(0, length):
print(random.randint(0,9), end='')
print('')
time.sleep(delay)
lines += 1
if (lines == 5):
lines = 0
length -= decrease
if (decrease == 1):
decrease = 2
else:
decrease = 1
if (length <= 4):
break
for i in range(0, 10):
print("9003")
print("nPIN IDENTIFICATION NUMBER: 9003")
print("na>", end='')
Скрипт выполняется очень быстро, поэтому я добавил задержку между строками, чтобы скорость была такая же, как в отрывке из фильма. Я уверен, что код можно ещё оптимизировать, но если бы я рассматривал это как задачу написания плохого кода на техническом собеседовании, то считал бы, что справился с заданием.
При помощи поиска Google по картинкам я нашёл сайт, продающий пластмассовые панели для Atari Portfolio с нанесённой на экран красивой графикой:
Немного поэкспериментировав с termtosvg, в частности, с функцией SVG-шаблонов, я смог создать этот безумный SVG:
Несмотря на то, что я уже больше десяти лет поддерживаю html5zombo.com, до создания этого SVG я не ценил всех их возможностей. Они могут встраивать изображения? CSS? Javascript? Любой сайт, позволяющий пользователям загружать произвольные SVG и рендерить их, теперь получил моё величайшее уважение.
Пока я развлекался созданием своего небольшого автономного SVG, меня не покидала мысль о том, что мой код на Python на самом деле никогда бы не запустился на Atari Portfolio. В Atari Portfolio установлена «DIP Operating System 2.11» (DIP DOS), «по большей части совместимая» с MS-DOS.
В первых классах старшей школы, ещё до того, как мне начали платить за профессиональное написание ПО, я писал софт для BBS, моды и игры на смеси Turbo Pascal и скриптового языка PCBoard Programming Language, напоминавшего BASIC. Проведя минимальные исследования, я выяснил, что если смогу написать программу на Turbo Pascal и скомпилировать её, то она, вероятно, будет работать на Atari Portfolio.
Я не писал на Turbo Pascal почти 25 лет, но ведь такое не забывается?
Мне нравится форк DOSBox под названием DOSBox-X, поэтому я скачал и установил самую последнюю SDL2-версию для OS X. Затем я нашёл Borland Turbo Pascal 7.0, который помещу сюда, потому что искать его было настоящим мучением.
В этом ZIP вы найдёте четыре файла, которые являются образами гибких дисков. Если поместить их в папку, например, ~/tp
, после запуска DOSBox-X и монтирования диска C вы сможете смонтировать их как диск A следующим образом:
imgmount a ~/tp/Disk01.img ~/tp/Disk02.img ~/tp/Disk03.img ~/tp/Disk04.img -floppy
после чего переключиться на диск A: и запустить INSTALL:
A:
INSTALL
Время от времени придётся заменять гибкие диски, ведь это был 1992 год.
Это можно сделать, выбрав в DOSBox-X Drive -> A -> Swap disk. Выполнится переход с Disk 1 на Disk 2. Затем просто продолжайте повторять процесс и нажимать на «Ввод», пока не установятся все четыре диска.
После завершения установки она попросить настроить CONFIG.SYS
и AUTOEXEC.BAT
(не забывайте, это 1992 год).
Ни то, ни другое необязательно. DOSBox-X и так задаёт значение FILES выше необходимого, а добавление к путям просто позволяет запускать TURBO из любого места. После завершения можно выполнить следующую команду:
C:
cd tpbin
TURBO
В детстве я провёл столько времени с этим IDE, что теперь испытал своего рода ностальгию. Но потом я начал портировать свой скрипт Python на Pascal и ностальгия быстро рассеялась. Хотел бы я сказать, что написал всё целиком в IDE, но в какой-то момент мне пришлось перейти в VSCode, а потом скопировать файл обратно в папку DOS. Люди, которые до сих пор работают в WordPerfect for DOS, я вас и понимаю, и не понимаю.
Вот скрипт, который я получил, потратив много времени на этот туториал по Pascal:
program pinid;
uses crt;
var i: byte;
var pos: byte;
var lines: byte;
var length: byte;
var decrease: byte;
var delay_amount: integer;
begin
randomize;
delay_amount := 25;
clrscr;
writeln('PPPPP IIIIIII N N');
delay(delay_amount);
writeln('P PP I NN N IDENTIFICATION');
delay(delay_amount);
writeln('P PP I N N N');
delay(delay_amount);
writeln('PPPPP I N N N PROGRAM');
delay(delay_amount);
writeln('P I N NN');
delay(delay_amount);
writeln('P IIIIIII N N');
delay(delay_amount);
writeln('');
write('Strike a key when ready ...');
readln;
writeln('');
writeln('');
writeln('12345678901234567890123457890123456780');
pos := 0;
lines := 1;
length := 38;
decrease := 1;
while true do
begin
for i:= 1 to length do
write(random(9));
writeln('');
delay(delay_amount);
lines := lines + 1;
if (lines = 5) then
begin
lines := 0;
length := length - decrease;
if (decrease = 1) then
decrease := 2
else
decrease := 1;
end;
if (length <= 4) then
break;
end;
for i:= 1 to 10 do
begin
writeln('9003');
delay(delay_amount);
end;
writeln('');
writeln('PIN IDENTIFICATION NUMBER: 9003');
writeln('');
end.
Краткие объяснения:
program
и названия программы, вероятно потому, что все модули имеют общее пространство имён, но имя файла не важно.uses
. Модуль crt
используется для манипулирования экраном.begin
and end
, а не в фигурные скобки или пробелы.randomize
, то создаваемые случайные числа всегда будут одинаковыми, как и выходные строки.Работает ли код? Вот запущенная в DOSBox-X программа:
Чтобы не покупать лишних вещей, я проделал мысленное упражнение, представив, что нужно для дальнейшей реализации проекта:
Закажи и сразу работай! Создание VDS любой конфигурации и с любой операционной системой в течение минуты. Максимальная конфигурация позволит оторваться на полную — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Эпичненько 🙂
Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…
Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…
Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…
У частных продавцов на Авито появилась возможность составлять текст объявлений с помощью нейросети. Новый функционал доступен в категории «Обувь, одежда,…
24 апреля 2024 года в Москве состоялась церемония вручения наград международного конкурса Workspace Digital Awards. В этом году участниками стали…
27 июня Яндекс проведет гик-фестиваль Young Con для студентов и молодых специалистов, которые интересуются технологиями и хотят работать в IT.…