2009-11-27 1 views
23

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

+3

Это не всегда реализация. Умеренное знание ассемблера может очень помочь при отладке (особенно если вы когда-либо сталкивались с ошибкой генерации кода используемого компилятора). –

+18

Вы изучили сборку без какой-либо конкретной причины? –

+0

Это сообщество wiki? Не уверен, что здесь есть один правильный ответ. – iokevins

ответ

52

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

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

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

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

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

  1. Minefield Высота находится в 0x1005338
  2. минного поля Ширина расположен в 0x1005334
  3. минного поля BaseAddress расположен в 0x1005340

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

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

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

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

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

  1. Reverse скрытые API, в библиотеках
  2. Написать передовые игровые хаков с использованием DLL Injection, код пещеры, функции перекинув и многое другое!
  3. Понимать ограничения различных схем защиты, используемых программным обеспечением
  4. Обратный файл, который не опубликован или известен, и написать код, чтобы прочитать этот формат для интероперабельности.
  5. Напишите эмуляторы для различных систем (включая старые игровые системы!)
  6. Поймите, как хорошо известная программа выполняет определенную задачу.
  7. Обратное вредоносное ПО и вирусы, чтобы узнать, как и что они делают.

И еще!

Если вы заинтересованы, я настоятельно рекомендую книгу: Reversing: Secrets of Reverse Engineering

+12

Черт, это звучит круто. Ты просто заставлял меня переучиваться. +1 – Cybis

+0

Отличное и четкое объяснение! – defines

+0

Какое программное обеспечение вы используете @Simucal? –

0

По крайней мере, теперь вы можете выход ассемблер из GCC, как это:

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

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

3

Вы могли бы взглянуть на проект liboil:

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

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

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

4

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

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

+2

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

+0

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

5

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

5

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

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

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

15

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

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

[Редактировать]

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

[Редактировать]

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

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

+7

+1 для ссылок – jldupont

+0

Ницца, спасибо. – Tebo

+0

Хотелось бы, чтобы я мог выбрать несколько ответов. – claws

5

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

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

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

1

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

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

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

2

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

0

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

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

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

Смежные вопросы