Как стать автором
Обновить

Комментарии 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) и запускать произвольный машинный код.

Вот... размышляю в этом направлении...

Расскажите об этом поподробней, очень интересно для чего это!

Ваш вопрос заставил меня задуматься :-)
Зачем создавать такие сложности, когда можно на компе эмулятор запустить и развлекаться пока не надоест...
Ответ: хотелось бы эту "энергию ностальгии" направить в менее романтичное, но более прагматичное русло.

Неспешное программирование какого-нить недорогого устройства (D2)
Неспешное программирование какого-нить недорогого устройства (D2)

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

коллекция проектов
коллекция проектов

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

Вместо дорогущщего осциллографа - китайская петарда платка за ~ $20
Вместо дорогущщего осциллографа - китайская петарда платка за ~ $20

Возможно, какой-нить из этих проектов (немного попылившись на полке) однажды пригодится.

Эх как бы я хотел помимо того что знаю, обладать ещё и вашими знаниями. Жаль, что я пока электронику не могу освоить.

Однако, ностальгический комментарий разрастается...

Некоторые варианты.

  1. Программируемый калькулятор (в нем много машинных кодов, запуск программ с выводом на экранчик).
    Или купить БК-0010М, или поискать эмулярор PDP-11 на PC.

  2. КПК Palm IIIe со складной клавиатурой. На нем (прямо на нем) можно создавать, редактировать и выполнять программы на Assembler и C. Замечательная архитектура Motorola DragonBall (или MC68328).
    Мне она нравится больше чем DEC PDP-11, к тому же, 32 бита, работа от двух мизинчиковых батарей.

  3. Телефон на Android с Termux. Это - Linux в кармане, можно подключать мышь и клавиатуру по Bluetooth,
    а также мониторы или телевизоры по кабелю USB Type C - HDMI. Можно создавать программы на любом языке, можно установить Far Manager, редакторы двоичных файлов, редактировать BIN файлы и запускать их.

  4. Raspberry Pi Zero 2W (или другие). Можно работать как на Linux, так и на голом железе.

  5. 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 в браузере. Будет наглядно и понятно для широких народный масс...
Затем нагенерить таких объект-функций сотню-другую (а может и несколько тысяч) и пусть они себе "толкают" друг-дружку по проводникам.
Ну как-то так.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории