обслуживание призыва

Security Teams



Damage Lab ::: .:[KZ TeaM]:. ::: X-Hack Team ::: :::
  Ответ в темуСоздание новой темы

> Ассемблер - первые шаги. Часть 1: Hello, World!, (c) drmist
drmist
Дата 12.08.2007 - 21:09
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Ассемблер - первые шаги. Часть 1: Hello, World!ВведениеДанная статья - первая из цикла, посвященного программированию на ассемблере. Цикл рассчитан на людей, обладающихминимальным набором знаний в области программирования или лишенных его вовсе, желающих в кратчайшиесроки научится программировать на ассемблере. Тем не менее, знание какого-либо языка программирования, а также представлениеоб устройстве памяти и стека, приветствуется. Я постараюсь предоставить материал в наиболее компактной и доступной форме длятого, чтобы человек, ознакомившись с ним, смог без особого труда и посторонней помощи научится писать на ассемблере иотлаживать программы произвольной сложности для операционных систем семейства Windows. Кроме того, цикл статей будетполезен тем, кто планирует программировать на ассемблере под другие операционные системы (далее - ОС) или использовать егодля иных целей (написание программ-загрузчиков, драйверов устройств и тп).Несмотря на существование множества языков программирования высокого уровня (Си, С++, для неформалов - Delphi, VB и Java :), потребностьв знании ассемблера по-прежнему существует. Если ограничится только программированием пользовательских приложений под Windows,знание ассемблера может потребоваться как минимум при: Отладке приложений Наиболее надежным способом исправления ошибки в программе, когда точная причина ее возникновения неизвестна, является использование отладчика (наиболее популярные - SoftIce, OllyDbg). Последние выводят исполняемый код в виде последовательности ассемблерных команд и, кроме того, отображают состояние памяти, стека и регистров. Таким образом, для владения таким мощным инструментом, как SoftIce, знание ассембера просто необходимо. Оптимизации программ Знание ассемблера дает программисту представление о том, как будет выглядеть его программа в машинном коде после компиляции, что способствует повышению производительности ПО, написанного на языках программирования высокого уровня. Реализации некоторых специфических задач Ни один из языков программирования высокого уровня не предоставляет полноценной возможности написания шелл-кода или реализации сплайсинга API. Ассемблер расширяет круг задач, которые способен решить программист. На мой взгляд, человек, желающий сегодня научиться программировать на ассемблере, столкнется с массой факторов,препятствующих этому. Несмотря на очевидную потребность программистов в этом замечательном языке, мне не встречалисьдостойные отечественные учебники ассемблера (и, если честно, зарубежные тоже). Большинство из тех, что представленысегодня в книжных магазинах, либо устарели (посвящены программированию в MS-DOS под 16-и разрядные процессоры),либо предлагают использовать весьма нерациональный подход к написанию исходного кода (косой взгляд в сторону В. Пирогова).В интернете материалы по теме также не представлены. Я надеюсь, данный цикл статей хотябы частично исправит это досадноенедоразумение.Может случится так, что, прочитав статью до этого места, Вы встретили много незнакомых терминов и Вам стало казаться, чтопрограммировать на асме чрезвычайно сложно. Сразу хочу Вас утешить - значение всех терминов будет объяснено по меренеобходимости. Смею заверить - программировать на ассемблере очень просто. Язык ассемблера похож на игру, вся кажущаясясложность которой заключается в том, чтобы понять скромный набор весьма простых правил.Готовим инструментыКогда программист пишет код программы, он фактически редактирует обыкновенный текстовый файл. Текстовые данные,описывающие код прогаммы, называются исходным кодом. Далее этот код переводится в машинный код, то есть код, понятныйкомпьютеру. Процесс перевода исходного кода в машинный называется компиляцией, за выполнение этого процесса отвечаетспециальная программа - компилятор. На данном этапе нам предстоит выбрать текстовый редактор и компилятор.Я не стану сильно акцентировать внимание на текстовом редакторе, поскольку сам по привычке для программирования наассемблере использую Блокнот =(. Это - вредная привычка, потому я хотел бы посоветовать читателю посмотреть в сторонуфайлового менеджера FAR (желательно наличие плагина Colorer) или же в сторону мощнейшего и к тому же бесплатного редактораNotepad++, скачать который можно сhttps://notepad-plus.sourceforge.net.Сегодня существует по крайней мере два популярных компилятора ассемблера - FASM и MASM. В свое время такжебыл популярен компилятор TASM (Turbo Assembler) производства Borland, но этот продукт уже давно не поддерживается.Компилятор FASM (Flat Assembler, https://flatassembler.net)написан человеком по имени Tomasz Grysztar. Компилятор поддерживает макросы, функцианал которых превосходитвозможности макросов MASM, и имеет собственный весьма удобный графический редактор с подсветкой синтаксиса.MASM (Microsoft Macro Assembler) в свою очередь является "родным" компилятором под Windows. Некоторые программистывыбирают альтернативный вариант (FASM), по их словам, из-за ненависти к корпорации Microsoft, что правда, не мешает имлюбить операционную систему того же производителя. Скачать MASM можно наmasm32.com.Мое мнение: какой компилятор выбрать - исключительно дело вкуса. С одной стороны мощные макросы и удобный встроенныйредактор, с другой - компилятор производства корпорации, выпускающей ОС, под которую мы собираемся писать. Кроме того,при общении с программистами, использующими FASM, я выяснил, что у этого компилятора имеются какие-то проблемы с поддержкойнекоторых форматов файлов. В идеале, конечно, желательно владеть обоими компиляторами.Далее в этом цикле статей я буду (опять таки в силу привычки) использовать MASM. Читателю необходимо принять это вовнимание, поскольку синтаксис компиляторов FASM и MASM несколько отличается. Однако, имя опыт работы с одинм компилятором,ничего не стоит за пару дней научится пользоваться другим.Первая программаПо традиции, изучение любого языка программирования начинается с разбора структуры простой программы, задача которой -показать пользователю строку "Hello, World!". Тем не менее, если Вы считаете, что для Вас будет лучше сначала освоитьнекоторую часть теоретического материала - ничто не мешает Вам начать изучение данного цикла со второй статьи.comment *## File id: HelloWorld.asm #### #### Наша первая программа на асме ##*.386 ; Тип процессора.model flat, stdcall ; Модель памяти; Подключаем заголовочные файлыinclude kernel32.incinclude user32.inc; Подключаем библиотекиincludelib kernel32.libincludelib user32.lib; Секция данных.data; Заголовок Message Box'а szCaption db "Caption", 0; Сообщение, которое мы покажем szHelloMsg db "Hello, World!", 0; Секция кода.code; Точка входаstart: ; Выводим сообщение invoke MessageBox, 0, offset szHelloMsg, offset szCaption, 0 ; Завершаем работу invoke ExitProcess, 0end startПрограммисты часто оставляют в исходном коде комментарии. Комментарии - это информация, игнорируемая компилятором ипредназначенная для человека. Признаком хорошего тона считается подробно комментировать свой код (но не так подробно, какв приведенном примере - главное, чтобы человек, который первый раз видит Ваш код, смог в нем разобраться). MASMподдерживает однострочные и многострочные комментарии. Однострочные комментарии начинаются с точки с запятой и продолжаютсядо конца строки. Многострочные начинаются с "comment [символ]" и заканчиваются после первого встретившегося символа[символ]. В данном примере [символ] равен звездочке. Решетки в начале исходника добавлены для красоты.Строка ".386" определяет процессор, для которого написана данная программа. Эта строка могла быть ".486",".586", ".686" и др. Тип процессора определяет множество поддерживаемых ассемблерных команд. Программа, написаннаядля более старых процессоров может быть запущена в системе с более новым процессором, но не наоборот.Следующая строка определяет модель памяти (flat - плоская) и тип функций. В Windows традиционно используются stdcallфункции. Функции, экспортируемые системой, хранятся в динамических библиотеках (.dll файлах, DLL - Dynamic-link Library,Динамически Подключаемая Библиотека). Например в kernel32.dll хранятся функции для работы с памятью, процессами, файламии каталогами, а в user32.dll - функции для работы с пользовательским интерфейсом. Эти функции известны, как API-функции (API - ApplicationProgramming Interface, Интерфейс Программирования Приложений).В .inc файлах хранится описание API-функций, и строка "include kernel32.inc" говорит компилятору о том, чтонужно воспользоваться файлом kernel32.inc, чтобы получить описание функций, экспортируемых kernel32.dll. Также описаниефункций хранится в .lib файлах. Отличие .lib файлов от .inc заключается в том, что они используются разными программамина разных этапах компиляции (об этом ниже). Подключаются .lib файлы инструкцией includelib.Вобще-то инструкция include, можно сказать, подставляет на свое место содержимое указанного файла. Например, еслископировать какую-то последовательность строк из файла с исходным кодом в файл part.txt, а вместо скопированных строкнаписать "include part.txt", компилятор будет обрабатывать файл с исходным кодом точно так же, как если бы в нем не былосделано никаких изменений.Программа в Windows (да и наверное в любой другой операционной системе) содержит в себе, помимо прочего, секции.Секция - это участок программы, отвечающий за хранение информации определенного типа. Например, секция данных хранитданные, используемые программой: имена ключей в реестре, имена файлов, заголовки окон и тп, а секция кода - машинный кодпрограммы. Строка ".data" говорит компилятору о том, что далее идет секция данных, а ".code" - что секция кода.В секции данных мы храним две строки - одна является заголовком окна, которое мы хотим показать пользователю, а вторая -сообщением, которое должно быть написано в этом окне. Более подробно о "типах данных" и строках мы поговорим в следующейстатье.Любая программа должна иметь точку входа (Entry Point) - место, с которого должно начаться выполнение программы.Имя точки входа указывается в конце исходника программы в формате "end [имя точки входа]", а сама точка входауказывается в секции когда в виде "[имя точки входа]:". В нашем случае [имя точки входа] равно "start", то есть выполнениепрограммы начнется с метки start, после чего все инструкции будут выполняться по очереди, сверху вниз.Инструкция "invoke" означает "вызвать функцию" и имеет формат invoke [имя функции] [,параметры через запятую].Что интересно - в FASM invoke - это макрос, а в MASM - втроенная фича компилятора (подробности - поиск по wasm.ru/forum).В нашей программе мы вызываем две функции - сначала MessageBox, потом ExitProcess. Функция MessageBox экспортируетсяuser32.dll и служит для вывода окон с сообщением на экран. Когда какая-нибудь программа спрашивате Вас "Вы хотите сохранитьизменения в данном файле?", она использует функцию MessageBox. MessageBox имеет четыре параметра,для чего нужны первый и последний - для нас пока не важно. Второй параметр - это адрес строки с выводимым текстом,третий - адрес строки с заголовком окна. Что такое адрес будет расказано во второй статье. Функция ExitProcessэкспортируется kernel32.dll и служит для завершения приложения. Функция имеет один параметр и его значение на данном этапедля нас также не важно. Вызывать ExitProcess для завершения приложения ОБЯЗАТЕЛЬНО - в противном случае программазавершится с ошибкой. А если и зовершится нормально, то только потому, что ошибка произошла, а Вас об этом не уведомили.КомпиляцияИтак, у нас есть исходник программы. Но чтобы превратить его в программу, его нужно скомпилировать. На самом деле подкомпиляцией часто понимают последовательность из двух процессов - саму компиляцию и линковку. Поскольку исходный кодбольшой программы удобно разбивать на несколько файлов, то сначала каждый из файлов компилируется. В результатеиз каждого файла с исходным кодом (как было указано выше в комментариях - ассемблерный код хранится в .asm файлах)получается .obj файл. А уже потом эти .obj файлы объединяются в рабочую программу. Этот процесс называется линковкой (иликомпоновкой) и выполняется специальной программой - линкером (альтернативные названия - компоновщик, линковщик). Еще одинплюc такого подхода - если программист делает изменения в каком-то файле с исходным кодом, ему не нужно перекомпилироватьвсю программу - достаточно создать новый .obj для измененного файла и собрать программу заново, используя его и старые.obj файлы. Для компиляции нашей программы составим .bat файл следующего содержания:rem ------------------------------rem File id: make.batrem ------------------------------set MASMDIR=d:\soft\masm32%MASMDIR%\bin\ml /c /coff /I%MASMDIR%\include HelloWorld.asm%MASMDIR%\bin\link /SUBSYSTEM:WINDOWS HelloWorld.objpauseИнструкция rem используется для создания комментариев в .bat файлах - все аналогично однострочным комментариям висходном коде. Команда set используется для присвоения переменной MASMDIR значения "d:\soft\masm32", то есть полногопути до директории, в которую Вы установили MASM. Далее мы запускаем компилятор - ml.exe. Узнать подробности опринимаемых им параметрах можно, запустив его с ключем "/help". Ключ "/c" означает, что компилятор не долженвызывать линковщик по завершению работы, "/coff" задает формат .obj файла, традиционно используется формат coff,"/I[путь]" задает путь до директории, в которой нужно искать файлы, включаемые в исходник с помощью инструкций include.Без этого ключа пришлось бы писать полный путь до всех подключаемых файлов непосредственно в исходнике, что долго инекрасиво. Последний параметр - имя компилируемого файла. Если в исходнике не содержится ошибок и все было сделаноправильно, компилятор должен создать файл HelloWorld.obj.Далее мы запускаем линковщик - программу link.exe. Параметр "/SUBSYSTEM:WINDOWS" задает тип программы, которую мыхотим получить после линковки. "WINDOWS" соответствует GUI (графическому) приложению, "CONSOLE" - консольной программе.В качестве последнего параметра мы передаем линковщику имена .obj файлов, которые нужно объединить в программу.В общем случае таких файлов может быть несколько, но у нас он пока только один. Если все было сделано верно, линковщикдолжен создать файл HelloWorld.exe. Команда "pause" стоит в конце bat-файла на случай, если во время компиляции произойдуткакие-то ошибки, чтобы окно консоли не закрывалось сразу и можно было прочиать, на что ругались компилятор и линковщик.Возвращаясь к вопросу о разнице между .lib и .inc файлами хочу сказать, что .inc файлы используются компилятором, а.lib - линковщиком. Делаем двойной клик по make.bat. Появится файл HelloWorld.exe. После запуска HelloWorld.exe должнопоявится такое окошко:Рис 1.1 - Наша первая прога :)ЗаключениеИтак, в этой статье мы определились, для чего нужен ассемблер, выбрали текстовый редактор и компилятор, а такженаписали свой первую программу на асме. Правда, пока без особого понимания, что происходит, но и без того работа проделанане малая. В следующей части будет уделено больше внимания теории. Если у Вас возник вопрос, связанный с программированием наассемблере, Вы можете задать его в соответствующемразделе нашей конференции.Пользуясь случаем, я хотел бы поблагодарить товарищей Lanдыш, FreeMan, nerezus и slav0nic за объективную критикуданной статьи - их советы и замечания были по настоящему ценными. Спасибо!01/08/07 © drmist[STNC]Web: www.security-teams.net


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
Kom@nd'Or
Дата 13.08.2007 - 11:40
Цитировать сообщение
Offline



Expert
******

Профиль
Группа: -editors-
Сообщений: 2077
Пользователь №: 48
Регистрация: 2.03.2005



Рейтинг:
(80%) XXXX-


Добавлю от себя 7 коп smile.gif

1. Ещё есть компилятор TASM (природы названия, создания и авторов по памяти не скажу ... )
Cоответственно используются программы tasm и tlink.

2. при компиляции пользуюсь NC ...

3. ВСЯ мощь под XinXP / 2000 / Vista ... не получится использовать - "винда не пустит" ...

ВСЁ доступно или из под DOS либо из-под win98. Для "обхода" защиты win следует использовать "стандвртные" win библиотеки, доступные из любого языка высокого уровня.

4. ASM лучше всего (удобнее) использовать в языках высокого уровня в т. н. "ассемблерных вставках" - основная программа пишется на языке высокого уровня, а на asm - критические процедуры.

5. На асм сложнее работать - больше мех. работы.
на с/с++ вывести в консоль строку текста (из переменной) - вызов одной процедуры printf
на asm - 4-ре строки заполнение служебных регистров + сам вызов.

6. Но то же на asm (вывод строки) доступно большим кол-вом методов -
вызов прерывания, посимвользый вывод, вывод напрямую в видеопамять ...

7. Но никто используя asm НЕ запрещает использовать готовые библиотеки ...


--------------------
--
Hайден неизвестный драйвер, воткните какое-нибудь устройство!
---
[b]Во имя процесса-отца, процесса-сына и святаго root"а... Enter! [/b]
PMICQYahoo
Top
drmist
Дата 13.08.2007 - 14:09
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Справедливости ради стоит заметить, что
1) про TASM я упамянул
Цитата
Сегодня существует по крайней мере два популярных компилятора ассемблера - FASM и MASM. В свое время также был популярен компилятор TASM (Turbo Assembler) производства Borland, но этот продукт уже давно не поддерживается.

