В начале фильма «Терминатор 2: Судный день» Джон Коннор использует лэптоп для подбора PIN украденной дебетовой карты.
Кажется, я не смотрел «Терминатор 2» в кинотеатре. Вероятно, я посмотрел его несколько лет спустя на LaserDisc, но эта сцена произвела довольно сильное впечатление. Похожую реакцию вызвали номеронабиратель из «Военных игр» и чёрный ящик из «Тихушников».
Номеронабиратель (War Dialer) из «Военных игр» (1983 год)
Чёрный ящик из «Тихушников» (1992 год)
Недавно я вспомнил эту сцену из «Терминатора 2», поэтому начал гуглить «лэптоп из Терминатора 2».
Оказалось, что это Atari Portfolio — первый в мире палмтоп-компьютер («наладонный» компьютер). Он был выпущен в июне 1989 года.
Компьютер имел монохромный ЖК-дисплей с разрешением 240x64 пикселей или 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.
Краткие объяснения:
- В 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. Эпичненько :)
Автор: Mikhail