Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Семикаленова

.pdf
Скачиваний:
8
Добавлен:
23.03.2016
Размер:
10.56 Mб
Скачать

121

Используемая в ОС Windows 95 модель (способ) распределения памя­ ти называется непрерывной. В такой модели не существует строгого деле­ ния на сектора и сегменты, а значит, прсярамма может свободно обрап^ться к любому адресу всего адресного пространства (4 Гб, ограничение наклады­ вается 32-разрядной адресной шиной компыотера). ОС считается многоза­ дачной, если работающие параллельно щюграммы не могут воздействовать друг на j^yra. Для этс»х> в ОС Wind^vs каждая пда»е щеяоств/иктся свое личное адресное пространство размером около 2-х Гб. За пмшицы своего адресного пространства задача выйти №с может, так же, как ниюисая ,1фугая задача №t может работать с данным прост|кшств<ш - этом и определяется автономность задачи.

Предоставлением адресного пространства и загрузкой в него 1фограммы занимается менедж^) памяти Windows. Для этого за каждой программой закрепляется два важных параметра:

1. Адрес Ж1грузхи. Это адфес, начиная с которого программа будет {^с- полагаться в памяти. Следует запомнить, программы в Windows всегда загру­ жаются по одному и тому же адресу - адресу загрузки, это сильно o6jKr4HT эксперту р^оту в идущей. Как было )^сазано шшге, каждой ггрофамме пре­ доставляется свое адфесное пространство размах»! около 2-х Гб, начиная с адреса 4000000(Hi (символ h означает, что число зшгисано в шестнадцат^ичной системе счислешш).

2. Точка входа в программу. Это адрес, с котс^юго начшшется выполне­ ние программы. Он может находиться в любой части прог1кммы, в большин­ стве случаев он расположен практически в самом ее конце.

В заключение приведем еще один очень важный для эксперта асггект: ОС Windows не позволяет программе производил» изменения в сплести кода (т.е. программа не способна изменять свой код), единешеняое, что она может - производить изменения в области данных, что o^t^a» мжт>, т.к. поденное ограничение запрещает программистам делать самомодифицирующиеся про­ граммы. Это в свою очередь сильно облегчает р£1еботу экспертам СПКЭ.

122 Заслуживает внимания еще одно базовое положение о функщшх про­ грамм, используемое в Reverse Engineering. При написании прогцтым, часто возникает такая ситуация, когда необходимо одну и ту же последователь­ ность команд использовать в разных ее частях. Для этого последовательность оформляют отдельным блоком, который называется функцией, и помещают либо в самый конец программы, либо в ее начало. Поскольку в разных частях i^oipaMnoi функция должна р^1отать с ра^оьош дая1а>1ми, то виутри саатй функции они прописываются как аргументы функции, а в тех местах про­ граммы, где функция используется, ставят «ссылки» - вызовы функщш, и £ ^

гументу присваивается необходимое значение.

Необходимо отметить, что при создгщии программных продуктов эксперт СПКЭ может иметь дело с двумя видами функций: собственными функциями программиста и стандартнь»ш, рш:полагаюиц1мися в .dll 6 » ^ лиотеках, чаще всего функциями Win32 API. Win32 API (Aplication Programming Interface) - это набор функций, которые ОС Windows предос­ тавляет разработчику для использования в своих про1р£ммах при обеспе­ чении взаимодействия с операционной системой '^'.

Для API-функций пришгты следукшще соглашения^^^:

-аргументы в функцию передаются в обратной последовательно­ сти (сначала последний аргумент, затем - предпоследний и т.д.);

-коррекция стека производится самой функцией.

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

'^'Использованы материалы сайтю: www.euax»oftro, www.]i»cto«>fii.com, lit4}://citfonim.ra.

'^ См., HanpHMq), Orwr о науч1ю-1Кжждо№П«яьсп>Я работе 1&4епщи и срсдст» решения задач компыотерно-технической экспертизы // З^ключигешишй отчет. Тема НИР; Ус<ю А.И. Методы и средства решения задач 1к»шыо1Ее1»ю-1«хвнческой эхеае1рггизы: Учебное пособие. -М.: ГУ ЭЩ МВД России, 2002

123 ошибке. Гфоцесс уда/юния из стека аргументов, переданных в функцию, на­ зывается коррекцией стека. Эта операция может производиться либо виут^м самой функции (в самом ее конце), либо сразу после вызова функции в том месте программы, откуда этот вызов осуществлялся. Во всех API-функциях коррекция стека производится внутри самих этих функций. Кроме передачи данных в функцию, она сама тоже должна что-то возвращать в программу. Возвращаемое фугасци^ значоше (обычяю одио, ио бывает и боз^ызж) пере­ дается в регистре еах.

Проведения экспертного исследования про1раммно1х> обеспечения невозмохшо без изучения регистров. Регистры является составной частью процессора. Они используются для временного хранения информации. Ин­ тенсивное использование регистров в прогршк«ме определяется тем, что скорости доступл к ним ншьшш^ больше, чем к яч^^кшл тюамжт. 32-х ^irные процессоры имеют 16 регистров. Рассмотрим лишь основные и наибо­ лее часто используемые из них: регистры общего назна^жия, ука:м1тель инструкций, регистры сегментов и регистр флагов.

Регистры общего назначения"^ - 32-х битные регистры общего назначе­ ния еах, d>x, есх, е ^ esi, ecti, еЬр и е ^ ыогут храшпъ следующие типы даюных:

-операнды для логических и а1»1фметических оп^>аций;

-oпqpaнды для расчета ащзесов;

-указатели на ячейки памяти.

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

'^ Использованы ъшкраазвлхЯВ^га. http://citfonim.ni

124

Многие команды используют конкретные регистры для >фШ1ения своих операндов. Например, команды обработки текстошк строк используют со­ держимое регистров вех, esi и edi в качестве операндов.

Основные случаи использования регистров общего назначения:

-еах - используется для хранения операндов и результатов опера­

ций;

-еЬх - как укхштелъ на данные в cent^Hie ds;

-есх - как счетчик для строковых оп^шщй и циклов;

-edx - указатель для ввода/вывода;

-esi - указатель на данные в сепьсенте ds, а также I^K у|^эа'рель на источник в командах работы со строками;

-edi - указатель на данные в сегменте es, а также как указатель на п^жемник в командах ра^ты со строками;

-esp - указатель вершины стека в сегменте ss;

-ebp - указатель на некоторые данные в стеке.

