Просто законченное изучение x86 ассемблер. Что я могу сделать с ним? [закрытый]

Интересная статья, обсуждая за и против использования итераторов:

http://www.sei.cmu.edu/pacc/CBSE5/Sridhar-cbse5-final.pdf

25
задан DigitalRoss 27 November 2009 в 17:20
поделиться

11 ответов

Одно из моих любимых хобби - обратная инженерия.

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

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

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

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

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

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

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

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

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

Существует множество действий, которые могут быть ответвлены от этого:

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

И еще!

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

55
ответ дан 28 November 2019 в 17:43
поделиться

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

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

[Edit]

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

[Edit]

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

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

15
ответ дан 28 November 2019 в 17:43
поделиться

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

5
ответ дан 28 November 2019 в 17:43
поделиться

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

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

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

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

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

5
ответ дан 28 November 2019 в 17:43
поделиться

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

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

4
ответ дан 28 November 2019 в 17:43
поделиться

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

2
ответ дан 28 November 2019 в 17:43
поделиться

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

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

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

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

3
ответ дан 28 November 2019 в 17:43
поделиться

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

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

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

1
ответ дан 28 November 2019 в 17:43
поделиться

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

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

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

0
ответ дан 28 November 2019 в 17:43
поделиться

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

0
ответ дан 28 November 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: