Подтвердить что ты не робот

Только что закончил изучение ассемблера x86. Что я могу сделать с этим?

Я только что закончил изучение ассемблерного языка. Но я не мог понять, что я могу реализовать (для практики/как небольшой проект). Было бы здорово, если бы это было что-то полезное для всех.

4b9b3361

Ответ 1

Одним из моих любимых увлечений является Reverse Engineering.

Для того, чтобы пройти через скомпилированный код, требуется прочное знание сборки и использование дизассемблеров/отладчиков. Это позволяет вам изменять, понимать и отбрасывать скомпилированные программы. Каждая новая программа похожа на загадку, ожидающую решения!

Например, многие люди обращаются с играми, такими как Minesweeper, когда они впервые запускаются.

Вот скриншот ключевого раздела кода в Minesweeper, который я отменил некоторое время назад (комментарии на правой стороне): alt text

Это было расположено путем размещения точки останова при вызовах функции rand() и перехода назад в стоп-колл. После некоторого рытья становится очевидным, что:

  • Minefield Height находится в 0x1005338
  • Minefield Width находится в 0x1005334
  • База данных Minefield Baseaddress находится по адресу 0x1005340

Благодаря этим знаниям легко определить местоположение любой шахты в минном поле:

cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);

Затем, с простым циклом и некоторыми вызовами ReadProcessMemory(), у вас есть безумный хакер!

Чтение рукописной сборки намного проще, чем сборка сгенерированного компьютером. Современные компиляторы делают некоторые магические и сумасшедшие вещи для кода для оптимизации, который иногда бывает трудно выполнить. Таким образом, это определенно подтолкнет ваши знания сборки!

Есть много видов деятельности, которые могут от нее отделиться:

  • Обратный скрытый API в библиотеках
  • Пишите расширенные игровые хаки, используя DLL Injection, Code Caves, Function Hooking и многое другое!
  • Понимать ограничения различных схем защиты, используемых программным обеспечением.
  • Обратный файлформат, который не опубликован или не известен, и писать код, чтобы прочитать этот формат для целей взаимодействия.
  • Напишите эмуляторы для различных систем (включая более старые игровые системы!)
  • Понять, как известная программа выполняет определенную задачу.
  • Обратное вредоносное ПО и вирусы, чтобы узнать, как и что они делают.

И еще!

Если вам интересно, я настоятельно рекомендую книгу: Реверс: секреты обратной инженерии

Ответ 2

Вы можете узнать, как работает ОС на низком уровне (прерывания, виртуальная память и т.д.). Сначала напишите загрузчик, который даст вам полный доступ к оборудованию, затем вы можете начать играть с защищенным режимом, программированием VGA и т.д.

Два хороших ресурса:
http://wiki.osdev.org/Main_Page
http://www.osdever.net/FreeVGA/home.htm

[изменить]

Если вы хотите узнать об оптимизации, посетите веб-сайт Agner Fog: http://agner.org/optimize/.

[изменить]

Скопировано из комментария Simucal:

Возможно, вы захотите также добавить ссылку на MikeOS. Это небольшая операционная система, написанная на Ассамблее, которая разработана как инструмент обучения, чтобы увидеть, как работают простые операционные системы. Он имеет хорошо прокомментированный код и документацию: http://mikeos.berlios.de

Ответ 3

Это может показаться очень клише, но вы можете попробовать и ответить на некоторые из вопросов в projectueler с помощью сборки.

Ответ 4

Сегодня ассемблер используется в этих областях:

  • Развитие ядра/ОС. Попросите ребят Linux или проверьте другие проекты ОС там.
  • Разработка компилятора (кому-то нужно перевести языки более высокого уровня в ЦП).
  • Разработка драйверов
  • Встроенные устройства (но все больше и больше перемещаются на более высокоуровневые языки здесь... мой топ-топ работает с Python)
  • Разработка игр для специальных эффектов (но в основном это специальные ассемблерные диалекты для видеокарты).

Ответ 5

Оптимизация. Узнайте, как использовать Intel VTune, если вы программируете в Windows. Здесь вы можете увидеть, где ваши узкие места. Затем перепишите эти процедуры в ассемблере.

Поскольку большинство современных программных средств все время меняется, это больше интеллектуальное упражнение и самодовольство в получении чего-то быстрее, чем бенифита в реальном мире.

Есть один или два человека, которые переписали многие из основных примитивов C, memcpy, memset и т.д. в ассемблере, адаптированном к процессору времени исполнения. Таким образом, код больше, поскольку он имеет дополнительные процедуры, чтобы использовать преимущества расширения процессора, SSE и т.д., Но быстрее. Эти примитивы C часто попадают во многие пакеты .dll, так как большинство программ все время используют память.

Ответ 6

В зависимости от того, насколько хорошо вы изучили сборку, вы можете попробовать написать прошивку для небольших микропроцессоров или даже для небольших устройств, подключенных к вашему компьютеру. Вы также можете попробовать писать полные программные приложения в сборке и дать им красивый графический интерфейс.

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

Ответ 7

Вы можете посмотреть проект liboil:

http://liboil.freedesktop.org/wiki/

Его библиотека для высоко оптимизированных внутренних полос.

Большинство циклов уже имеют реализацию ассемблера x86, но есть еще некоторые петли, которые нужно переписать.

Ответ 8

Вы можете искать робота или контроллер, который может подключиться к вашему параллельному порту и написать несколько классных обработчиков клавиш для их управления. Вы также можете перехватывать вызовы BIOS, такие как Int13 для диска, и записывать некоторые инструменты зеркального отображения диска, драйверы RAID и т.д. Вы можете подключить некоторые преобразователи, такие как Temp/вибрация/давление и т.д. И сделать некоторые данные.

Ответ 9

Я полагаю, вы могли бы попробовать code-golf

Существует также, по крайней мере, один O.S. написанный для ПК в сборке: MenuetOS. (Я понятия не имею, почему.) Они могут захотеть вклады.

Я понимаю, что до изобретения C в начале 1970-х годов большинство операционных систем фактически были написаны на прямой сборке. Я бы не рекомендовал это делать, но вы могли бы написать отдельную программу, просто для удовольствия. Обратите внимание, что CPU запустится в 16-битном режиме, и довольно сложно заставить его переключиться на 32-битные. Вероятно, лучше всего просто написать автономную программу в 16-разрядной версии x86. Вы можете использовать симулятор для разработки.

Ответ 10

По крайней мере теперь вы можете выводить ассемблер из gcc следующим образом:

gcc -c -S test.c -o test.asm

Затем вы можете проверить вывод сгенерированного кода C для образовательных целей.

Ответ 11

Если вы уже являетесь разработчиком на языке программирования более высокого уровня, язык ассемблера позволяет создавать оптимизированные подпрограммы/функции. Я не знаю о других, но Delphi, например, позволяет вам идеально интегрировать ассемблерный код в любой блок и заботиться о параметрах функции и т.д.

Ответ 12

Было бы здорово, если бы это было что-то полезное для всех.

Вы ознакомились с работой компьютеров на низком уровне. Возможность чтения сборки может помочь вам понять, как ведет себя ваш компилятор.

Остальное может вызвать некоторую критику, поскольку оно отражает поляризованный взгляд. На следующий день после одного унылого заложенного проекта мой наставник сказал мне: "Если кто-то, работающий на вас, пишет на собрании, уволите его, чтобы он сохранил вашу собственную работу". Я с ним согласен. С программной точки зрения запись в сборке является слишком сложной.