Кажется, я не смотрел Терминатор 2 в кинотеатре. Вероятно, я посмотрел его несколько лет спустя на LaserDisc, но эта сцена произвела довольно сильное впечатление. Похожую реакцию вызвали номеронабиратель из Военных игр и чёрный ящик из Тихушников.
Номеронабиратель (War Dialer) из Военных игр (1983 год)
Чёрный ящик из Тихушников (1992 год)
Недавно я вспомнил эту сцену из Терминатора 2, поэтому начал гуглить лэптоп из Терминатора 2.
Оказалось, что это Atari Portfolio первый в мире палмтоп-компьютер (наладонный компьютер). Он был выпущен в июне 1989 года.
Компьютер имел монохромный ЖК-дисплей с разрешением 240x64 пикселей или 40 символов x 8 строк и работал от трёх батареек AA.
Потом я задумался, насколько трудно будет написать такую программу. Не программу, которая на самом деле взламывает PIN дебетовых карт (не думаю, что это на самом деле возможно при помощи последовательного кабеля и алюминиевой фольги, намотанной на карту), а программу, которая сможет симулировать вывод на экран палмтопа в этой сцене.
Для начала изучим нужные технические требования!
Если посмотреть видео внимательно, то видно, что первым делом отображается баннер программы.
Изображение достаточно чёткое, чтобы мы могли с лёгкостью скопировать баннер.
PPPPP IIIIIII N NP PP I NN N IDENTIFICATIONP PP I N N NPPPPP I N N N PROGRAMP I N NNP IIIIIII N NStrike a key when ready ...
После этого Джон нажимает на Enter и на экране начинают прокручиваться числа. Если посмотреть спустя несколько кадров:
то мы увидим, что первая строка чисел выглядит так:
12345678901234567890123457890123456780
Можно было бы предположить, что это просто повторяющиеся четыре раза цифры с 1 по 0, но при внимательном изучении выясняется, что строка длиной всего 38 символов. В третьем повторе пропущена цифра 6, а в последнем цифра 9.
Принцип уменьшения чисел тоже неочевиден, но похоже, что программа выводит примерно по 5 строк определённой длины, а затем уменьшает длину на 1, однако после следующего набора она уменьшает длину на 2, а затем попеременно использует уменьшение на 1 и 2, пока не определит PIN из четырёх цифр, который выводит в командную строку.
Ну, всё выглядит довольно просто. Я осваивал Python, поэтому написал скрипт на Python 3:
#!/usr/bin/env python3import timeimport randomdelay = 0.025print("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("\n\n12345678901234567890123457890123456780")lines = 1length = 38decrease = 1while 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): breakfor 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 tp\binTURBO
В детстве я провёл столько времени с этим 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.
Краткие объяснения:
- В Pascal есть объявления типов. Тип byte может быть числом в интервале 0-255.
- Файлы начинаются с
program
и названия программы, вероятно потому, что все модули имеют общее пространство имён, но имя файла не важно. - Модули импортируются словом
uses
. Модульcrt
используется для манипулирования экраном. - := это синтаксис присвоения значения переменной, чтобы можно было сравнивать при помощи = и отличать их друг от друга.
- Если блоки длиннее одной строки, их нужно оборачивать в
begin
andend
, а не в фигурные скобки или пробелы. - Если в начале скрипта не выполнить
randomize
, то создаваемые случайные числа всегда будут одинаковыми, как и выходные строки. - WRITE выводит строку, WRITELN выводит строку с переводом строки. READLN получает ввод до получения перевода строки.
Работает ли код? Вот запущенная в DOSBox-X программа:
Чтобы не покупать лишних вещей, я проделал мысленное упражнение, представив, что нужно для дальнейшей реализации проекта:
- Купить на Ebay Atari Portfolio.
- Купить параллельный интерфейс Atari Portfolio и, вероятно, новую переднюю панель, потому что старая наверняка поцарапана.
- Найти в моей коробке с кабелями параллельный кабель.
- Найти PC или лэптоп с параллельным портом, установить на него MS-DOS v6.22.
- Скачать FT.COM и установить его на PC.
- Собрать EXE в Dosbox-X и передать его на Atari Portfolio.
- Украсть дебетовую карту.
- Обернуть часть карты алюминиевой фольгой, купить последовательный интерфейс Atari Portfolio, подключить кабель к карте.
- Запустить программу.
- Лёгкие деньги!
На правах рекламы
Закажи и сразу работай! Создание VDS любой конфигурации и с любой операционной системой в течение минуты. Максимальная конфигурация позволит оторваться на полную 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Эпичненько :)