Анимация
JavaScript
|
Главная Библионтека QyKHO использовать как антиотладочное средство, - на отлаживаемом процессе не jgH быть установлен флаг ptrace. Другими словами, к одному процессу одноврем{ нельзя подключать несколько отладчиков. Данный способ можно использовать для защиты от отладки и/или проверки нал1-отладочных средств, но об этом мы поговорим позднее. Итак, для подключения к процессу используется команда attach pid, где pid - иде) фйкатор запущенного процесса. Есть, правда, еще один минус - невозможность отладки дочерних процессов. J] в том что при использовании системного вызова fork() создается дочерний проц идентификатор которого отличается от родительского. В этом случае мы его теряем. Для того, чтобы отключится от процесса, нам нужно выполнить команду detach. Защита от отладки и дизассемблирования. Рассмотрим несколько простых мето защиты от исследования. Действенный прием защиты от отладки процесса - установка флага ptrace на н К примеру, чтобы проверить, запущен ли отладчик, нужно в теле программы помест вот такой код: if (ptrace(PTRACE TRACEME, О, 1, 0) < 0) return 1; Другой способ - это проверка на установленные контрольные точки. Как извест контрольная точка - это прерывание по номеру 3. Вот ее мы и будем проверять: if ((*(volatile unsigned *)((unsigned)fоо + Si Oxff) == Oxcc) return 1; Для защиты от дизассемблирования можно осуществлять переход в какую-то то профаммы таким образом, чтобы дельта не была кратна длине команды. Дизассембл( под Linux, округляющие дельту до кратности команды, формируют код, отличающи от оригинала. jmp antidebugl + 2 antidebugl: .short ОхсбОб call reloc reloc : popl lesi jmp antidebug2 antidebuq2: addl $(data - reloc),%esi movl 0(%esi),%edi pushl %esi jmp *%edi data : .long 0 (gdb) s printint (number = - 53 2 4 ) Входим в функцию printintQ. При этом отладчик показывает стек, передаваемый функции. Мы видим, что значение, передаваемое в стеке, не соответствует 5. Начинаем разбираться. (gdb) up 11 0x1625 Возвращаемся на щаг назад до выполнение функции. (gdb) р i $i = -5324 Проверяем значение переменной 1. Как видим, мы забыли инициализировать эту переменную. Так что нужно вернуться в профамму и дописать до вызова функции printint 0,1 = 5. Заметьте, что при вызове функции, при выходе из нее или даже при использовании команд up и down отладчик всегда показывает окно стека: название функции и значения аргументов, передаваемых ей. Исследование core файлов. Core файл - файл, содержащий в себе полное описание процесса при аварийном заверщении профаммы. Для анализа такого файла необходимо запустить отладчик и, не устанавливая контрольных точек и не запуская профаммы, ввести команду (gdb) core prog.core. Если вы находитесь в том каталоге, что и сам core файл, то вы увидите что-то вроде этого: Core was generated by a.out Program terminated with signal 11, Segmentation fault. Cannot access memory at address 0x7020796d #0 0xl64a in foo(i=0x5) (gdb) В данном случае профамма заверщилась неудачно при попытке доступа к недоступной ей области памяти. Порой достаточно полезно посмотреть, как была вызвана функция, так как проблема могла возникнуть еще до начала работы фушщии. Команда bt позволяет распечатать back-trace стека вызовов. (gdb) bt #0 0х1б4а in foo(i=0x5) #1 Oxefbfd 8 8 8 in end () #2 Oxl62c in main () (gdb) Функция end() вызывается в тот момент, когда рущится профамма. Функция fooO была вызвана из функции main(). Подключение к выполняющемуся процессу. Основным достоинством отладчика GDp является возможность подключатся к процессам и отлаживать их во время выполнения Для этого необходимы достаточные права доступа и одно условие, которое впоследств"" рдава 5. Программирование на ассемблере nog Windows 31 Глава 5 Программирование на Ассемблере под Windows Программирование на ассемблере под Win32 воспринимается весьма неоднозначно Считается, что написание приложений слишком сложно для его применения. Собственно обсуждению того, насколько оправдана такая точка зрения, и посвящена данная глава. Она не ставит своей целью обучение профаммированию под Win32 или обучение ассемблеру; подразумевается, что читатели уже получили определенные знания в этих областях. В отличие от профаммирования под DOS, где профаммы, написанные на языках вьюокого уровня, были мало похожи на свои аналоги, написанные на ассемблере, приложения под Win32 имеют гораздо больше общего. В первую очередь, это связано с тем, что обращение к системным сервисам операционной системы в Windows осуществляется посредством вызовов функций (подпрофамм), а не прерываний, что было характерно для DOS. Здесь нет передачи параметров в регистрах процессора при обращении к системным вызовам и, соответственно, нет множества результирующих значений возвращаемых опять же в регистрах общего назначения и регистре флагов. Следовательно, проще помнить и использовать правила взаимодействия с ОС. Но с другой стороны, в Win32 нельзя непосредственно работать с аппаратными ресурсами, чем "фешили" профаммы для DOS, произвольно адресовать любые участки оперативной памяти и т. д., что является следствием работы процессора в защищенном режиме. В современных инструментах ассемблирования развиваются возможности, которые ранее были характерны только для языков высокого уровня. К таким средствам можно отнести: макроопределения вызовов процедур, возможности введения их шаблонов (описание прототипов) и даже объектно-ориентированные расширения. Однако ассемблер сохранил и такой прекрасный механизм, как макроопределения, вводимые пользователем, полноценного аналога которому нет ни в одном языке высокого уровня. Все эти факторы позволяют рассматривать ассемблер как самостоятельный инструмент для написания приложений под платформы Win32 (Windows NT/2000/XP и Windows 9х/МЕ). 5.1. Выбор инструментария На сегодняшний день доступно достаточно много средств, позволяющих разрабатЫ вать приложения под Windows на языке ассемблер. Однако, на взгляд автора, их обсу* дение в рамках одной главы книги неминуемо увело бы в сторону от основного вопрс" (]оэтому ниже приводится лишь список доступных трансляторов и интсфированны ред разработки, а внимание будет сосредоточено лишь на том инструментарии, коте оым пользовался автор при подготовке материала, хотя окончательный выбор, естес венно, остается за читателем. Итак, что же нам предлагают поставщики средств разработки для профаммировани ассемблере под Windows. Существует несколько пакетов. Основными являютс iHicrosoft MASM 6.1х или 7.0, Borland TASM 5.Ox, NASM, FASM и еще несколько мене известных разработок. Как Вы уже наверно заметили, TASM и MASM разработаны соф тверными гигантами Borland и Microsoft, они в основном предназначены для создани профамм для MS-DOS и Windows. Другие пакеты обладают своими уникальными осе бенностями: для профаммирования под «ассемблерной» ОС Menuet используется FASM пакет NASM разработан как бесплатная альтернатива TASM и MASM, но, кроме этого содержит определенные расширения синтаксисе. Обычно пакет ассемблера состоит из транслятора исходного текста в объектный код компилятора ресурсов и компоновщика. Именно от компоновщика (Linker) и зависит под какой ОС будет работать результирующая прОфамма. Для создания и последующей редактирования файлов исходного кода применяются различные текстовые редакторы После завершения редактирования файл исходного кода передается на трансляции ассемблеру, а затем результат ассемблирования обрабатьгеается линковщиком (компо новщиком) для получения исполняемого модуля. Эти шаги выполняются последователь но, друг за другом, вызовами соответствующих инструментов из пакета ассемблера. Однако существуют специализированные интефированные системы разработки, авто матизирующие этот процесс. Кроме, непосредственно, автоматического получения испол няемого модуля, подобные системы обладают рядом полезньтх свойств, таких, как настраи ваемая подсветка синтаксиса (удобный выбор цветов синтаксических элементов) автоподсказка и автозавершение при вводе исходного текста, поддержка различньух пакетов ассемблера, возможность свертки процедур и других блочных конструкций при навигации по исходному коду (collapsing), редактирование ресурсов. Вот некоторые из извест-ньк интефированных сред разработки, поддерживающие разработку программ на языке ассемблер: RadASM, WinASM, Negatory Assembly Studio, Visual SlicicEdit, Source Insight. Для дальнейшего обсуждения вопросов профаммирования для Windows из этого многообразия инструментов выбере.м свободно распространяемые в сети ИНТЕРНЕТ пакет ассемблера MASM32 и среду быстрой разработки программ RadASM. На момент написания книги это были, соответственно, версии 8.0 и 2.0.3.8. Ни в коем случае автор не навязывает читателю свое мнение, и сам выбор не претендует на абсолют -зто Лишь одни из многих достойных продуктов. . MASM32 (http: www.masm32.com/). Автор - Steve Hutchesson. Профаммный ком-кс MASM32 представляет собой набор следующих компонентов: свободно распро-"фаняемый транслятор с языка ассемблер Microsoft MASM 6.14, набор специализированных утилит, простейший редактор исходных текстов и, что является самым ценным ArJiernbJer masni Ploject Tjipe OWin32App OOosApp C; Console App О 0 OS App (com) OolPioject OUB Project C/NMAKEProiect © WpT2SJilnolJesJ RoiectNanne: Hello World чу ProjectDescription TheHelloWorld application Projects Folder- С \RadAsmSl.asrr,\Proec(s Q Template; Q Далее > Отмена Puc. 5.2.1. Мастер проектов - тип u имя Win32 App Console App Dll Project LIB Project NMAKE Project Win32 App (no res) Dos App Dos App (.com) Оконное приложение Windows Консольное приложение Windows Динамически связываемая библиотека Windo Статически связываемая библиотека Windc Проект, собираемый утилитой NMAKE Приложение Windows без встроенных ресурс Приложение DOS в формате ехе Приложение DOS в формате com Далее необходимо задать название проекта (Project Name), оно также будет име папки проекта, и его описание (Project Description). Описание проекта - это надг которая отображается в заголовке окна проекта при его открытии в RadASM. Здесь же можно изменить путь, по которому будет располагаться папка проекта (Рп Folder), и выбрать шаблон (Template) из папки шаблонов. Шаблон - вспомогательный инструмент, который разрабатывается для автоматиз процесса создания приложений и реализующий концепции быстрой разработки (RAD - F Application Development). При создании нового проекта вы можете выбрать один из гот( шаблонных сценариев. Шаблонный сценарий - нечто большее, чем просто включение за! вок .asm файлов в новый проект, он может установить любые опции .rap файла (файла oi проекта), подключить внешние бинарные данные и создать все необходимые исхо, Файль[ для вашей профаммы. Шаблоны очень полезны при создании множества npoq с однотипным начальным каркасом ресурсов и стартового кода. Шаблонные сценарии могут быть созданы средствами RadASM, однако этот во выходит за рамки обсуждаемой в данной главе темы. для начинающего профаммиста под Windows, фомадное количество примеров и доку. ментации к ним, средства поддержки системных вызовов Windows. RadASM (http: radasm.visualassembler.com/). Автор - Ketil Olsen. Этот продукт сделан программистом на ассемблере для программистов на ассемблере. Кроме того, сам проект полностью написан на ассемблере. Здесь мы имеем быструю, небольщую по объему и бесплатную интефированную оболочку, поддерживающую работу с солидным списком трансляторов (в том числе и MASM32) и написанную энтузиастом для таких же энтузиастов, обладающую достаточной функциональностью разработки для малых и средних проектов. 52. Начало работы После успещной установки выбранных профаммных средств и запуска среды RadASM она автоматически будет сконфигурирована на использование MASM32 (далее предполагается, что MASM32 установлен в C:\MASM32, а RadASM в C:\RadASM). С легкой руки Дениса Ричи повелось начинать освоение программирования в какой-либо новой среде с создания простейшей программы "Hello, World". Не будем рушить традицию и добавим еще один "Hello, World" в его копилку. Центральное понятие при разработке в RadASM - проект. Проект содержит перечень всех исходных файлов (тексты на языке ассемблер, файлы ресурсов, файлы описания диалоговых окон), правил и команд, необходимых для их трансляции и сборки в готовое приложение. RadASM использует свой собственный формат представления ресурсов диалогов и таблиц строк, но в момент сборки приложения создаются стандартные .res и .ГС модули для передачи компилятору ресурсов из пакета MASM32. Проект размещается в своей собственной директории (в настройках RadASM можно указать место размещения по умолчанию для вновь создаваемых проектов), имея при этом произвольное число вложенных поддиректорий. Рекомендуется наличие директории RES, которая используется для хранения .гс файлов ресурсов и ВАК, которая содержит резервные копии (backups) файлов, создаваемых RadASM каждый раз, когда происходит запись их обновленных (исправленных) версий на диск. В корневой директории проекта размещаются как минимум файл описания проекта .rap и файл на языке ассемблер, имеющий ссылки на остальные файлы исходного кода, подключаемые транслятором при ассемблировании. Итак, после запуска среды RadASM выбираем в меню File пункт New Project и в следующем окне задаем тип создаваемого нами проекта, как показано на рис. 5.2.1. Первый лист мастера создания нового проекта позволяет выбирать тип транслятора, с помощью которого будет вестись разработка программ. По умолчанию это MASM (нас это устраивает). Как видно из рисунка, мастер проектов позволяет создавать готовые окружения для разработки различных типов приложений. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [ 50 ] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |