Техника отладки Крис Касперски ака мыщъх Спецвыпуск: Хакер, номер #057, стр. 057-020-3 Таким образом, в момент вызова CreateFile lpFileName будет лежать по смещению 4, относительно ESP, и условная точка останова будет выглядеть так: "bpx CreateFileA if (*(esp >4)=='keyf')". Имя файла, заключенное в кавычки, автоматически преобразуется отладчиком в 32-разрядную константу, поэтому его длина не должна превышать четырех байт, причем отладчик чувствителен к регистру ('keyf' и 'Keyf' для него - не одно и то же), а вот файловая система - нет. В большинстве случаев частичного сравнения имени оказывается вполне достаточно. Если же будет недостаточно, можно прибегнуть к оператору AND и сравнивать несколько четырехбитных подстрок за раз. Синтаксис условных точек останова подробно описан в документации на SoftIce, так что не будем останавливаться на этом. Многие защиты противостоят брякам, например, начиная выполнение API-функции не с первого байта. В таких случаях приходится прибегать к установке brakepoint'ов на native-API - своеобразному фундаменту операционной системы, ниже которого находятся только порты ввода/вывода и драйверы. Описание функций native-API можно найти в Interrupt List'е Ralf'а Brown'а или "The Undocumented Functions Microsoft Windows NT/2000" от Tomas'а Nowak'а. В частности, для создания/открытия файлов используется NtCreateFile. Отладчик OllyDbg поддерживает намного более мощный механизм условных точек, позволяющий отслеживать практически любые ситуации. Например, выражение EAX == "mypswd" заставит дебаггер всплывать всякий раз, когда регистр EAX указывает на строку с паролем/серийным номером, который мы ввели при регистрации. Это универсальный способ взлома, подходящий практически ко всем защитам. Каким бы образом программа ни извлекала содержимое окна редактирования, в какой-то момент она неизбежно засунет указатель в регистр. Вот тут-то мы с отладчиком и всплывем! Процедура проверки соответствия пароля будет где-то неподалеку. Конечно, этим регистром не обязательно должен быть EAX. Вполне вероятно, что компилятор задействует EBX, ESI или что-то еще. Документация на OllyDbg заявляет о поддержке выражения R32 == "mypswd", где R32 – любой регистр общего назначения, однако в текущих версиях отладчика эта конструкция не работает и все регистры приходится перебирать вручную (благо можно написать свой плагин, автоматизирующий этот процесс). Помимо API, можно брякать библиотечные функции. В приложениях, написанных на Delphi/Builder/MFC/Visual Basic, прямые вызовы API используются редко. И хотя никакое дело без API-функций, конечно же, не обходится, их анализ дает мало что, особенно если используется динамический обмен данных с окном (DDX) и другие навороченные технологии, обмазывающие API-функции несколькими мегабайтами кривого кода. Это же сдохнуть можно! Но мы не будем! Библиотечные функции легко опознаются ИДОЙ и брякаются как обычные API, только с той разницей, что точка останова носит локальный характер и воздействует лишь на отлаживаемое приложение. А это значит, что после нажатия <Ctrl-D> мы должны переключить контекст управления, чтобы попасть в адресное пространство отлаживаемого приложения. Это осуществляется либо командой "ADDR имя_процесса", либо установкой точки останова на любую API-функцию, вызываемую отлаживаемым приложением. Например SendMessageA. Жмем <Ctrl-D>, пишем "bpx SendMessageA", выходим из SoftIce, дожидаемся, пока он всплывет (если не всплывает, можно дернуть мышью или щелкнуть по отлаживаемому окну). Если в правом нижнем углу отладчика находится имя нашего процесса - все ОК, в противном случае выходим из отладчика и ждем его всплытия опять. |