Я только что закончил изучение ассемблера. Но я не мог понять, что я могу реализовать (для практики/как небольшой проект). Было бы здорово, если бы это было что-то полезное для всех.Только что закончил обучение ассемблеру x86. Что я могу сделать с этим?
ответ
Одним из моих любимых увлечений является обратная инженерия.
Для этого требуется прочное знание сборки и использование дизассемблеров/отладчиков для прохождения скомпилированного кода. Это позволяет вам изменять, понимать и отбрасывать скомпилированные программы. Каждая новая программа похожа на загадку, ожидающую решения!
Например, многие люди обращаются с играми, такими как Сапер, когда они впервые начинают.
Вот скриншот ключевого участка кода в Сапер я отменил некоторое время назад (комментарии по правой стороне):
Это было расположено, помещая точку останова на вызовы функции rand()
и шаговой назад в callstack. После некоторого копания становится очевидным, что:
- Minefield Высота находится в 0x1005338
- минного поля Ширина расположен в 0x1005334
- минного поля BaseAddress расположен в 0x1005340
С этим знанием он становится легким для определения местоположения любой данной шахты в минном поле:
cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);
Затем, с помощью простой петли и некоторых звонков на ReadProcessMemory()
, у вас есть безумный хакер!
Чтение рукописной сборки намного проще, чем сборка сгенерированного компьютером. Современные компиляторы делают некоторые магические и сумасшедшие вещи для кода для оптимизации, который иногда бывает трудно выполнить. Таким образом, это определенно подтолкнет ваши знания сборки!
Есть тонны действий, которые могут ответвляются от этого:
- Reverse скрытые API, в библиотеках
- Написать передовые игровые хаков с использованием DLL Injection, код пещеры, функции перекинув и многое другое!
- Понимать ограничения различных схем защиты, используемых программным обеспечением
- Обратный файл, который не опубликован или известен, и написать код, чтобы прочитать этот формат для интероперабельности.
- Напишите эмуляторы для различных систем (включая старые игровые системы!)
- Поймите, как хорошо известная программа выполняет определенную задачу.
- Обратное вредоносное ПО и вирусы, чтобы узнать, как и что они делают.
И еще!
Если вы заинтересованы, я настоятельно рекомендую книгу: Reversing: Secrets of Reverse Engineering
По крайней мере, теперь вы можете выход ассемблер из GCC, как это:
gcc -c -S test.c -o test.asm
Затем вы можете проверить вывод сгенерированного кода C для образовательных целей.
Вы могли бы взглянуть на проект liboil:
http://liboil.freedesktop.org/wiki/
Его библиотека для высоко оптимизированной innerloops.
Большинство петель уже имеют реализацию ассемблера x86, но есть еще некоторые петли, которые можно переписать.
В зависимости от того, насколько хорошо вы изучили сборку, вы можете попробовать написать прошивку для небольших микропроцессоров или даже для небольших устройств, подключенных к вашему компьютеру. Вы также можете попробовать написать полные программные приложения в сборке и дать им красивый графический интерфейс.
В целом, по моему опыту, сборка не так полезна в программировании массовых программных проектов, потому что для многих приложений скорость не имеет большого значения (по крайней мере, не в дни многоядерных процессоров), поэтому то, что вы можете сделать, несколько ограничено.
Кроме того, если вы не очень хорошо разбираетесь в оптимизации кода, скорее всего, компилятор будет генерировать более быстрый код. –
Скорость имеет значение, но, к счастью, вам не нужно писать на ассемблере, чтобы получить отличную скорость для ваших приложений. Кроме того, вы в значительной степени должны быть сборщиком гуру, чтобы бить современный компилятор при оптимизации. –
Это может показаться очень клише, но вы можете попробовать ответить на некоторые вопросы по адресу projectueler, используя сборку.
Сегодня ассемблер используется в следующих областях:
- Kernel/развитие операционной системы. Попросите ребят Linux или посмотрите другие проекты ОС там.
- разработки компилятора (кто-то должны перевести высокоуровневые языки в ЦП)
- развития драйвера
- Встроенных устройства (но все больше и больше переходит на высокоуровневые языки здесь тоже ... мой сет топ работает коробка Python) разработка
- игры для специальных эффектов (но это в основном в конкретных ассемблере диалектов для видеокарты)
Если вы уже является разработчиком на языке программирования высокого уровня, язык ассемблера позволяет создавать оптимизированные подпрограммы/функции. Я не знаю о других, но Delphi, например, позволяет вам идеально интегрировать ассемблерный код в любой блок и заботиться о параметрах функции и т. Д.
Вы можете узнать, как работает ОС на низком уровне (прерывания , виртуальная память и т. д.). Сначала напишите загрузчик, который предоставит вам полный доступ к оборудованию, после чего вы сможете начать играть с защищенным режимом, программированием 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
Оптимизация. Узнайте, как использовать VTune от Intel, если вы программируете в Windows. Здесь вы можете увидеть, где ваши узкие места. Затем перепишите эти процедуры в ассемблере.
Поскольку большинство современных программных средств все время изменяется, это более интеллектуальное упражнение и самодовольство в получении чего-то быстрее, чем benifit в реальном мире.
Есть один или два человека, которые переписали многие из основных примитивов C, memcpy, memset и т. Д. В ассемблере, адаптированном к процессору времени выполнения. Таким образом, код больше, поскольку он имеет дополнительные процедуры, чтобы использовать преимущества расширения процессора, SSE и т. Д., Но быстрее. Эти примитивы C часто попадают во многие пакеты .dll, так как большинство программ постоянно занимают память.
Я полагаю, вы могли бы попробовать code-golf
Существует также по крайней мере, один младший матрос написанный для ПК в сборе: MenuetOS. (Я понятия не имею, почему.) Они могут захотеть вклады.
Я понимаю, что до изобретения C в начале 1970-х годов большинство операционных систем были фактически записаны в прямом сборке. Я бы не рекомендовал это делать, но вы могли бы написать отдельную программу, просто для удовольствия. Обратите внимание, что CPU запустится в 16-битном режиме, и довольно сложно заставить его переключиться на 32-битные. Вероятно, лучше всего просто написать автономную программу в 16-битном x86. Вы можете использовать симулятор для разработки.
Вы можете найти робота или контроллер, который может подключиться к вашему параллельному порту и написать несколько классных обработчиков клавиш для их управления. Вы также можете перехватывать вызовы BIOS, такие как Int13 для диска, и записывать некоторые инструменты зеркального отображения диска, драйверы RAID и т. Д. Вы можете подключить некоторые преобразователи, такие как Temp/вибрация/давление и т. Д., И сделать некоторые данные.
Было бы здорово, если его что-то полезное для всех.
Вы ознакомились с работой компьютеров на низком уровне. Возможность сборки может помочь вам понять, как работает ваш компилятор.
Остальное может вызвать некоторую критику, поскольку оно отражает поляризованный вид. На следующий день после одного унылого заложенного проекта мой наставник сказал мне: «Если кто-то, работающий на вас, пишет на собрании, уволите его, чтобы он сохранил вашу собственную работу». Я с ним согласен. С программной точки зрения, письменной форме в сборе слишком хлопотно.
- 1. Только что закончил обучение основам обратной инженерии. Как продвигаться дальше?
- 2. Обучение ассемблеру без опыта программирования
- 3. Слишком длинный указатель Textinput. Что я могу сделать с этим?
- 4. Что такое createChooser, когда я должен использовать намерения? Что я могу сделать с этим методом?
- 5. Что делать, когда я закончил многопоточность
- 6. Что я могу сделать с Oracle JDK, что я не могу сделать с OpenJDK
- 7. Что я могу сделать с PHP
- 8. Что я буду делать с этим AppID?
- 9. Что случилось с этим кодом?
- 10. Что такое привилегированное обучение?
- 11. Я не могу понять, что не так с этим рандомизатором
- 12. Что я могу сделать с EJB?
- 13. Что я могу сделать с номером Java?
- 14. Что я могу сделать с Seed?
- 15. Что я могу сделать с JSON?
- 16. Что я могу сделать с документом PMML?
- 17. Что я могу сделать с делегатом CALayer?
- 18. Что я могу сделать с переменной перечисления?
- 19. Что я могу сделать с виртуальными классами?
- 20. Что я могу сделать со старым компьютером?
- 21. Как я могу узнать, что iframe закончил загрузку?
- 22. Что с этим форматом
- 23. Как я могу зарегистрировать, что элемент с этим идентификатором удален?
- 24. что с этим кодом? Я только начал изучать Python
- 25. Что с этим SQL
- 26. Что происходит с этим CSS3? я не могу найти его
- 27. Есть ли что-нибудь, что я могу сделать, чтобы остановить небольшое отставание страницы, вызванное этим кодом?
- 28. что с этим кодом?
- 29. Что я могу сделать для метода clone()?
- 30. Что я делаю неправильно с этим CSS?
Это не всегда реализация. Умеренное знание ассемблера может очень помочь при отладке (особенно если вы когда-либо сталкивались с ошибкой генерации кода используемого компилятора). –
Вы изучили сборку без какой-либо конкретной причины? –
Это сообщество wiki? Не уверен, что здесь есть один правильный ответ. – iokevins