2) "винда не пустит" - а кто отменял драйверы режима ядра? Правильно делает что не пускает - юзверам в ring0 делать нечего. Зато админу с самопальными дровами там самое место %)
3)
Цитата
на с/с++ вывести в консоль строку текста (из переменной) - вызов одной процедуры printf
на asm - 4-ре строки заполнение служебных регистров + сам вызов.

Пример вывода в STDOUT:

invoke WriteFile, hStdOut, offset szString, sizeof szString - 1, offset dwTemp, 0

может быть и не одна строчка типа printf("%s", "Hi!"), но и не четыре с каким-то регистрами %)
Кроме того, особо ленивые могут написать макрос для printf


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
DeHunter
Дата 13.08.2007 - 15:27
Цитировать сообщение
Offline



Activist
**

Профиль
Группа: -users-
Сообщений: 72
Пользователь №: 2728
Регистрация: 27.01.2006



Рейтинг:
(20%) X----


Ultraedit я пользовал когда писал на асме чтото. Удобный редактор достаточно. Глянул сейчас интереса ради - emacs поставленый из портов всё красиво подсвечивает. Кстати интересно было бы взглянуть на цикл статей подобный только не под винду, а под никс системы.
/me убежал искать
PMПисьмо на e-mail пользователюСайт пользователяICQ
Top
Kom@nd'Or
Дата 13.08.2007 - 16:56
Цитировать сообщение
Offline



