Комментарии 21
книге Криса Касперского
Он вроде как Крис Касперски.
Это здорово, когда мы чувствуем железо.
Последний раз использовал машинные коды, когда для Raspberry Pi 3 делал звук/видео буфер на голом железе. FASM интерпретировал мнемонику в машинный код, а GCC - нет. Пришлось в текст программы вставить кусок данных. Заработало.
А в общем, до сих пор помню многие коды из PDP-11.
Можно купить БК-0010 и пробовать..
Ещё делал дизассемблер на лету для IBM совместимых компьютеров . Надо было убрать кусок кода, который защиту на Com port проверял. Через T бит после каждой команды выполнялос прерывание, и дизассемблировалась команда. На 386SX работало с приемлемой скоростью.
Машинные коды для PDP-11... пультовый режим...
1000:012737
1002:000123
1004:177566
а теперь набираем 1000 G
(это печатало символ S на алфавитно-цифровой экран)
Трава тогда была зеленее... как алфавитно-цифровой монитор ДВК-2)
Уважаемый Анатолий, не могли бы Вы вкратце поделиться Вашим методом по запихиванию и запуску машинных кодов в RaspberryPi? (если это не секрет).
Еще там была проверка готовности через регистр состояния.
Коллега делал проверку бита готовности через TSTB и потом ветвление.
Позже я понял, что надо делать через BPL, так как бит готовности - он же старший в байте, поэтому соответствует знаку.
Потом, когда RT-11 (ФОДОС) появился, фокус ему показывал
MOV #123, R0
EMT O341 // .TTYOUT R0
EMT O350 // EXIT
Встраивание данных в код
Кусок программы от Peter Lemon на ассемблере
Инициализация Frame Buffer
...
FB_Init:
mov w0,FB_STRUCT + MAIL_TAGS
mov x1,MAIL_BASE
orr x1,x1,PERIPHERAL_BASE
str w0,[x1,MAIL_WRITE + MAIL_TAGS] ; Mail Box Write
ldr w0,[FB_POINTER] ; W0 = Frame Buffer Pointer
cbz w0,FB_Init ; IF (Frame Buffer Pointer == Zero) Re-Initialize Frame Buffer
...
Он транслируется в FASM, но выдает ошибки в GCC aarch64-linux-gnu
Поэтому сначала я вставлял машинные коды нетранслируемых команд как директивы .word ...
а после преобразовал текст программы.
...
FB_Init:
mov w0, FB_STRUCT+MAIL_TAGS
.word 0x5282a900 // альтеративно - такая команда
mov x1, MAIL_BASE
orr x1,x1, PERIPHERAL_BASE
str w0, [x1,MAIL_WRITE + MAIL_TAGS] // Mail Box Write
adr x1, FB_POINTER //.word 0x18000700 //ldr w0,[FB_POINTER] // W0 = Frame Buffer Pointer []
ldr w0, [x1] // Store Frame Buffer Pointer Physical Address
cbz w0, FB_Init // IF (Frame Buffer Pointer == Zero) Re-Initialize Frame Buffer
and w0, w0,0x3FFFFFFF // Convert Mail Box Frame Buffer Pointer From BUS Address To Physical Address ($CXXXXXXX -> $3XXXXXXX)
adr x1, FB_POINTER // already there
str w0, [x1] // Store Frame Buffer Pointer Physical Address
...
Дизассемблер:
0000000000000094 :
94: 5282a900 mov w0, #0x1548 // #5448
98: 5282a900 .word 0x5282a900
9c: d2971001 mov x1, #0xb880 // #47232
a0: b2681421 orr x1, x1, #0x3f000000
a4: b9002820 str w0, [x1, #40]
a8: 1000a8a1 adr x1, 15bc
ac: b9400020 ldr w0, [x1]
b0: 34ffff20 cbz w0, 94
b4: 12007400 and w0, w0, #0x3fffffff
b8: 1000a821 adr x1, 15bc
bc: b9000020 str w0, [x1]
c0: b26a03ff mov sp, #0x400000 // #4194304
c4: 14001682 b 5acc
Две первые строки
mov w0, FB_STRUCT+MAIL_TAGS
.word 0x5282a900
выдают один и тот же машинный код
94: 5282a900 ...
98: 5282a900 ...
Таким образом, можно создать базу данных (на самом деле - кодов). Из этих "кирпичиков" построить программу, передать на нее управление, и она будет работать.
Можно применить генетические алгоритмы, то есть, "выживать" будут лучшие экземпляры.
Также не исключено добавление случайных кодов, в случае ошибки возникнет прерывание по неправильному коду операции, этот код может быть подправлен и т. д.
Тут нужно смотреть, чтобы изменения кода происходили, не мешая кешу команд и данных.
Самомодифицирующиеся программы существуют уже давно.
Про Raspberry Pi
Пробовал на 3+A и B, 2W - все с процессором A53. Четыре ядра работают - это позволяет на каждом выполнять свою задачу без переключений. С Raspberry Pi 5 на голом железе пока не пробовал - там чип ввода-вывода поставили.
Спасибо. Прогуглил Peter Lemon frame buffer - нашёл его проект на гитхаб.
Пожалуйста, если будут полезные проекты, можно было бы поучаствовать. Не только на RPI, но и на других платах (на голом железе).
Кстати, посмотрел Вашу публикацию о Inkscape Plugin, интересная штука. А я делал Plugin для вывода графики на плоттер, то есть, в G-code для ЧПУ. Для плоттера на бутылках BottleBot, а потом подправил для Line-US. Ещё из этого делал координаты для текстов для 3D графики. (Сами надписи располагались на поверхности усеченного конуса, в циферблате для часов)

D1 - любой компьютер с уютненьким Linux-GUI
D2 - любой девайс с любым выходом на телик или монитор,
и чтоб при перезагрузке запускалось некое ПО позволяющее загружать (с D2) и запускать произвольный машинный код.
Вот... размышляю в этом направлении...
Расскажите об этом поподробней, очень интересно для чего это!
Ваш вопрос заставил меня задуматься :-)
Зачем создавать такие сложности, когда можно на компе эмулятор запустить и развлекаться пока не надоест...
Ответ: хотелось бы эту "энергию ностальгии" направить в менее романтичное, но более прагматичное русло.

То есть не уходить от реальности в эмуляцию. А попытатья "развлечься" с реальным девайсом. Желательно недорогим.

Возможно, "энергии" хватит чтобы сделать несколько разных проектов.

Возможно, какой-нить из этих проектов (немного попылившись на полке) однажды пригодится.
Однако, ностальгический комментарий разрастается...
Некоторые варианты.
Программируемый калькулятор (в нем много машинных кодов, запуск программ с выводом на экранчик).
Или купить БК-0010М, или поискать эмулярор PDP-11 на PC.КПК Palm IIIe со складной клавиатурой. На нем (прямо на нем) можно создавать, редактировать и выполнять программы на Assembler и C. Замечательная архитектура Motorola DragonBall (или MC68328).
Мне она нравится больше чем DEC PDP-11, к тому же, 32 бита, работа от двух мизинчиковых батарей.Телефон на Android с Termux. Это - Linux в кармане, можно подключать мышь и клавиатуру по Bluetooth,
а также мониторы или телевизоры по кабелю USB Type C - HDMI. Можно создавать программы на любом языке, можно установить Far Manager, редакторы двоичных файлов, редактировать BIN файлы и запускать их.Raspberry Pi Zero 2W (или другие). Можно работать как на Linux, так и на голом железе.
Arduino Vidor 4000 с Intel Cyclone на борту. Есть IP процессоров, можно и свой процессор создать и загрузить.
Есть выход HDMI. Сам я только проверил цепочку от схемы в Quartus в бит-файл для мигания светодиодом.
Эти устройства заменяют D1 и D2. То есть, два в одном.
Если говорить об устройстве D2, то его можно выполнить даже на Arduino Uno. К нему подключить связь с D1 и экран, например, OLED или LCD.
Для связи D1 и D2 подойдут, как проводные (UART), так и беспроводные интерфейсы: Bluetooth (на HC-05, 06), BLE (HM-11), Wi-Fi (ESP9266), IrDA.
Программировать в кодах немного сложновато. Исключение - DEC PDP-11, там только пересчет смещения ветвления вручную рутинный.
Поэтому можно сделать свой Assembler. Когда-то в журнале "Микропроцессорные средства и системы" приводились такие проекты - типа универсальный Assembler для любых мнемоник в любые коды.
А еще можно сделать генерацию кода с помощью LLM.
Как-то попробовал в Off-Line на Raspberry Pi 5 - подключил к LLM свое резюме. А потом спрашивал про себя на разных языках. Система послушно выдавала информацию.
Подобным образом можно подключить документ, который содержит машинные коды.
Потом вы говорите что-то вроде: переслать из регистра R2 в R3. Для этого у системы будет ответ типа: "10203", что соответствует "MOV R2,R3". Эти строки машинного кода можно преобразовать в двоичный вид, поместить в файл, и будет готовый бинарник для исполнения. А еще можно будет делать целые куски кода или подпрограммы, например, "вывести "Testing 123" на терминал".
Применение Code-T5(CodeT5 - модель для понимания, а также генерации кода).
Для анализа исходного текста программ:
https://youtu.be/MlW2GAPPV2w?si=D8PnUJsoNIYSjxeU
(озвучка ужасная, лучше не слушать, сейчас лучше справляюсь).
Задача была документировать тексты программ, генерациют кода не пробовал.
ностальгический комментарий разрастается...
:-) да, это прям бесплатный мессенджер.
интересно, есть ли на Хабре какие-нибудь правила на этот счёт?
Спасибо за предоставленную инфу. Многое из предложенного Вами я не знал. Arduino Vidor 4000 вообще вскружило мне голову...
Пока старенькие RaspberryPi кажутся мне наиболее подходящими кандидатами. Вот только огорчает нарочитое отсутствие кнопки Reset у этих "Малинок".
Вот ещё гуглю про одноплатники Orange Pi Zero...

Это самый удобный отладчик в моей жизни. Система команд и адреса устройств в восьмеричном виде на ОДНОМ листе А4(фото бумага). Первая моя программа которую кто то использовал кроме меня тестировала перфокарты. Перфораторы старые и не все дырки качественно пробивались (помимо просто ошибок). Предыдущая не моя программа печатала номера плохих карт и их в ручную нужно было подсчитывать в колоде. А моя позволяла остановить чтение на ошибке проверить карту и вернуть на чтение в карман устройства.
Начало нулевых, программировал AT89C2051 без компьютера (не было), самодельным программатором на базе двоичных счётчиков, генераторов-одновибраторов, 28С еепром и параллельной ОЗУ. Через ОЗУ переставлял куски программы в еепром, корректировал и вводил код через сдвиговой регистр и 2 кнопки (CLK и DATA). Вначале рисовал алгоритм, потом переводил в машинные коды и вводил в память программатора.

Читал отзывы на приведенную в статье книгу о том, что на сегодня она уже не актуальна. По вашему мнению, используют ли разработчики современного софта приемы защиты, описанные в данной книге ? Стоит ли ее читать сегодня, чтобы использовать полученные знания по назначению, а не для развлечения с машинными кодами ?
Я бы хотел даже электронное устройство такое иметь, где можно было бы ходить с ним и в память вбивать опкоды, чтобы на экране потом что-нибудь выводилось.
Вы не думали на FPGA реализовать свою архитектуру и играть с ней?
Вы не думали на FPGA реализовать свою архитектуру и играть с ней?
Я думал об этом, я хочу электронику изучить, но мне сложно себя организовать, так как я не знаю как правильно учиться электронике. А так, да, можно было бы сделать такое. Может в будущем сделаю, если обрету эти священные знания по электронике.
Спасибо, что своим вопросом вдохновляете.
Да и все присутствующие в комментариях очень порадовали меня, мотивация очень сильная, я рад, что ностальгия есть у людей по тем временам.
Видел Вашу статью-идею про изучение электроники посредством создания эмулятора электрических цепей. С интересом почитал вашу полемику с знатоками.
Я более-менее знаю электронику и смею утверждать что можно запилить простенький самодельный симулятор-эмулятор электрических цепей на JavaScript и canvas в браузере. Который поможет новичкам "прочувствовать" все эти "Кирхгоф", "Ом" и прочие законы ( а формулы новички сами найдут... если захотят)
Для этого достаточно написать объект-функцию которая будет приблизительно симулировать поведение электрона в проводнике (координаты электрона, изменение координат... что там ещё... электроны влияют друг на друга но не выходят за пределы проводника) и отображать электрон в виде движущейся по проводникам точки на canvas в браузере. Будет наглядно и понятно для широких народный масс...
Затем нагенерить таких объект-функций сотню-другую (а может и несколько тысяч) и пусть они себе "толкают" друг-дружку по проводникам.
Ну как-то так.
Программирование в машинных кодах