До сих пор помню многие машинные коды PDP-11 (Электроника-60). Это как первая любовь, помнишь всю жизнь. Создавали программы сразу в машинных кодах в 1985 году, потом записывали на перфоленту. Помню, что код 177 (восьмеричный) - были пробиты все отверстия, в этих местах лента часто рвалась :).
@Сергей Каракулов сказать программисту что уже существует библиотека для решения его задачи. Это все равно что сказать поэту что уже написана песня о любви.
Отличный комментарий! В точку! Они говорят о возможности работы с процессором напрямую, но на деле - предлагают отложить фотошоп и 5 часов подряд рисовать пиксели в пайнте.
Можешь в машинных кодах ? Можешь ) Собственно моя первая программа была в машинных кодах и была взята из журнала Радио (конец 80-ых), в момент когда родители купили компьютер с забавным названием Микроша (процессор КР580) )) Это был кайф от программирования ! Хочешь изучить тему, разбери ее на молекулы. В последующем на чистом машинном написал две игры с псевдографикой и компилятор Форта, начал было трассировщик писать, но школа закончилась поехал дальше учиться. Вспоминаю с ностальгией. Хочу сказать, что если потратить на это определенное время, то даже в коде не сложно программировать. Главное заложить базис в голове. На тот момент, кстати, переходить на ассемблер и не было никакого желания. Казалось, что это лишняя трата времени на писанину. Да и архитектура процессоров КР580 и памяти способствовала, не такая сложная как у современных ПК. С другой стороны при наличии соответствующих инструментов можно и сейчас программировать в коде.
@@marat-nagayev послушайте интервью Стива Возняка, где он говорит что написал компилятор Бейсика для первых Apple на ассемблере. Написал он его за достаточно короткое время. Ну и в качестве кокетства добавлял, что в первой версии не смог или не успел добавить операции с плавающей точкой в бейсике. Вы же не сравнивайте компиляторы сегодняшнего уровня с кучей библиотек и компиляторы 80-ых ! И еще раз - архитектура памяти была упрощенная. При достаточном погружении (практике) писать на машинном языке на тех машинах получалось даже быстрее чем на ассемблере. Вы видимо не представляете объема работы. И уж тем более не представляете внутреннюю красоту языка Форта, ядро которого (без библиотек) может уместиться в кэш современного процессора. И потому, к слову сказать, очень быстрого в исполнении.
А на просторах интернета можете найти людей которые совершили подобный "подвиг" и тоже написали свой компилятор Форта пусть даже и не в машинном коде...
Это понятно и легко. Некст челлендж уровня impossible - сделать исполнение шеллкода, но помещая в rwx память не все инструкции сразу, а по одной. Так, чтобы в памяти в момент исполнения всегда была только 1 инструкция, после исполнения которой идёт ее «затирание» и передача управления на следующую ,которую мы также, как в этом видео прокидываем из кучи. (В куче инструкции могут находится в шифрованном массиве, к примеру) Получится прототип защиты кода в памяти. Либо второй челендж уровня impossible - на вход получаешь тот же шеллкод. Имплементируешь алгоритм для поиска rop гаджетов на основе инструкций своего шеллкода. Импортишь хаотично dll и там ищешь эти гаджеты. Потом передаёшь управление от гаджета к гаджету, тем самым исполняя свой шеллкод. Опять же в таком случае шеллкод будет не в одной странице rwx, а разбросан по исполняемым адресным пространствам разных dll. Осилишь?))
В 80-х годах прошлого века я в Политехнической библиотеке переписывал в тетрадку 16-ричные коды из журнала Apple Magazine и в институте их вбивал на реальном компе, получая в итоге работающую программу. Мой лучший результат - "взломать" текстовый редактор Apple II так, чтобы он понимал кириллицу. Правда, пришлось пожертвовать важной функцией copy/paste блоков текста.
Очень странно, вроде спрашивали написать на машинных кодах, а не на ассемблере. Помню в детстве изучал ассемблер, и при написании программок компилировал их в com файлы, потом через дебагер смотрел что происходит с машкодом, ну и со временем начал писать прямо машкодом com файлы, так как это проще, быстрей, и не нужно компилировать. К примеру вот программа смены текстового видеорежима в досе B8 00 00 CD 10 CD 20 чтобы получить другой видеорежим нужно 00 00 заменить на 03 00. Блин, уже больше чем 25 лет прошло, а до сих пор помню, а что вчера было забыл.
Просто лайк. Те кто когда то ковырялся в Радио86РК, Спецалист, Микроша или в подобных монстрах эры начала персональных компьютеров, помнят, что такое Ассемблер.
basic на квант БК в 1997 году. Первый комп после приставок, у меня был уже Panasonic 3DO, но после знакомство с Квантом, не спал суток двое. Документации не было, просто угадывал для чего какая команда нужна. А потом подарили книгу basic для детей, тут все и началось...
Случайно наткнулся на этот видеоролик. Молодец, что решил попробовать, а то остальные все всё знают, но никто не пробует. Единственно, что я бы дополнил - это про структуру команд в двоичном коде - а это "Здравствуй" двоичный код ))). На счет того, что некоторые из комментаторов говорят что это бесполезно - то они не правы. Если ассемблер дает понимание об архитектуре компьютеров, то машинные кода дают представление об архитектуре чипов. А это уже становиться необходимым для разработчиков ОС и драйверов. В особенности для тех, кто собирает свои платы для компа. *Забыл сказать.* Когда-то во времена, когда компьютеры были маленькими, а программисты умными, шла борьба за размер программы. Памяти было мало, а потому экономили каждый байт. Мне известны случаи, когда программист полностью переписывал код, из-за экономии 2х байт программы! И в таких случаях шли на разные ухищрения - типа перехода во внутрь команды! А это, без знания машинных кодом было не возможно.
Воу-воу-воу полехче это называется binary injection, Хаккер Соер вернулся :) А я вот не сомневаюсь что однажды вот так вот невзначай в развлекательно-обучающем ролике Соер покажет как написать вредоносную программу ;D PS: в сети и на гите можно най ти статьи как написать загрузчик под биос, если понравился этот ролик то лайк Соеру и вам понравиться написать загрузчик т к он не ELF не PE а именно RAW ни каких библиотек и единственная программа которая запустится на вашем ПК после перезагрузки если вы её вздумаете установить :))) PS2: досмотрел видео до конца:) не совсем binary injection но близко к этому :)
На андроид маркете есть эмулятор советского калькулятора электроника мк54. Когда чуваки писали исходный код, вся документация уже была утеряна, а завод лежал в руинах. Так вот оригинальное содержание ПЗУ восстанавливали с помощью микроскопа
На zx spectrum в середине 90-ых только так и программировал. Тысячи строк на ассемблере, оптимизация кода расчитывая количество тактов. Сегодня же 90% кода тормознутый порожняк.
Не говори, ELITE занимала 40 килобайт, а щас я извиняюсь сpaнbIй мессенджер, в котором ни байта графики, только буквы и смайлы - 50 мегабайт ! ) дрова на видяху анадысь качал - 550 мегабайт ! Это ж как надо разучиться программировать так за 30 лет, не понимаю...
Раньше чистый код писали, а сейчас, если что-то надо - фигакс, линкуем целую библиотеку. Нужна поддержка h264 - прилинкуем целый libavcodec в несколько десятков мегабайт и сотней ненужных кодеков и пофиг, что 95% кода оттуда никогда не будет вызываться. Или exe-шник Doom 3 весил 5 мегабайт, а в Doom 2016 два exe-шника, каждый по 100Мб - один для vulkan, другой для opengl - это даже смешно, учитывая, что движок не стал в 20 раз круче. И текстуры раньше сжимали в jpg, а сейчас фигачат без сжатия. Поэтому такие слоновые игры стали.
@@Bublerkin Глупости пишете. То что не будет вызываться в код не попадет. Кто хочет оптимальный код, нет проблем, пишите на С и даже асме можно если сильно нужно. А если операционка мешает есть DOS.
Конечно многое зависит от операционной системы, но в данном случае мы написали только функцию, для выполнения которой надо откомпилированную программу. Используя другие операционные системы (например DOS или Windows 7 x32 (как помнится это последняя ОС поддерживающая COM файлы)) можно писать напрямую в файл и выполнять этот файл. Магия в использовании формата файла COM. По сути ОС при загрузке просто размещает содержимое файла в памяти со смещением 0x100h относительно начала сегмента (начало сегмента занято заголовком содержащим служебные данные, такие как командная строка и прочее) и передает управление на первый байт загруженного файла.
Автор мог, например, взять DosBox, в нем 16-ричным редактором создать COM-файл. запустить и показать - вот то было б реально что просили. А тут, блин, во-первых написал какую-то туфту из 2 команд, даже не Hello, World, а во-вторых - реально писал-то он не в машинных кодах, а на ассемблере.
@@ivankprod Зачем их помнить, на то таблицы есть. И да, я например еще помню что CD - это команда прерывания (и соответственно CD 21 - "int 21h", главное DOSовское API). Но претензии к автору не в том что он не помнит/не знает каких-то кодов (ибо как я сказал выше - это справочная инфа), а в том что заявленное не соответствует сделанному.
Прикольно. Раньше в средних школах учили делать ассемблерные вставки. Потому, что без них не выжать производительность. Теперь это мастер класс от профи.
Евгений, хочу написать, что Вы крутой! Наткнулся на шуточное видео "Голая правда о программистах" и залип на канале просматривая все видео один за другим. Крутая подача, интересные темы! Удачи! Пожалуй подпишусь)
Сначала он в какой-то программе набирает код на языке ассемблера, иструкции, что делать, получает их машинный код в 16-ти ричном формате, потом их загоняет в файл и запускает.
В свое время будучи студентом, без компьютера в тетради писал на wasm 86. Потом переводил в опкоды которые брал из книжки по ассемблеру. На компе в volcov commander, в hex-редакторе вбил программу и потом для инструкций jmp, jnz добавлял реальные смещения. Это была игра змейка. Заработало с первого раза. Отлаживал в уме.
@@КотЧерный-ю1ф В некоторых задачах (типа однобитного цифрового осцилографа) приходится заморачиваться на то, что быстрее: inc eax inc eax или add eax,2
Наткнулся на это видео случайно. В прошлом году на 1 курсе универа проходили C/C++. Практически никак ничего нормально не объяснили, в итоге я так и не понял что такое эти ваши указатели. Для меня это осталось чем-то абстрактным, нет, я понимаю указатели на переменные, вместо того что бы их объявлять заново, но я совсем не понимаю их как аргументы у функций или же если они, как на 1 листинге в видео (4:41) представлены: "char **binaryCode;", "void** mem= ...;", "int (*runCodeFunc) () = mem;". Почему в одном месте звездочка ставится перед переменной, а в другом сразу после типа данных, без пробела, а в третьем вообще в скобках, да еще и после скобок зачем нужен пробел и еще две пустые скобки "int (*runCodeFunc) () = mem;"?
Это простое использование ассемблера, в код которого передается значения в двоичном формате, хотя все остальные значения, как видно на видео, передаются в шестнадцатиричном формате. Ассемблер, это уже не машинный код. Вопрос, наверное, состоял в том, чтобы писать код чисто по адресации, т.е. чисто бинарные числа.
Написание программы в машинных кодах, это когда ты САМ, а не программа, переводишь мнемоники ассемблера в числа, сам рассчитываешь смещения и адреса и вводишь их в файл. Так что, у автора всё по-честному.
@@СергейМоскалёв-с3ь Покажите в видео где там машинный код, написанный автором, а не выведенный компом на экран? Автор использует только ассемблер для данной ОС. push, mov, ret это по вашему машинный код? Почитайте Википедию что такое машинный код. ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4 А вот пример, именно программы, написанной машинным кодом из этой страницы: Программа «Hello, world!» для процессора архитектуры x86 (ОС MS DOS, вывод при помощи BIOS прерывания int 10h) выглядит следующим образом (в шестнадцатеричном представлении): BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
@Vitalii Yarema где же это машинный код? Это просто буковки и циферки. И уж точно, прерывание 10h не имеет отношения к машинному коду. Вы запутались в абстракциях.
@@S0ERDEVS Это вы выложили видео о машинном коде, а не я. Не надо переводить стрелки. Машинный код, к вашему сведению, это только двоичные цифры (0 и 1), которые могут быть представлены при написании кода в шестнадцатеричном представлении. Этот код и сохраняется в байтах в файле, который потом выполняется процессором. Вот и ответьте где у вас на видео машинный код? У вас чистой воды использование инструкций ассемблера. Это, конечно, хорошо, понимать и уметь использовать инструкции ассемблера, но это не машинный код. Что значит прерывание 10h не имеет отношение к машинному коду? Запомните, машинный код, это просто всё в цифрах, без слов mov и других.
На ZX Spectrum все игры таким образом и записывались, заголовок на Basic для инициализации процесса загрузки кода в память с помощью peek и poke, затем простыня из шеснадцатеричных значений. Даже книжки продавали, где можно было вручную переписать несколько страниц кодов и получить игрушку :)
В Windows есть функции VirtualAlloc и VirtualProtect, которые позволяют менять флаги страниц и исполнять код от куда хочешь. Еще можно поменять флаги секций. Это возможно, потому что в Винде сектора данных и кода накладываются друг на друга, занимая одно адресное пространство, Винда использует страничную организацию памяти, а страница может быть и исполняемой и записываемой одновременно. Я так модифицировал одну программу, заставляя ее менять условие во время выполнения.
Интересно, почему не получилось прочитать сразу в mem? У меня все сработало: void *mem = VirtualAlloc(0, dataSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); fread(mem, dataSize, 1, fp); Правда, под виндой и на C++, но разницы быть не должно
Расценивай это как плюс. Не в каждом вузе так хорошо учат студентов физиков программированию. А ведь это очень востребовано в научных исследованиях. (Сам учусь на физике. Программирование присутствует, но не в таком обьеме)
Под DOS-ом, теоретически, можно было сделать всё честно в com-файл. Правда, нужно было правильно сделать заголовок com файла, не помню с окончанием, вроде тоже что-то нужно было. А так, если хотелось побаловаться, в редакторе VC писалась программа на asm, а компилятором, входившем в turbo c, всё компилилось в obj, потом в com (до 32 K).
очень интересно, и наглядно понял конечно не много, но хоть увидел, что это не магия. В в Хогвард) точно теперь не пойду, буду вас смотреть все-таки безопаснее и комфортнее))
Всегда интересовал вопрос, как работают JIT компиляторы, если executable память read only, а тут прямо просвещение снизошло... Все таки mmap умеет очень многое
Может разобрать как работали раньше консоли? интересно, как сделать свой код для запуска другого кода на embedded системе, типа STM чипа или ESP, взяв готовую плату
Это шикарно! Хоть решаемая задача весьма проста, но объяснено все очень доходчиво. Хочется попросить сорцы этого "интерпретатора" и побольше подобных видео. В идеале серия видео про подобные вещи, в частности, от нажатия кнопки включения ПК до полноценного запуска ОС с нюансами того, что кого и как запускает, откуда знает где лежит и т. п.
Помню тайком в армии экспериментировал с самомодифицирующемся кодом. Перед выполнением функция дешифруется, выполняется, а потом опять шифруется. Старый трюк, но очень интересный.
Не, ну это изи)) Давай теперь следующий челлендж : написать программу водя намагниченной иголкой по блину жесткого диска
Vlad Bubliu Лучше перфокарты нет ничего для мануального кодирования
А почему иголкой - сразу ломом :)
Надо было сделать видео, в котором он разговаривает в двоичном коде :)
@@Uni-Coder зачот :)
по обычному блину
То, что 50 лет назад было суровой правдой жизни, теперь выглядит как хитрый трюк ))
не такой уж суровой, если вспомнить какой средний размер программы был в те времена
даже меньше чем 50, в начале 90х игру питон вводил с журнала )
А еще тогда люди не называли код на ассемблере машинным кодом :)
@@KirillBerezin он писал же в машинных кода просто смотрел коды команды соответствующие ассемблер командам или я не прав
@@KirillBerezin потому что код на языке ассемблера != машинным кодам
Как говорится: Ждем курс написания сайта на транзисторах...
жди
@@AntiBandera господин Соер шуток не понимает)
@@ИванНиколаенко-м2р, по-этому - ждём.
ахахахах
Схематически это не слишком сложно. Тут проблема в количестве транзисторов и помехозащищённости.
До сих пор помню многие машинные коды PDP-11 (Электроника-60). Это как первая любовь, помнишь всю жизнь. Создавали программы сразу в машинных кодах в 1985 году, потом записывали на перфоленту. Помню, что код 177 (восьмеричный) - были пробиты все отверстия, в этих местах лента часто рвалась :).
Очень хотелось бы увидеть видео о написании фронтенда сайта на ассемблере, а то HTML сильно тормозит.
тогда и браузер надо свой писать, на веб ассемблере еще может как-то реально.
ну можно сделать фронтенд без html css и js на canvas/webgl + webassembly но зачем, в конечном счете получится своя реализация аналога html и css)
@Сергей Каракулов сказать программисту что уже существует библиотека для решения его задачи. Это все равно что сказать поэту что уже написана песня о любви.
Есть webassembly, но пишешь как бы в движке браузера. Очень крутая и интересная штука
@@СергейКаракулов-в7з в figma кстати так и сделали
Теперь следующий этап - написать собственную ос и захватить 99% рынка
Всего-то и надо 38 лет интенсивного развития.
ru.wikipedia.org/wiki/MS-DOS
38 лет = 324 672 человеко часов
@@KnyPovir просто часов. Человеко-часы это сумма рабочих часов всех людей, которые работали над проектом.
@@Евгений-п1л1ъ/videos
Тогда весь юмор теряется...
@@Евгений-п1л1ъ совершенно верно. когда 40 человек сидят на совещании всего два часа, они убивают две недели рабочего времени.
В наше время это немного похоже на то, как если бы человек вышел из экскаватора и начал копать руками
Когда у тебя есть экскаватор, а надо аккуратно посадить одно семечко в маленький горшочек то почему бы и не вылезти из экскаватора?
@@Veter1992 для этого есть лопата, но уж явно не руками
@@5классвиленкин-ъ4п нет я хочу что бы ты копал руками хочу ! 😂😂😂
@eugene martein так черенок давно уже существует
Отличный комментарий! В точку! Они говорят о возможности работы с процессором напрямую, но на деле - предлагают отложить фотошоп и 5 часов подряд рисовать пиксели в пайнте.
Растёте :) отличная подача и свежий вид )) приятное видео
Alexander Savchenko прикалываешься писюн? Нихуя же непонятно!!!!!
Можешь в машинных кодах ? Можешь ) Собственно моя первая программа была в машинных кодах и была взята из журнала Радио (конец 80-ых), в момент когда родители купили компьютер с забавным названием Микроша (процессор КР580) )) Это был кайф от программирования ! Хочешь изучить тему, разбери ее на молекулы. В последующем на чистом машинном написал две игры с псевдографикой и компилятор Форта, начал было трассировщик писать, но школа закончилась поехал дальше учиться. Вспоминаю с ностальгией. Хочу сказать, что если потратить на это определенное время, то даже в коде не сложно программировать. Главное заложить базис в голове.
На тот момент, кстати, переходить на ассемблер и не было никакого желания. Казалось, что это лишняя трата времени на писанину. Да и архитектура процессоров КР580 и памяти способствовала, не такая сложная как у современных ПК. С другой стороны при наличии соответствующих инструментов можно и сейчас программировать в коде.
написал компилятор пока был школьником в машинных кодах?
мужик не делай из нас дураков, это невозможно
не хватит ни мозгов школьника, ни времени
@@marat-nagayev послушайте интервью Стива Возняка, где он говорит что написал компилятор Бейсика для первых Apple на ассемблере. Написал он его за достаточно короткое время. Ну и в качестве кокетства добавлял, что в первой версии не смог или не успел добавить операции с плавающей точкой в бейсике. Вы же не сравнивайте компиляторы сегодняшнего уровня с кучей библиотек и компиляторы 80-ых ! И еще раз - архитектура памяти была упрощенная. При достаточном погружении (практике) писать на машинном языке на тех машинах получалось даже быстрее чем на ассемблере. Вы видимо не представляете объема работы. И уж тем более не представляете внутреннюю красоту языка Форта, ядро которого (без библиотек) может уместиться в кэш современного процессора. И потому, к слову сказать, очень быстрого в исполнении.
А на просторах интернета можете найти людей которые совершили подобный "подвиг" и тоже написали свой компилятор Форта пусть даже и не в машинном коде...
Это понятно и легко. Некст челлендж уровня impossible - сделать исполнение шеллкода, но помещая в rwx память не все инструкции сразу, а по одной. Так, чтобы в памяти в момент исполнения всегда была только 1 инструкция, после исполнения которой идёт ее «затирание» и передача управления на следующую ,которую мы также, как в этом видео прокидываем из кучи. (В куче инструкции могут находится в шифрованном массиве, к примеру)
Получится прототип защиты кода в памяти.
Либо второй челендж уровня impossible - на вход получаешь тот же шеллкод. Имплементируешь алгоритм для поиска rop гаджетов на основе инструкций своего шеллкода. Импортишь хаотично dll и там ищешь эти гаджеты. Потом передаёшь управление от гаджета к гаджету, тем самым исполняя свой шеллкод. Опять же в таком случае шеллкод будет не в одной странице rwx, а разбросан по исполняемым адресным пространствам разных dll. Осилишь?))
Замечательное видео. Всегда считал машинный код чем-то непостижимым, для реальных хардкорщиков. А после видео, появился интерес к данной теме.
Про ассемблер вы наверное не слышали?
@@andrejvlasov5452 Нет, я слышал про ассемблер
В 80-х годах прошлого века я в Политехнической библиотеке переписывал в тетрадку 16-ричные коды из журнала Apple Magazine и в институте их вбивал на реальном компе, получая в итоге работающую программу. Мой лучший результат - "взломать" текстовый редактор Apple II так, чтобы он понимал кириллицу. Правда, пришлось пожертвовать важной функцией copy/paste блоков текста.
Гений, нет слов, благодаря тебе я сделал генерацию опкодов для моего ассемблера!
Ух... ностальгия аж вспомнился первый курс и радость после написания драйвера на asm для точечно-матричного принтера
А мы писали контроллер для плазменного резака на tasm, на судостроительном заводе, я другу помогал, а так у меня образование фазанка :D
модем для датчиков на магистральных газопроводах - моя дипломная (ассемблер) ))
Красавчик
Очень странно, вроде спрашивали написать на машинных кодах, а не на ассемблере.
Помню в детстве изучал ассемблер, и при написании программок компилировал их в com файлы, потом через дебагер смотрел что происходит с машкодом, ну и со временем начал писать прямо машкодом com файлы, так как это проще, быстрей, и не нужно компилировать. К примеру вот программа смены текстового видеорежима в досе B8 00 00 CD 10 CD 20 чтобы получить другой видеорежим нужно 00 00 заменить на 03 00.
Блин, уже больше чем 25 лет прошло, а до сих пор помню, а что вчера было забыл.
Ютуб просто оракул, уже 4 видео прямо по делу рекомендует
Просто лайк. Те кто когда то ковырялся в Радио86РК, Спецалист, Микроша или в подобных монстрах эры начала персональных компьютеров, помнят, что такое Ассемблер.
куда же без него... половина игр хранило жизни в регистре А , перебор... LD A,254 всегда хватало ))
basic на квант БК в 1997 году. Первый комп после приставок, у меня был уже Panasonic 3DO, но после знакомство с Квантом, не спал суток двое. Документации не было, просто угадывал для чего какая команда нужна. А потом подарили книгу basic для детей, тут все и началось...
@@VERTinBY А DEC A на INC A менял, чтобы жизни, когда помираешь, увеличивались? :)
Синклер-Спектрум!!!
Помню как клавишам действие научился присваивать, лучший день в жизни был LET команда :)
Случайно наткнулся на этот видеоролик. Молодец, что решил попробовать, а то остальные все всё знают, но никто не пробует. Единственно, что я бы дополнил - это про структуру команд в двоичном коде - а это "Здравствуй" двоичный код ))).
На счет того, что некоторые из комментаторов говорят что это бесполезно - то они не правы. Если ассемблер дает понимание об архитектуре компьютеров, то машинные кода дают представление об архитектуре чипов. А это уже становиться необходимым для разработчиков ОС и драйверов. В особенности для тех, кто собирает свои платы для компа.
*Забыл сказать.* Когда-то во времена, когда компьютеры были маленькими, а программисты умными, шла борьба за размер программы. Памяти было мало, а потому экономили каждый байт. Мне известны случаи, когда программист полностью переписывал код, из-за экономии 2х байт программы! И в таких случаях шли на разные ухищрения - типа перехода во внутрь команды! А это, без знания машинных кодом было не возможно.
Воу-воу-воу полехче это называется binary injection, Хаккер Соер вернулся :)
А я вот не сомневаюсь что однажды вот так вот невзначай в развлекательно-обучающем ролике Соер покажет как написать вредоносную программу ;D
PS: в сети и на гите можно най ти статьи как написать загрузчик под биос, если понравился этот ролик то лайк Соеру и вам понравиться написать загрузчик т к он не ELF не PE а именно RAW ни каких библиотек и единственная программа которая запустится на вашем ПК после перезагрузки если вы её вздумаете установить :)))
PS2: досмотрел видео до конца:) не совсем binary injection но близко к этому :)
Напиши нейросеть в двоичной коде
Го в троичном
Го в квантовом
Сделаю вид, что понял твоё высказывание)
Можно умереть наверное прежде чем ее написать до конца. Нужна что то выше этого примитива.
А ты знаешь толк в извращениях.
Настоящие мужики делают свой проц в spice-симуляторе со своим блекджеком и опкодами.
Я не настоящий, я всего лишь с Microblaze работаю :-P
пфф.. на 155 логике они его делают))
@@andrsam3682 пффф.... даже на релюхах;)
На андроид маркете есть эмулятор советского калькулятора электроника мк54. Когда чуваки писали исходный код, вся документация уже была утеряна, а завод лежал в руинах. Так вот оригинальное содержание ПЗУ восстанавливали с помощью микроскопа
@@Pan-ux3bq по руке от терминатора)
На zx spectrum в середине 90-ых только так и программировал. Тысячи строк на ассемблере, оптимизация кода расчитывая количество тактов. Сегодня же 90% кода тормознутый порожняк.
Не говори, ELITE занимала 40 килобайт, а щас я извиняюсь сpaнbIй мессенджер, в котором ни байта графики, только буквы и смайлы - 50 мегабайт ! ) дрова на видяху анадысь качал - 550 мегабайт ! Это ж как надо разучиться программировать так за 30 лет, не понимаю...
@@parametrico нету смысла что-то экономить в ущерб времени разработки когда ресурсы довольно дешёвые
Это где такое сегодня ? 👀90 % порожняк ? 🥴та ты фуфло какое-то гонишь . Кто залайкал тя непойму .такие же фуфела как и ты походу 🤾
Раньше чистый код писали, а сейчас, если что-то надо - фигакс, линкуем целую библиотеку. Нужна поддержка h264 - прилинкуем целый libavcodec в несколько десятков мегабайт и сотней ненужных кодеков и пофиг, что 95% кода оттуда никогда не будет вызываться. Или exe-шник Doom 3 весил 5 мегабайт, а в Doom 2016 два exe-шника, каждый по 100Мб - один для vulkan, другой для opengl - это даже смешно, учитывая, что движок не стал в 20 раз круче. И текстуры раньше сжимали в jpg, а сейчас фигачат без сжатия. Поэтому такие слоновые игры стали.
@@Bublerkin Глупости пишете. То что не будет вызываться в код не попадет. Кто хочет оптимальный код, нет проблем, пишите на С и даже асме можно если сильно нужно. А если операционка мешает есть DOS.
Конечно многое зависит от операционной системы, но в данном случае мы написали только функцию, для выполнения которой надо откомпилированную программу. Используя другие операционные системы (например DOS или Windows 7 x32 (как помнится это последняя ОС поддерживающая COM файлы)) можно писать напрямую в файл и выполнять этот файл. Магия в использовании формата файла COM. По сути ОС при загрузке просто размещает содержимое файла в памяти со смещением 0x100h относительно начала сегмента (начало сегмента занято заголовком содержащим служебные данные, такие как командная строка и прочее) и передает управление на первый байт загруженного файла.
Автор мог, например, взять DosBox, в нем 16-ричным редактором создать COM-файл. запустить и показать - вот то было б реально что просили. А тут, блин, во-первых написал какую-то туфту из 2 команд, даже не Hello, World, а во-вторых - реально писал-то он не в машинных кодах, а на ассемблере.
@@_ProstoTak А Вы помните хоть некоторые команды в 16-ичном виде сами?
@@ivankprod Зачем их помнить, на то таблицы есть. И да, я например еще помню что CD - это команда прерывания (и соответственно CD 21 - "int 21h", главное DOSовское API).
Но претензии к автору не в том что он не помнит/не знает каких-то кодов (ибо как я сказал выше - это справочная инфа), а в том что заявленное не соответствует сделанному.
Крутой чел, реально интересно. Очень долго искал подобный контент на ютубе, спасибо!
Классное видео. Я считаю что что такой формат очень полезный, особенно для хардкорщиков)
Странно по твоему создатели KolibriOS и API Vulkan хардкорщики, или же люди старающийся сделать быстрее работу железа?????
@@СашСавар-ф5д И то и другое
Прикольно, но хотелось бы увидеть реализацию elf/exe с нуля, без кода посредника и вмешательства компилятора ))
Прикольно. Раньше в средних школах учили делать ассемблерные вставки. Потому, что без них не выжать производительность. Теперь это мастер класс от профи.
В школе и про TASMучили. И то "профи" не до конца все понимают, объясняют.
Мы с вами наверно в разных школах учились, потому как в нашей всё ограничилось HTML
@@ВеселыйРоджер-н7ыв нашей школе учили word...
@@ВеселыйРоджер-н7ы В нашей вообще всё ограничивалось вордом и экселем
У нас в школе максимум был Паскаль.
Как всегда Soer на высоком уровне👍👍👍 хотя код низкоуровневый 😂
Евгений, хочу написать, что Вы крутой! Наткнулся на шуточное видео "Голая правда о программистах" и залип на канале просматривая все видео один за другим. Крутая подача, интересные темы! Удачи! Пожалуй подпишусь)
Как чистый Сишник охринел от того что ты сделал)) сразу подписался!)
Очень здорово, что Вы подняли эту тему.
Ссылка на функцию - "гениально". С таким же успехом можно было показать, как колить на опкодах в дизассемблере :)
Всегда было интересно узнать ответ на этот вопрос. Спасибо, подписался!
Очень интересно, но не чего непонятно
Сначала он в какой-то программе набирает код на языке ассемблера, иструкции, что делать, получает их машинный код в 16-ти ричном формате, потом их загоняет в файл и запускает.
Ещё бы показали как писать на джава шикарно было бы и понимать в том хоть что то
@@MisaNia25, это все есть здесь же, на ютубе. Просто нужно писать соответствующий запрос на поиск, а не комментарий к видео.
Начни с грамматики русского языка, а потом все легче пойдет
@@КонстантинПетров-у5ц всЁ пойдЁт, действительно. Нужно знать русский
Ждем выпуск с перфокартами!)
С перфоратором. 😂
Ой какое чудесное видео! Познавательная и интересная! А сам парень Соер умный то какой!
Он же сказал, что только кажется умным.
Круто, жду ещё видосов на ассемблерные темы. Хотя из названия я ожидал увидеть очередной тьюториал по MS-DOS DEBUG, но оказалось тоже очень интересно!
Отличная подача, все выглядит очень простым и понятным, хотя с ассемблером не знаком.
Отличный материал! Шикарный канал в целом!
В свое время будучи студентом, без компьютера в тетради писал на wasm 86. Потом переводил в опкоды которые брал из книжки по ассемблеру. На компе в volcov commander, в hex-редакторе вбил программу и потом для инструкций jmp, jnz добавлял реальные смещения. Это была игра змейка. Заработало с первого раза. Отлаживал в уме.
Не знаю как я попал на это видео, но я все внимательно посмотрел, но ничего не понял, спасибо , интересно было
Последние несколько дней об этом думал как раз ! )))
Читаешь мысли)
Действительно интересно. Спасибо
Пролог и Эпилог (push, pop) не требуется
Просто: mov eax, 5 ; ret;
Вот их этих лишних push и pop образуются тормоза у всех программ.
@@Slawaxx Стек в быстрой процессорной памяти, в кэше. Так что пох.
@@КотЧерный-ю1ф В некоторых задачах (типа однобитного цифрового осцилографа) приходится заморачиваться на то, что быстрее:
inc eax
inc eax
или
add eax,2
push pop нужны, первый вариант - mov eax, 5 - это только частный случай!
в общем же случае используется стек, для этого его надо переопределить
Вот что значить thinking in binary! Я начиная с этого видео подписался на ваш канал, но теперь думаю, что и комментарий не помешал бы! :)
Ну наконец-то я тебя нашел, адекватный канал, с интересным контентом))
Респект автору! Открыл для себя нечто новое)
спасибо, прям напомнило как в универе прогали КП580 вводя 16ричные команды в терминал УМК...
Что я сейчас посмотрел? Что происходит? Зачем мне это? Какой вообще в этом смысл?
Но, блин, так интересно!
Наткнулся на это видео случайно.
В прошлом году на 1 курсе универа проходили C/C++. Практически никак ничего нормально не объяснили, в итоге я так и не понял что такое эти ваши указатели.
Для меня это осталось чем-то абстрактным, нет, я понимаю указатели на переменные, вместо того что бы их объявлять заново, но я совсем не понимаю их как аргументы у функций или же если они, как на 1 листинге в видео (4:41) представлены: "char **binaryCode;", "void** mem= ...;", "int (*runCodeFunc) () = mem;".
Почему в одном месте звездочка ставится перед переменной, а в другом сразу после типа данных, без пробела, а в третьем вообще в скобках, да еще и после скобок зачем нужен пробел и еще две пустые скобки "int (*runCodeFunc) () = mem;"?
Еще бы что-то такое =) Супер, спасибо!!
Ты крут. Спасибо. Ничего не понял. Но было интересно.
Я всегда об этом думал.Но думал это не реально. Мое уважение Soer
Это простое использование ассемблера, в код которого передается значения в двоичном формате, хотя все остальные значения, как видно на видео, передаются в шестнадцатиричном формате. Ассемблер, это уже не машинный код. Вопрос, наверное, состоял в том, чтобы писать код чисто по адресации, т.е. чисто бинарные числа.
Не нужно останавливаться - числа нужно вводить с перфокарт
Написание программы в машинных кодах, это когда ты САМ, а не программа, переводишь мнемоники ассемблера в числа, сам рассчитываешь смещения и адреса и вводишь их в файл. Так что, у автора всё по-честному.
@@СергейМоскалёв-с3ь Покажите в видео где там машинный код, написанный автором, а не выведенный компом на экран? Автор использует только ассемблер для данной ОС. push, mov, ret это по вашему машинный код?
Почитайте Википедию что такое машинный код.
ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
А вот пример, именно программы, написанной машинным кодом из этой страницы:
Программа «Hello, world!» для процессора архитектуры x86 (ОС MS DOS, вывод при помощи BIOS прерывания int 10h) выглядит следующим образом (в шестнадцатеричном представлении):
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
@Vitalii Yarema где же это машинный код? Это просто буковки и циферки. И уж точно, прерывание 10h не имеет отношения к машинному коду. Вы запутались в абстракциях.
@@S0ERDEVS Это вы выложили видео о машинном коде, а не я. Не надо переводить стрелки. Машинный код, к вашему сведению, это только двоичные цифры (0 и 1), которые могут быть представлены при написании кода в шестнадцатеричном представлении. Этот код и сохраняется в байтах в файле, который потом выполняется процессором.
Вот и ответьте где у вас на видео машинный код? У вас чистой воды использование инструкций ассемблера. Это, конечно, хорошо, понимать и уметь использовать инструкции ассемблера, но это не машинный код.
Что значит прерывание 10h не имеет отношение к машинному коду?
Запомните, машинный код, это просто всё в цифрах, без слов mov и других.
На ZX Spectrum все игры таким образом и записывались, заголовок на Basic для инициализации процесса загрузки кода в память с помощью peek и poke, затем простыня из шеснадцатеричных значений.
Даже книжки продавали, где можно было вручную переписать несколько страниц кодов и получить игрушку :)
В Windows есть функции VirtualAlloc и VirtualProtect, которые позволяют менять флаги страниц и исполнять код от куда хочешь. Еще можно поменять флаги секций. Это возможно, потому что в Винде сектора данных и кода накладываются друг на друга, занимая одно адресное пространство, Винда использует страничную организацию памяти, а страница может быть и исполняемой и записываемой одновременно. Я так модифицировал одну программу, заставляя ее менять условие во время выполнения.
4:10 - А если сначала создать регион исполняемой памяти, получить ссылку на него и по ней загружать файл?
блин ностальгнул сразу в 1990 год ))) для zx spectrum писали игрухи ))
Интересно, почему не получилось прочитать сразу в mem?
У меня все сработало:
void *mem = VirtualAlloc(0, dataSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
fread(mem, dataSize, 1, fp);
Правда, под виндой и на C++, но разницы быть не должно
ну ты же mem все равно алоцировал
@@LtGenFlower Так соер два раза аллоцирует, когда можно один раз
@@Uni-Coder костыль :)
Особенно тема про непонимание шуток интересная! Можно развернуть её подробнее?
Спасибо большое, классные видео
Прикольно. Это вступление к инструкции "Как делать вирусы"?
Эх, даже нас в универе этому учат, а я как бы вообще на квантовой радиофизике
Расценивай это как плюс. Не в каждом вузе так хорошо учат студентов физиков программированию. А ведь это очень востребовано в научных исследованиях. (Сам учусь на физике. Программирование присутствует, но не в таком обьеме)
@@Blendershick та я не спорю, просто наш факультет это электроника с основ, но програмипование кусками, это просто составляющая курса микропроцессорв
@@gorglefterov3532, сделай сталкер 2
Если мы не заглянем в будущее оно кнам не прейдёт
Очень интересно. Подскажите 2-3 книги небольшого объема (можно и на английском) чтобы лучше понять о чем здесь речь?
10из10 дядька всегда смотрю и очень нравиться
Помню подобное описывал Крис Касперски в статье "Дизассемблирование в уме".
когда ты программист ПХП. Смотришь на магию =)
нет, просто вспоминаешь лицей и первые курсы универа... и то, что это было у тебя в прошлом веке )))
@@orkoteg09 Этот прошлый век работает шустрее любой программы написанной на чем угодно, KolibriOS слышал?
@звизданутое солнце говно с мочей
Отличный контент. Спасибо огромное
Ждал пока это кто-то сделает, красава!
Под DOS-ом, теоретически, можно было сделать всё честно в com-файл. Правда, нужно было правильно сделать заголовок com файла, не помню с окончанием, вроде тоже что-то нужно было. А так, если хотелось побаловаться, в редакторе VC писалась программа на asm, а компилятором, входившем в turbo c, всё компилилось в obj, потом в com (до 32 K).
А можно тоже самое, тольк обез ОС? К примеру, Я хочу реализовать данный метод на cortex-m3 камне, как быть? Спасибо!
Вот они.... Монстры IT. Чувак, у тебя просто лучший материал!
Блин,он гений! Я то думал он реально на машинном коде будет писать
Какие лучше очки купить для работы на компьютере
Soer, А чем вы в свободное время занимаетесь?
круто, часто Soer так развлекается для души?)
очень интересно, и наглядно понял конечно не много, но хоть увидел, что это не магия. В в Хогвард) точно теперь не пойду, буду вас смотреть все-таки безопаснее и комфортнее))
Подскажите как вызывается функция с двумя параметрами через указатель на функцию без параметров. Разве компилятор пропустит?
Всегда интересовал вопрос, как работают JIT компиляторы, если executable память read only, а тут прямо просвещение снизошло... Все таки mmap умеет очень многое
Хз как на линуксе но всегда можно сказать что память rwx
Ты чего матом-то ругаешься?
Скажите ещё что-нибуть на JIT компиляторном.
А разве нельзя сразу спроецировать файл через mmap без чтения?
Типа как-то так: mmap(NULL, dataSize, PROT_READ | PROT_EXEC, MAP_PRIVATE, fp, 0)
Чётко и по-полочкам!!!
А будет отдельное видео про структуру опкодов? Хотелось бы послушать про это какие-нибудь интересные подробности.
отлично ждём ролик где вы пишите bare metal программу
Может разобрать как работали раньше консоли? интересно, как сделать свой код для запуска другого кода на embedded системе, типа STM чипа или ESP, взяв готовую плату
Это шикарно!
Хоть решаемая задача весьма проста, но объяснено все очень доходчиво.
Хочется попросить сорцы этого "интерпретатора" и побольше подобных видео. В идеале серия видео про подобные вещи, в частности, от нажатия кнопки включения ПК до полноценного запуска ОС с нюансами того, что кого и как запускает, откуда знает где лежит и т. п.
Помню тайком в армии экспериментировал с самомодифицирующемся кодом. Перед выполнением функция дешифруется, выполняется, а потом опять шифруется. Старый трюк, но очень интересный.
Признаки шпионажа
Оч хорошо! А про __cdecl, __fastcall и другие можно поподробнее в другом видео (и про то, когда параметров у функции много)?
Весьма познавательно!
Может попробуешь написать очень простую OC?
Все, теперь модули для qt писать буду не на js, а в бинарном коде
Стало интересно. В одном из коментах к требованиям чувак писал один вроде шутки. Сделать частицы воды на ассемблере... Стал копать в теме..
грамотный мужик, лайк
Круто! Я только программу "Hello World" в машинных кодах писал.
Иж как исхитрилса... А вообще, очень познавательно!
Соер, вопрос, как выучить вообще коды?
Подскажите пожалуйста, где можно обучиться сео?
Огонь. Больше про асм
да просто супер! спасибо за видео
Здравствуйте! Возможно ли выполнять системные вызовы из выделенного региона памяти?
познавательно. Для общего развития пойдет.