Expert
******

Профиль
Группа: -editors-
Сообщений: 2077
Пользователь №: 48
Регистрация: 2.03.2005



Рейтинг:
(80%) XXXX-


Действительно под никс - это было бы СУПЕР!

в п.6 я писал что это можно сделать разными способами ...
Я знал 2 (+ ещё через вызов printf) ... ты показал ещё один ...

Это ещё раз доказывает МОЩЬ и гибкость языка ...


--------------------
--
Hайден неизвестный драйвер, воткните какое-нибудь устройство!
---
[b]Во имя процесса-отца, процесса-сына и святаго root"а... Enter! [/b]
PMICQYahoo
Top
drmist
Дата 13.08.2007 - 17:01
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Под никсы говорите?
Ну может быть в конце цикла скомпилим что-нибудь на nasm'е %)
Вобще-то в никсах си решает.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
nameless
Дата 13.08.2007 - 21:58
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


По поводу 4х строк кода, для вывода в консоль, возможно имелась виду работа с прерываниями, когда работа ведётся непосредственно с железом. Нас в универе учили именно такому асму =\


--------------------
Мы расправим крылья
PM
Top
Kom@nd'Or
Дата 14.08.2007 - 08:52
Цитировать сообщение
Offline



Expert
******

Профиль
Группа: -editors-
Сообщений: 2077
Пользователь №: 48
Регистрация: 2.03.2005



