Hacker: Using a Debugger to Analyze 64-Bit Programs in Windows

WILD

Administrator
Staff member
ADMIN
SELLER
SUPREME
MEMBER
Joined
Jan 21, 2025
Messages
219
Reaction score
636
Deposit
0$
Помимо отладки, существует ещё один способ изучения программ — отладка. Изначально под отладкой понималась пошаговая версия кода, также называемая трассировкой. Сегодня программы настолько разрослись, что трассировка становится бессмысленной — мы сразу утонем в омуте ненужного, не понимая, что они на самом деле делают. Отладчик — не лучший способ изучения алгоритма программы — эффективнее использовать интерактивный интерфейс (например, IDA).

Пятнадцать лет назад грандиозный труд Криса Касперского «Фундаментальные основы хакерства» был настольной книгой каждого начинающего исследователя в области компьютерной безопасности. Однако время идёт, и знания, опубликованные Крисом, теряют свою актуальность. Издательство Hacker обновило этот объёмный труд, перенеся его из эпохи Windows 2000 и Visual Studio 6.0 в эпоху Windows 10 и Visual Studio 2019.

Результатом стала серия статей «Фундаментальные основы хакерства». Перед вами во второй раз обновлена вторая статья из этого цикла (на Hackera также доступна первая в новом издании).

Весь цикл, с учетом всех обновлений, был выпущен в виде книги «Фундаментальные основы хакинга. Анализ программ в среде Win64». Приобрести её можно на сайте издательства Solon-Press.

Фундаментальные основы хакерства. Анализ программ в среде Win64.
Фундаментальные основы хакерства. Анализ программ в среде Win64.
Способности отладчиков

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

отслеживание запросов на запись, чтение и выполнение в заданной ячейке (области) памяти, затем на тексте, называемом «перемычкой» (разрывом);

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

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

Отслеживание вызовов программных и аппаратных прерываний (по большей части это уже неактуально — защита не так сильно заботится о прерываниях);

Отслеживание сообщений, отправляемых приложением в окно;

И, конечно же, контекстный поиск в памяти.

Как именно это делает отладчик, знать необязательно, достаточно знать, что он может это сделать, и этого достаточно. Гораздо важнее вопрос о том, какой отладчик знает, как это сделать.
Герои прошлого

В прошлом хакеры использовали хорошо известный SoftICE в качестве отладчика. Это был действительно мощный инструмент, и даже спустя много лет ничего лучше него не было изобретено. Его неоспоримым преимуществом была возможность отладки ядра Windows на одном компьютере. Между тем, не без давления со стороны Microsoft, в 2006 году его разработка была прекращена. А поскольку SoftICE очень сильно зависит от операционной системы Windows, в более поздних версиях он просто не работает. Последней версией Windows, которую можно было использовать с SoftICE, была Windows XP SP 2. В SP 3 он уже не функционировал, но в Vista и Windows 7 — и долгое время.

Хакеры, конечно, притупились, но не стали посыпать голову пеплом, а начали изобретать альтернативные отладчики. За этим последовала эра процветания новых отладчиков. Какова картина в этой области сейчас? Новых хороших отладчиков нет! Самым продвинутым среди всех был коммерческий Syser китайских разработчиков. Ему пророчили светлое будущее, возможность заменить SoftICE, но где он сейчас? Возможно, пара копий сохранилась где-то на свалках файлов, но он давно не развивается.

В целом, у хакера сейчас есть выбор только из двух действительно подходящих отладчиков: WinDbg и x64dbg. Последний подходит только для исследования приложений в пользовательском режиме, в то время как с помощью WinDbg можно также выполнять ядерную отладку Windows. Но в этом случае придется использовать два компьютера, объединенных проводным соединением или в локальной сети.
Современный копировальный аппарат

Когда-то хакеры игнорировали WinDbg, но со временем он развился и стал действительно мощным и полезным инструментом для исследования кода. Не стоит забывать, что его использует команда разработчиков Windows. Для него можно создавать расширения с помощью подключенных DLL-файлов. Начиная с Windows XP, отладочный механизм включен непосредственно в операционную систему. Он состоит из двух DLL-файлов: dbgent.dll и dbghelp.dll. Помимо самого отладчика, который включает WinDbg, используется и его механизм, в том числе «Доктор Ватсон» (drwtsn32.exe).

Инструмент для Windows состоит из четырех приложений, использующих dbengg.dll:

cdb и ntsd — это отладчики пользовательского режима с консольным интерфейсом. Они отличаются только одним: при запуске из существующего окна консоли ntsd открывает новое окно консоли, а cdb этого не делает;

kd — это отладчик в режиме ядра с консольным интерфейсом;

WinDbg можно использовать как отладчик пользовательского режима или режима ядра, но не одновременно. WinDbg имеет графический интерфейс.

Следовательно, WinDbg — это всего лишь отладочная оболочка с механизмом отладки.

Вспомогательный файл dbghelp.dll используется внешними программами для изучения внутренней структуры Windows, например, программой OllyDbg deklapper, программой Process Explorer (автор Марк Руссинович) и другими.

WinDbg имеет две версии: классическую и UWP. Первая устанавливается вместе с инструментами отладки для Windows. Этот набор содержит две версии WinDbg. Одна предназначена для отладки 32-битных приложений, другая — 64-битных. UWP-версию можно загрузить из Windows Store, она имеет только 32-битную версию. Обе 32-битные версии абсолютно эквивалентны, за исключением того, что в UWP используется расширенный пользовательский интерфейс Windows 10. Кстати, очень удобно при работе на большом экране.

Для наших экспериментов я буду использовать версию UWP. Практически нет никакой разницы в их использовании, лишь немного отличаются команды в пользовательском интерфейсе — это надписи на элементах интерфейса, но не команда встроенного языка.
Метод 0. Использование исходного пароля в качестве транка.

С помощью WinDbg мы загружаем файл, который анализируем – passCompare1.exe – через пункт меню «Запустить исполняемый файл» или «Открыть исполняемый файл» в классическом приложении. В дальнейшем я не буду приводить аналог команд.

Файлы можно скачать через GitHub.

Сразу после запуска исполняемого файла WinDbg загрузится приложение, дизассемблированные команды появятся в окне дизассемблирования, а результаты их выполнения — в окне командной строки.

После создания окна приложения, ещё до вывода каких-либо данных, выполнение немедленно прерывается на инструкции int 3 — это точка остановки программы. Часто новички считают, что программа начинается с функции main или WinMain. Этому их учат в школе, или они сами черпают такую информацию из учебников по C/C++. Конечно, это не так.

Прежде чем приступить к основной работе конкретного приложения, процессор погружается в дебри системного кода загрузчика образа, выполняет множество инструкций по инициализации приложения внутри Windows, подключению библиотек и прочим вещам. Поэтому сбой не означает входа в основную программу. Если вы посмотрите на окно на экране, вы увидите, что прерывание произошло в системной функции модуля LdrpDoDebuggerBreak ntdll.

Для начала загрузим отладочную информацию для компонентов операционной системы. Для этого войдем в командную строку.

.symfix d:\debugSymbols
Объясните с помощью

Эта команда задаёт параметр, в котором, если она выполняется, debuson загрузит отладочные символы для подсистем Windows. Затем необходимо отправить команду для загрузки или обновления файлов:

.reload
Объясните с помощью

После этого WinDbg загрузит необходимые данные с серверов Microsoft.

В этом случае вы можете использовать более подробную информацию о доступных отладочных данных, например, с помощью команды `.sympath + <путь к каталогу>`. Если файл с отладочной информацией находится в той же папке, что и исполняемый файл, он будет синхронизирован. Вы также можете использовать исходные файлы, но в этом случае проще использовать ассоциацию отладчика в среде разработки.

Давайте попробуем запустить отладчик для версии, которая нам не нравится, passCompare1, и когда первая точка остановки окажется в ней, поместим приманку в функцию main:

bp passCompare1! main
Объясните с помощью

Теперь мы выполним задание для команды g. Когда отладчик скомпилирует программу, установив точку остановки (начало функции), в окне дискемблера мы увидим, что листинг разделен на сегменты, в названии которых указаны функции, в частности.

В релизной версии исполняемого файла этого не будет. Если мы поставим точку в начале заголовка модуля и скорректируем точку входа, то не дойдем до начала функции main, а в системном загрузчике — mainCRTStartup, подготовленной компилятором.

В Microsoft предоставляется мало отладочных символов, поэтому нам нелегко привыкнуть к простой жизни. WinD, в частности, специально разработан для отладки программного обеспечения без отладочной информации и исходного кода. Мы будем использовать его по назначению! Если вы внимательно посмотрите на окно отображения, вы увидите, что, в отличие от используемого в статье дампа Discusser, система Windbements разработана таким образом, что упрощает анализ.

Точки остановки могут быть двух типов: программные и аппаратные. С первыми мы уже сталкивались. Их может быть любое количество в программе. Для своей работы они изменяют память исполняемого процесса, то есть место, где отладчик запоминает инструкции ассемблера и заменяет их. Из-за того, что точка остановки изменяет память, её нельзя установить везде. В этом её главный недостаток. Основная команда для установки программной точки остановки — bp. Чтобы получить список установленных точек, используется команда bl, а для удаления — команда bc, параметром которой является индекс точки остановки. Отладчик забирает все точки остановки в качестве параметра. Команды bd, подходящие для включения и выключения точек остановки, включаются и выключаются.

Количество аппаратных точек остановки, независимо от разрядности процессора, всегда равно четырем. Процессор имеет восемь отладочных регистров (DR-0 - DR-7), но только первые четыре могут использоваться для хранения точек остановки. Аппаратные точки остановки могут располагаться в любом месте памяти процесса. Это недостаток программных точек остановки. Остальные регистры предназначены для хранения точек доступа, таких как чтение, запись, проверка. Небольшое количество является основным недостатком аппаратных точек остановки. Команда используется для установки схемы доступа с тремя параметрами: тип доступа, размер и адрес.

Итак, рассмотрим небольшой список команд отладчика Windowsberg. Вы, должно быть, обратили внимание на наш список. В языке отладчика есть три типа команд:

Встроенные команды служат для отладки процесса и записываются без символов; к таким командам относятся g, bp, bd;

Метакоманды управляют работой отладчика, перед ними ставится символ точки, например: .reload, .symfix, .cls;

Команды расширения, загружаемые из внешних DLL-библиотек, начинаются с символа ограничения, например: ! Heap, ! dh.

Поиск адреса

Давайте быстро попробуем найти механизм защиты и, не вдаваясь в его детали, отключим защиту. Вспомним, по какому адресу в памяти находится исходный пароль. Посмотрим на раздел дампа .rdata, где хранится пароль. Исходный пароль myGOODpassword по адресу 0x140002280. Попробуем отобразить данные по этому адресу:

dc 0x14000022880
Объясните с помощью

Существует большое количество команд для отображения содержимого памяти: da, db, ddan и другие. Мы использовали dc, потому что она отображает значения символов ASCII типа double и words. Что мы видим? Неинициализированные данные.

Ранее (до Windows Vista) было проще использовать совместную разработку. Windows загружала образы в виртуальную память по определенному адресу при компиляции. Это легко увидеть: давайте запустим приложение в Windows XP, затем, используя тот же SoftICE, узнаем о разделах (команда mod –u) и их выводе. После перезагрузки системы и повторного запуска приложения мы увидим, что они останутся неизменными.

Начиная с Windows Vista, программы после перезагрузки системы выдают случайное описание, не то чтобы это было во время подготовки. Нам придётся самим искать раздел .rdata. Не на диске, а в памяти. Легко сказать, но давайте ещё раз упростим!

Мы выясним, по какому адресу в памяти находится наш модуль. Для этого введем в отладчике команду lmf m passcompare1. Второй параметр — это имя модуля, его предположение будет определено. В результате на моем компьютере я получил:

Название начального и конечного модуля
00007ff7`159b00 0000750campas9b3c9bpare1 passCompare1.exe
Объясните с помощью

Дело в том, что начало модуля — это адрес 0x7v7159b00. После каждой перезагрузки системы модуль конкретного приложения преобразуется в различные инструкции. Теперь выведем содержимое карты памяти нашего модуля и получим информацию обо всех разделах PE-файлов:

! dh passCompare1
Объясните с помощью

Отзыв команды просто огромен. dh – в некотором смысле аналог команды map32 от SoftICE, первый по информации. Найдите в разделе «Условия» описание цели .rdata:

ЗАГОЛОВОК РАЗДЕЛА №2
.rdata имя
Виртуальный размер 101C
Виртуальный адрес 2000
размер исходных данных 1200
Указатель файла 1400 на необработанные данные
Указатель файла 0 на таблицу перемещений
0 — указатель файла на номера строк
0 количество перемещений
0 количество номеров строк
40000040 флагов
Инициализированные данные
(выравнивание не указано)
Только для чтения
Объясните с помощью

Здесь нас интересует четвертая строка — виртуальный адрес. Далее вы можете найти, где находится файл .rdata; для этого нужно сложить начальный адрес модуля и виртуальный адрес раздела. Давайте посмотрим, что здесь находится:

dc 0x7ff7159b0000 + 2000
Объясните с помощью

Это более теплые, легко читаемые символы. Давайте перейдем в этот раздел и выведем диапазон описаний:

dc 0x7ff7159b2000 0x7v1759b2100
Объясните с помощью

Вот наш пароль по адресу 0x7f7159b2280! Process Memory Damp:

00007ff7`159b2250 159b4040 000771ff7 159b40e00 0007f07f7 @@..................................................................................................................... @......
00007ff7`159b2260 ffffffffffffffff
00007p7`159b2270 65746e45 62002072 6f7773 0003a6472 Введите пароль:
00007ff7`159b2280 4f47796d 6170444f 6f773773 000a6472 myGOODpassword.
00007ff7`159b2290 6e6f7257 62002067 6f773737 000a6472 Неверный пароль..
00007ff7`159b22a0 73736150 64726f77 0a4b4f20 000000000 Пароль ОК....
00007ff7`159b2b0 0000140 000000000000000000000000000000000 @.............................................................................................................................................
Объясните с помощью

Контакт найден! Давайте подумаем еще раз. Если предположить правильность пароля, введенного пользователем, то защита, очевидно, должна сравнить его с оригиналом. И если установить точку остановки при чтении памяти по адресу 0x7ff7159b2280, мы уловим хвост механизма запуска. Сказано – сделано.

Давайте добавим аппаратный джойстик, это зависание при доступе (bech on access), во время работы программного обеспечения возникнет ошибка доступа к памяти, связанная с записью в секцию, за исключением чтения, которое осуществляется через .rdata. И программное обеспечение необходимо модифицировать.

ba r4 0x7ff7159b2280
Объясните с помощью

Первый параметр — это тип доступа: rReading; второй параметр — количество таких операций разработки; последний параметр — это адрес.

С помощью команды gcontinue введите любой пароль, который вам придет в голову, например, KPNC++. Отладчик немедленно «появится» в библиотечной функции строки strcmp:

00007vb`5d3760 488b01 mov raax, qword ptr [r)
 
Top Bottom