- PVSM.RU - https://www.pvsm.ru -
В начале фильма «Терминатор 2: Судный день» [1] Джон Коннор использует лэптоп для подбора PIN украденной дебетовой карты.
Кажется, я не смотрел «Терминатор 2» в кинотеатре. Вероятно, я посмотрел его несколько лет спустя на LaserDisc, но эта сцена произвела довольно сильное впечатление. Похожую реакцию вызвали номеронабиратель из «Военных игр» [2] и чёрный ящик из «Тихушников» [3].
Номеронабиратель (War Dialer) из «Военных игр» (1983 год)
Чёрный ящик из «Тихушников» (1992 год)
Недавно я вспомнил эту сцену из «Терминатора 2», поэтому начал гуглить «лэптоп из Терминатора 2».
Оказалось, что это Atari Portfolio [4] — первый в мире палмтоп-компьютер («наладонный» компьютер). Он был выпущен в июне 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 [5], в частности, с функцией SVG-шаблонов [6], я смог создать этот безумный SVG [7]:
Несмотря на то, что я уже больше десяти лет поддерживаю html5zombo.com [8], до создания этого SVG я не ценил всех их возможностей. Они могут встраивать изображения? CSS? Javascript? Любой сайт, позволяющий пользователям загружать произвольные SVG и рендерить их [9], теперь получил моё величайшее уважение.
Пока я развлекался созданием своего небольшого автономного 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 [10], поэтому я скачал и установил самую последнюю SDL2-версию для OS X. Затем я нашёл Borland Turbo Pascal 7.0, который помещу сюда [11], потому что искать его было настоящим мучением.
В этом 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 [12], я вас и понимаю, и не понимаю.
Вот скрипт, который я получил, потратив много времени на этот туториал по Pascal [13]:
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 [16] любой конфигурации и с любой операционной системой в течение минуты. Максимальная конфигурация позволит оторваться на полную — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Эпичненько :)
Автор: Mikhail
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/360480
Ссылки в тексте:
[1] «Терминатор 2: Судный день»: https://www.imdb.com/title/tt0103064/
[2] «Военных игр»: https://www.imdb.com/title/tt0086567/
[3] «Тихушников»: https://www.imdb.com/title/tt0105435/
[4] Atari Portfolio: https://en.wikipedia.org/wiki/Atari_Portfolio
[5] termtosvg: https://github.com/nbedos/termtosvg
[6] SVG-шаблонов: https://github.com/nbedos/termtosvg/blob/develop/man/termtosvg-templates.md
[7] безумный SVG: https://bert.org/assets/posts/pinid/example.svg
[8] html5zombo.com: https://html5zombo.com/
[9] рендерить их: https://github.com/bertrandom/pinid
[10] DOSBox-X: https://dosbox-x.com/
[11] сюда: https://bert.org/assets/posts/pinid/tp7.zip
[12] WordPerfect for DOS: http://www.columbia.edu/~em36/wpdos/
[13] туториал по Pascal: https://wiki.freepascal.org/Basic_Pascal_Tutorial
[14] параллельный интерфейс Atari Portfolio и, вероятно, новую переднюю панель: http://www.best-electronics-ca.com/portfoli.htm
[15] FT.COM: http://ftp.pigwa.net/stuff/mirror/www.umich.edu/%257Earchive/atari/Portfolio/Telecomm/index.html
[16] Создание VDS: https://vdsina.ru/cloud-servers?partner=habr227
[17] Источник: https://habr.com/ru/post/536396/?utm_source=habrahabr&utm_medium=rss&utm_campaign=536396
Нажмите здесь для печати.