Рейтинг:
(80%) XXXX-


они, прерывания, родимые ..


--------------------
--
Hайден неизвестный драйвер, воткните какое-нибудь устройство!
---
[b]Во имя процесса-отца, процесса-сына и святаго root"а... Enter! [/b]
PMICQYahoo
Top
Mayofttuscosy
Дата 13.12.2010 - 23:45
Цитировать сообщение




Unregistered












Все клева, тока один нюансик, я не заметил в статье про пути к БД, как сделать так что бы при переносе на другой компьютер не приходилось вбивать пути к БД или перекидывать саму БД в ту директорию из которой программист подцеплял изначально. = Просто набросать в папку с прогой все БД и вызывать их по названию не совсем удобно
Top
Kom@nd'Or
Дата 14.12.2010 - 20:09
Цитировать сообщение
Offline



Expert
******

Профиль
Группа: -editors-
Сообщений: 2077
Пользователь №: 48
Регистрация: 2.03.2005



Рейтинг:
(80%) XXXX-


Что за БД и при чём она к ЭТОЙ теме wink.gif

БОТ?..

Это сообщение отредактировал Kom@nd'Or - 14.12.2010 - 20:10


--------------------
--
Hайден неизвестный драйвер, воткните какое-нибудь устройство!
---
[b]Во имя процесса-отца, процесса-сына и святаго root"а... Enter! [/b]
PMICQYahoo
Top

Опции темы Ответ в темуСоздание новой темы