В регистрах, оканчивающихся на х, можно обращаться к младшим 16-и битам (ах, Ьх, сх и dx соответственно), которые в свою очередь можшэ разделить на старший байт (ah, bh, ch и (fit) и младший (а1, Ы, с1rt<Q) и {м- ботать с ними, как с регистрами длиной 8 бит. Регистры-указатели esp (указатель вершины стека) и et^ (базовый регистр), а тшсже индексные ре­ гистры esi (индекс источника) и edi (индекс приемника) допускают только 32-битное обращение.

Регистры сегментов "Vcs. ds, ss, es, fe и gs) хранят 16-ти "битные деск­ рипторы сегментов. Дескрипторы сегментов - это специальные указатели, определяющие расположение сетента в памяти. В защищенном режиме ра­ боты процессора (Windows 95/98) все сегментные решстры указывают 1ш один и тот же сегмент, поэтому обычно в программе они не исполь^^уюя.

124 Использованы ывяериалы сайта ht^://citfi)nnn.ru

125 Регистр флагов'" - этот регистр хфедставляет собой набор флшгов, уста­ навливаемых или сбрмюываемых по результатам выполня^»1Ых команд. Флаг - это переменная длиной 1 бит, используемая в командах условного перехода. Если значение этой переменной равно 1, то считается, что флаг установлен, если О - сброшен. В первую очередь эксперта будет инт^)есовать: флаг нуля,

флаг переноса и флаг знака:

-флаг нуля (zf) устан£шлнвается в случае полу^юиия иуле^го ре­ зультата при выполнении очередной комацды и сбрасывается при осталь­ ных ненулевых значениях;

-флаг переноса (cf) устанавливается при переносе или заеме стар­ шего бита в арифметических операциях, в остальных случаях сбрасывает­ ся;

-флаг nepenojH^iHfl (of) устанавливается, если результат арифме­ тической операщ1и не умещается в операнде-приемнике;

-флаг знака (sf) устанавливается при единичном значении старше­ го бита результата - признаке отрицательного числа.

Одной из частных экспфтных задач при производстве судебной про-

граммно-компьюте1»юй экспертизы любого программного средстш1 является преодоление защиты на исследование программного модуля. В основном, подобные защиты можно разделить на два класса - когда защитные процеду­ ры внедряются в программы на этапе ее разргвботки, и навесные защиты - ко­ гда программа упаковывается в так называемый «конверт» - специальную защитную программу. Еще встречается комбинированный »ютод — когда в самой про1рамме есть какие-либо защитные процедуры, и дополнительно применяют внешние модули, для усложнения «взлома» программы.

Практически всегда в исследуемых прогршь1мах присутствуют анти­ отладочные модули, иногда они также еще и упакомлвают защищаекц^ю

'^^ Использованы М8те1шалы сайта ht^://citfi)tmn.nt

126 программу. В зависимости от типа защиты существуют и различные мето­ ды доступа к модулям защищенных про1рамм.

Программы с комбинированной защитой удобнее перед экспертным исследованием распаковать для того, чтобы можно было внести в программу необходимые изменения. Если распаковка по каюим-либо причинам невоз­ можна, тогда можно воспользоваться спещ1альной программой - гап-(1пю patcho*. В защищеииой прог[»мме с шимощью отладчика находятся участок, который необходимо откорректировать. Найденные данные вносятся в «patcher», потом с его помощью запускается исходная программа, и <фа1сЬег» исправляет в запустившейся и распакованной программе нужные байты.

Любую систему защиты можно преодолеть - это следует из того, что ее команды однозначно интфпретируются процессором. При этом время, необ­ ходимое для преодоления хорошей сжгтемш защиты, оказывается сраш1имым с написанием защищенной программы заново. Однако не все программы пи­ шут профессионалы, поэтому часто можно (^йти защту, Ш1йдя ее слабое звено, и тем самым со1фатить время доступа к модулю на несколько порядков. Для этого, с целью использования в практической работе эксперта СПКЭ, можно рекомендовать следующие достаточно универсальные методы*^:

-если программа защищена только от средств статического анали­ за, она легко изучается динамически, и наоборот;

-«метод изменения одного байта» - в момент, когда система защи­ ты сравнивает контрольную информацию (состояние операционной среды, контрольную сумму) с эталонной, изменением команды п^зехода, она на­ правляется по праюшьному пути;

-аналогично, результат работы функции, возврЕш^ающей текущую контрольную информацию, может ^ыть подменен шл эталонное (ояощаемое) значение (например, с помощью 1юрехвата соответствующего преры­ вания);

126 www.pik»aina.imi.ttt

127

-в программах с защитой, требующей швесга имя и соответствую­ щий ему код, можно разобраты;я в алгорипмю генерации этого кода и напи­ сать программу, которая будет по введенному имени гене1^ювать пра­ вильный код.

-в про1раммах с привязкой к компьютеру, когда защищенная про­ грамма по каким-либо его параметрам (дата БИОС, серийный номер жест­ кого диска, его модель, модель материнской шюты и процессора и цр.) ге­ нерирует код и просит пользователя ввести ответный код, можно предпри­ нять действия аналогичные предыдущему пункту;

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

Впрофессиональн1сс С1ютемах защиты все эти приемы не проходят, и потребуются многие дни кропотливой работы в отладчике, чтобы разобрать­ ся в их функционировании. Для исследовгшия таких систем необходимы спе­ циальные эксп^этные средства, либо использование иных, не экспертных ме­ тодов работы.

riqxneKTHBHHM нащалленисы ра:шития методического обеспечения судебно-экспертного исследования про1раммных (федств является интерпре­ тация программы в полностью виртуальной среде. В этом случае эмулируют­ ся процессор, память, внешние устройства, операционная среда и т.д. В ре­ зультате - все описанные приемы противоде1кггвия оказываются неэффек­ тивными. Однако какой бы прозрачной не была эмуляция среды, все равно она отличается от настоящей, и программа может это распознать со всеми вытекающими отсюда последствиями. Самым трудным и слабым местом здесь будет точная эмуляция временных ха1шктеристик аппаратуры, недоку­ ментированных прерываний и т.п.

Также можно отметить еще одну npd&jKuy, стоящую перед экспертом при исследовании защиты от стацдартных отладочных <^>едств. Это о1слежи-

128 ванне прерываний, перехватываемых исследуемой про1рамм<^. Суть iipoблемы заключается в следующем.

Практически все стандартные отладчики для обеспечения своей нор­ мальной работы используют, как минимум, 1-е и 5-е прерывания. Первое прерывание, называемое также трассировочным, используется для осуществ­ ления пошагового режима работы отладчика. Третье прерывание необходимо дшЕ устаношш мжток останоыш прог^^ла&к во Щ1^есам^ ожхредсляеашм 1юш>- зователем. Защитный механизм программы обязательно должен перехваты­ вать указанные прерывания для предотвращения беспрепятственного анализа защищенной прохраммы под отладчиком. Следовательно, очередной задачей эксперта на данном этапе является отслеживание момента перехвата. Бели эта задача решена, то далее он может продвигаться по одному из следующих 2-х путей.

Во-первых, можно запретить п^^ехват прерываний nymi о^ода дан­ ного участка программы. В этом есть доля риска, так как тщррогришлы об­ работки соответствующих прерываний могут мшолнять некото|Шс «полез­ ные» фунюдии, необходимые для нормальной работы программы. Если же этот путь оказшкя тупиковым, то можно пойтя по втс^ЮА^г пути. Необяза­ тельно запрещать перехват прерывш1ий. Если квалификшщя ^сспфта доста­ точно высока, и защитный механизм программы позволяет это сделать, то можно изменить подпрограммы обработки 1Ч)ерываний таким образом, что­ бы после отработки своих функций они не сразу воз^>аи|алн бы управление в основную программу, а передавали бы его соответслцющим подпрограммам отладчика.

Далее остановимся на сущности ряда экспе>тных методов по исследо­ ванию программных продуктов '^^.

Отключение МОДУЛЯ проверки'^. Модификация кода модуяя за1щгш с целью обойти 1фове1жу или исказить ее резулышты " одаш ю ная^Ьяее рйс-

'''ДОЛП1НА.Е. За11Щ1ВП1Ю11>аммногообес11ечен1потнсслеяо»Ш1П./1К:КЫ1, специаш^ный выпуск, Москва, 1992 г.

129 пространенных методов в исследовании прог^юммы. Но он также и является самым трудоемким и длительным.

Моделирование обращений к ключевой дшскете . Если не удается скопировать ключевую дискету, можно попробовать имитировать необходи­ мый формат с помощью специальной прогрш1Мы, возвращеиощей в профш^- му защиты все те коды завершения и ощибки, что и при нормальной работе. Чаще всего такой метод пршмеияется тогда, когда зшдита прове|»1ет шишчию какого-либо повреждения на поверхности дискеты, причем делает это 4qpe3 функции BIOS/INT 13h. В этом случ^ весь процесс длится не более несколь­ ких минут. Хотя даже обращения к контроллеру гибкого диска через порты можно отследить, отлаживая программу в защищенном режиме. Тгосже {или почти тшсже) можно имитировать обращения к электронному ключу на LPT или СОМ порту.

Снятие программы из памяти . Последнее вре1)1я появилось множест­ во программ, снимающих навесные защиты методом снятия из пшк1яти (Сир386, Intruder, 1се£)ш1:ф, РгосЕУштф). Принцип здесь очень прост. После того как защита отработала и дала разрешение на выполнение, в 1шмяти на­ ходится исходная про1рю1ма в таком тке виде, как будто ее запустили о^1чным образом, без всяких защит. Если в этот мокюнт содержимое ОЗУ запи­ сать на диск, то из получившегося dmnp можно извлечь п^воначальную программу. В лучшем случае получается работоспособный ЕХБ-файл, прак­ тически идентичный первоначальной программе (правда, для этого процесс получения дшпр нужно будет повторить два раза, для нахождения элементов таблицы перемещений - Relocation Table).

Хотя иногда удобнее подойти к этим программам так же, как к про­ граммам с встроенной защитой. Для распространенных типов навесных за­ щит существуют универсальные программы дяя их «нятяя. Почти казродая

128

Использованы магье1талы сайта: http://piMic.kubai.-ni/~usK)27l6/protect/ '^ Там же

'^Тамже

130 программа вызывает функцию завершения. Если ее п^жхватитъ, то высока вероятность, что программа в момент завышения в памяти не зат^>та, т.е. можно проанализировать ее систему защиты и/или саму программу.

Методы зашиты от отладчика'^'. К этим методам в настоящее время относятся:

-подавление изменения операщюнной среды - программа либо са­ ма еще раз переиаст|»иш1ет среду, либо вообще не может работать в из­ мененной среде;

-противодействие установке контрольных точек - отладчик или не может установить контрольную точку, или программа распознает ее;

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

-использован1ю «пустышек»;

-переход на свои подпрограммы мояжо осуществлять из обработ­ чиков прерываний;

-запрещение прерываний от клавиатуры приводит к зависанию отладчиков реального режима;

-пе1яюдически следует проверять контролы{ые суммы отдельных участков прогршлмы, с целью избежать их изм^1ения, HsatpHMep, установ­ ки контрольных точек;

-использование переназначения прерываний: обмен содержимого векторов int 21h и int lOh. Отладку не предотвращает^ но сильно затрудняег;

-расшифровку защищенной программы через int 08h/int ICh. От­ ладку не предотвращает, но сильно затрудняет;

-изменение DRx регистров приводит к печальным результатам для отладчи1а>в;

'^* Использованы материалы сайта: http://public.kubsu.ni/~usT0271 e/protect/