- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 0. Анализ вредоносных программ для начинающих
- •Цель анализа вредоносных программ
- •Методики анализа вредоносного ПО
- •Общие правила анализа вредоносного ПО
- •Глава 1. Основные статические методики
- •Сканирование антивирусом: первый шаг
- •Хеширование: отпечатки пальцев злоумышленника
- •Поиск строк
- •Упакованное и обфусцированное вредоносное ПО
- •Формат переносимых исполняемых файлов
- •Компонуемые библиотеки и функции
- •Статический анализ на практике
- •Заголовки и разделы PE-файла
- •Итоги главы
- •Глава 2. Анализ вредоносных программ в виртуальных машинах
- •Структура виртуальной машины
- •Запуск виртуальной машины для анализа вредоносного ПО
- •Использование виртуальной машины для анализа безопасности
- •Риски при использовании VMware для анализа безопасности
- •Запись/воспроизведение работы компьютера
- •Итоги главы
- •Глава 3. Основы динамического анализа
- •Песочницы: решение на скорую руку
- •Запуск вредоносных программ
- •Мониторинг с помощью Process Monitor
- •Сравнение снимков реестра с помощью Regshot
- •Симуляция сети
- •Перехват пакетов с помощью Wireshark
- •Использование INetSim
- •Применение основных инструментов для динамического анализа
- •Итоги главы
- •Уровни абстракции
- •Архитектура x86
- •Итоги главы
- •Глава 5. IDA Pro
- •Загрузка исполняемого файла
- •Интерфейс IDA Pro
- •Использование перекрестных ссылок
- •Анализ функций
- •Схематическое представление
- •Повышение эффективности дизассемблирования
- •Плагины к IDA Pro
- •Итоги главы
- •Глава 6. Распознавание конструкций языка C в ассемблере
- •Переменные: локальные и глобальные
- •Дизассемблирование арифметических операций
- •Распознавание выражений if
- •Распознавание циклов
- •Соглашения, касающиеся вызова функций
- •Анализ выражений switch
- •Дизассемблирование массивов
- •Распознавание структур
- •Анализ обхода связного списка
- •Итоги главы
- •Глава 7. Анализ вредоносных программ для Windows
- •Windows API
- •Реестр Windows
- •API для работы с сетью
- •Отслеживание запущенной вредоносной программы
- •Сравнение режимов ядра и пользователя
- •Native API
- •Итоги главы
- •Глава 8. Отладка
- •Сравнение отладки на уровне исходного и дизассемблированного кода
- •Отладка на уровне ядра и пользователя
- •Использование отладчика
- •Исключения
- •Управление выполнением с помощью отладчика
- •Изменение хода выполнения программы на практике
- •Итоги главы
- •Глава 9. OllyDbg
- •Загрузка вредоносного ПО
- •Пользовательский интерфейс OllyDbg
- •Карта памяти
- •Просмотр потоков и стеков
- •Выполнение кода
- •Точки останова
- •Трассировка
- •Обработка исключений
- •Редактирование кода
- •Анализ кода командной оболочки
- •Вспомогательные возможности
- •Подключаемые модули
- •Отладка с использованием скриптов
- •Итоги главы
- •Драйверы и код ядра
- •Подготовка к отладке ядра
- •Использование WinDbg
- •Отладочные символы Microsoft
- •Отладка ядра на практике
- •Руткиты
- •Загрузка драйверов
- •Итоги главы
- •Глава 11. Поведение вредоносных программ
- •Программы для загрузки и запуска ПО
- •Бэкдоры
- •Похищение учетных данных
- •Механизм постоянного присутствия
- •Повышение привилегий
- •Заметая следы: руткиты, работающие в пользовательском режиме
- •Итоги главы
- •Глава 12. Скрытый запуск вредоносного ПО
- •Загрузчики
- •Внедрение в процесс
- •Подмена процесса
- •Внедрение перехватчиков
- •Detours
- •Внедрение асинхронных процедур
- •Итоги главы
- •Глава 13. Кодирование данных
- •Простые шифры
- •Распространенные криптографические алгоритмы
- •Нестандартное кодирование
- •Декодирование
- •Итоги главы
- •Глава 14. Сетевые сигнатуры, нацеленные на вредоносное ПО
- •Сетевые контрмеры
- •Безопасное расследование вредоносной деятельности в Интернете
- •Контрмеры, основанные на сетевом трафике
- •Углубленный анализ
- •Сочетание динамических и статических методик анализа
- •Понимание психологии злоумышленника
- •Итоги главы
- •Искажение алгоритмов дизассемблирования
- •Срыв анализа слоя стека
- •Итоги главы
- •Глава 16. Антиотладка
- •Обнаружение отладчика в Windows
- •Распознавание поведения отладчика
- •Искажение работы отладчика
- •Уязвимости отладчиков
- •Итоги главы
- •Глава 17. Методы противодействия виртуальным машинам
- •Признаки присутствия VMware
- •Уязвимые инструкции
- •Изменение настроек
- •Побег из виртуальной машины
- •Итоги главы
- •Глава 18. Упаковщики и распаковка
- •Анатомия упаковщика
- •Распознавание упакованных программ
- •Способы распаковки
- •Автоматизированная распаковка
- •Ручная распаковка
- •Советы и приемы для работы с распространенными упаковщиками
- •Анализ без полной распаковки
- •Итоги главы
- •Глава 19. Анализ кода командной оболочки
- •Загрузка кода командной оболочки для анализа
- •Позиционно-независимый код
- •Определение адреса выполнения
- •Поиск символов вручную
- •Окончательная версия программы Hello World
- •Кодировки кода командной оболочки
- •NOP-цепочки
- •Поиск кода командной оболочки
- •Итоги главы
- •Глава 20. Анализ кода на C++
- •Объектно-ориентированное программирование
- •Обычные и виртуальные функции
- •Создание и уничтожение объектов
- •Итоги главы
- •Какой смысл в 64-битном вредоносном ПО?
- •Особенности архитектуры x64
- •Признаки вредоносного кода на платформе x64
- •Итоги главы
- •Приложения
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 5. IDA Pro 129 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
можно обнаружить код командной оболочки в виде простых байтов — нажмите в этом месте C. Код будет дизассемблирован, и вы увидите, что по адресу 0x97 он содержит цикл декодирования на основе XOR.
При необходимости набор байтов можно похожим образом превратить в данные или строки формата ASCII, воспользовавшись соответственно клавишами D или A.
Плагины к IDA Pro
Есть несколько способов расширить функциональность IDA Pro. Обычно для этого применяются средства скриптования. Потенциальное применение скриптов ничем не ограничено. Это может быть как простая разметка кода, так и нечто более сложное — например, выполнение разных сравнений между файлами базы данных IDA Pro.
Мы познакомим вас с двумя наиболее популярными средствами скриптования на основе IDC и Python. Как видно на рис. 5.12, эти скрипты можно легко запускать в виде файлов, используя пункт меню File Script File (Файл Файл скрипта), или как отдельные команды с помощью пунктов File IDC Command (Файл Команда IDC) или File Python Command
(Файл Команда Python).
Окно вывода внизу рабочего пространства содержит журнал, который активно используется плагинами для записи состояния и отладочных сообщений.
Рис. 5.12. Варианты загрузки IDC-
и Python-скриптов
Таблица 5.4. Ручное дизассемблирование кода командной оболочки в документе paycuts.pdf
Файл до нажатия клавиши C |
Файл после нажатия клавиши C |
||||||||
|
|
|
|
|
|
|
|
|
|
00008384 |
db |
28h |
; |
( |
00008384 |
db |
28h |
; |
( |
00008385 |
db |
0FCh |
; |
n |
00008385 |
db |
0FCh |
; |
n |
00008386 |
db |
10h |
|
|
00008386 |
db |
10h |
|
|
00008387 |
db |
90h |
; |
|
00008387 |
nop |
|
|
|
00008388 |
db |
90h |
; |
|
00008388 |
nop |
|
|
|
00008389 |
db |
8Bh |
; |
ï |
00008389 |
mov |
|
ebx, eax |
|
0000838A db 0D8h ; + |
0000838B |
add |
|
ebx, 28h ; '(' |
|||||
0000838B |
db |
83h |
; |
â |
0000838E |
add |
|
dword ptr [ebx], 1Bh |
|
0000838C |
db |
0C3h |
; |
+ |
00008391 |
mov |
|
ebx, [ebx] |
|
0000838D |
db |
28h |
; |
( |
00008393 |
xor |
|
ecx, ecx |
|
0000838E |
db |
83h |
; |
|
00008395 |
|
|
|
|
0000838F |
db |
3 |
|
|
00008395 loc_8395: |
; CODE XREF: seg000:000083A0j |
|||
|
|
|
|
|
|
|
|
|
|
Продолжение
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
130 Часть II • Продвинутый статический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Таблица 5.4 (продолжение)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Файл до нажатия клавиши C |
Файл после нажатия клавиши C |
|||||||
|
|
|
|
|
|
|
|
|
00008390 |
db |
1Bh |
|
|
00008395 |
xor |
|
byte ptr [ebx], 97h |
00008391 |
db |
8Bh |
; |
|
00008398 |
inc |
|
ebx |
00008392 |
db |
1Bh |
|
|
00008399 |
inc |
|
ecx |
00008393 |
db |
33h |
; |
3 |
0000839A |
cmp |
|
ecx, 700h |
00008394 |
db |
0C9h |
; |
+ |
000083A0 |
jnz |
|
short loc_8395 |
00008395 |
db |
80h |
; |
|
000083A2 |
retn |
|
7B1Ch |
00008396 |
db |
33h |
; |
3 |
000083A2 ; ----------------------------------000083A5 db 16h |
|||
00008397 |
db |
97h |
; |
|
000083A6 |
db |
7Bh |
; { |
00008398 |
db |
43h |
; |
C |
000083A7 |
db |
8Fh |
; |
00008399 |
db |
41h |
; |
A |
|
|
|
|
0000839A |
db |
81h |
; |
|
|
|
|
|
0000839B |
db |
0F9h |
; |
|
|
|
|
|
0000839C |
db |
0 |
|
|
|
|
|
|
0000839D |
db |
7 |
|
|
|
|
|
|
0000839E |
db |
0 |
|
|
|
|
|
|
0000839F |
db |
0 |
|
|
|
|
|
|
000083A0 |
db |
75h |
; |
u |
|
|
|
|
000083A1 |
db |
0F3h |
; |
= |
|
|
|
|
000083A2 db 0C2h ; - |
|
|
|
|
||||
000083A3 |
db |
1Ch |
|
|
|
|
|
|
000083A4 |
db |
7Bh |
; |
{ |
|
|
|
|
000083A5 |
db |
16h |
|
|
|
|
|
|
000083A6 |
db |
7Bh |
; |
{ |
|
|
|
|
000083A7 |
db |
8Fh |
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Использование IDC-скриптов
IDA Pro поддерживает встроенный скриптовый язык, известный как IDC, который возник еще до широкого распространения скриптовых языков Python и Ruby. Подкаталог IDC внутри установочного каталога IDA содержит несколько демонстрационных IDC-скриптов, которые анализируют дизассемблированный текст. Они вам помогут, если вы решите изучить этот язык.
IDC-скрипт — это программа, полностью состоящая из статических функций. Аргументы можно указывать без типа, а для объявления локальных переменных используется ключевое слово auto.
IDC содержит множество встроенных функций. Вы можете ознакомиться с ними в справочных материалах IDA Pro или в файле idc.idc, который обычно подключается к скриптам, использующим эти встроенные функции.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 5. IDA Pro 131 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
В главе 1 мы обсуждали утилиту PEiD и ее плагин Krypto ANALyzer (KANAL), который способен экспортировать IDC-скрипты. IDC-скрипт добавляет закладки и комментарии в базу данных IDA Pro для заданного двоичного файла, как показано в листинге 5.5.
Листинг 5.5. IDC-скрипт, сгенерированный плагином KANAL утилиты PEiD
#include <idc.idc> static main(void){
auto slotidx; slotidx = 1;
MarkPosition(0x00403108, 0, 0, 0, slotidx + 0, "RIJNDAEL [S] [char]"); MakeComm(PrevNotTail(0x00403109), "RIJNDAEL [S] [char]\nRIJNDAEL (AES):
SBOX (also used in other ciphers).");
MarkPosition(0x00403208, 0, 0, 0, slotidx + 1, "RIJNDAEL [S-inv] [char]"); MakeComm(PrevNotTail(0x00403209), "RIJNDAEL [S-inv] [char]\nRIJNDAEL (AES):
inverse SBOX (for decryption)");
}
Чтобы загрузить IDC-скрипт, выберите пункт меню File Script File (Файл Файл скрипта). После этого скрипт должен немедленно выполниться, а на панели инструментов появятся две кнопки: одна для редактирования скрипта, а другая — для его повторного запуска.
Использование IDAPython
Плагин IDAPython полностью интегрирован в текущую версию IDA Pro и позволяет применять мощные и удобные скрипты на языке Python в анализе двоичных файлов. IDAPython использует множество функций из пакета разработки IDA Pro, предоставляя более практичные средства скриптования, чем IDC. IDAPython имеет три модуля, которые обеспечивают доступ к IDA API (idaapi), интерфейсу IDC (idc) и вспомогательным функциям самого плагина (idautils).
Скрипты в IDAPython — это программы, которые используют непосредственные адреса для выполнения первичного этапа адресации. Абстрактные типы данных отсутствуют, а большинство вызовов принимают либо непосредственный адрес, либо строку с именем символа. IDAPython содержит множество оберток вокруг основных IDC-функций.
В листинге 5.6 показан пример скрипта для IDAPython. Он предназначен для раскрашивания всех инструкций call в idb, чтобы аналитику было легче их распо знать. Например, ScreenEA является распространенной функцией, которая получает местоположение курсора.
Функция Heads будет использоваться для обхода объявленных элементов (в нашем случае это каждая инструкция). Сохранив все вызовы функций внутри functionCalls, мы перебираем и раскрашиваем их с помощью инструкции
SetColor.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
132 Часть II • Продвинутый статический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Листинг 5.6. Полезный скрипт на языке Python для раскрашивания всех вызовов
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
from idautils import * from idc import *
heads = Heads(SegStart(ScreenEA()), SegEnd(ScreenEA()))
functionCalls = []
for i in heads:
if GetMnem(i) == "call": functionCalls.append(i)
print "Number of calls found: %d" % (len(functionCalls))
for i in functionCalls:
SetColor(i, CIC_ITEM, 0xc7fdff)
Использование коммерческих плагинов
Приобретя достаточный опыт работы с IDA Pro, вам стоит подумать о покупке нескольких коммерческих плагинов, таких как Hex-Rays Decompiler и zynamics BinDiff. Hex-Rays Decompiler превращает результат дизассемблирования в псевдокод на языке C, понятный человеку. Чтение такого кода вместо ассемблера часто ускоряет анализ, делая вас ближе к оригинальным исходным текстам, которые написал автор вредоноса.
BinDiff от zynamics — это инструмент для сравнения двух баз данных IDA Pro. Он позволяет выявить различия между разными вариантами вредоносного программного обеспечения, включая новые функции и разницу между похожими функциями. Одной из возможностей данного плагина является создание рейтинга схожести при сравнении двух участков вредоноса. Более подробно эти инструменты будут описаны в приложении Б.
Итоги главы
В этой главе предлагается лишь поверхностное введение в IDA Pro. В дальнейшем мы будем использовать эту программу в наших лабораторных работах, демонстрируя интересные способы ее применения.
Как вы могли убедиться, просмотр дизассемблированного кода является только одной из многих возможностей IDA Pro. Подлинная мощь этой программы заключается в ее интерактивных функциях — с их помощью мы маркировали код, чтобы упростить анализ.
Мы также обсудили разные способы просмотра кода на ассемблере с применением перекрестных ссылок и схематических представлений, которые ускоряют процесс анализа.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 5. IDA Pro 133 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Лабораторные работы
Лабораторная работа 5.1
Проанализируйте зараженный файл Lab05-01.dll с помощью IDA Pro. Цель данной лабораторной работы — дать вам поупражняться в работе с этой программой. Если у вас уже есть опыт использования IDA Pro, можете пропустить эти вопросы и сосредоточиться на обратном проектировании вредоносного ПО.
Вопросы
1.Каков адрес функции DllMain?
2.Используйте окно Imports (Импорт), чтобы пройти к функции gethostbyname. Где происходит импорт?
3.Сколько функций делают вызов gethostbyname?
4.Обратите внимание на вызов gethostbyname по адресу 0x10001757. Можете определить, какой DNS-запрос будет выполнен?
5.Сколько локальных переменных было распознано IDA Pro для ответвления по адресу 0x10001656?
6.Сколько параметров было распознано IDA Pro для ответвления по адресу 0x10001656?
7.Используйте окно Strings (Строки), чтобы найти в коде строку \cmd.exe /c. Где она находится?
8.Что происходит на отрезке кода, в котором используется строка \cmd.exe /c?
9.На том же участке, по адресу 0x100101C8, находится глобальная переменная dword_1008E5C4, которая участвует в выборе пути выполнения. Каким образом вредонос устанавливает dword_1008E5C4? Подсказка: используйте перекрестные ссылки этой переменной.
10. Через несколько сотен строк после начала ответвления 0x1000FF58 находятся инструкции memcmp, которые используются для сравнения строк. Что произойдет, если сравнение со строкой robotwork окажется успешным (когда memcmp возвращает 0)?
11. Что делает экспортная функция PSLIST?
12. Используйте схематический режим, чтобы представить перекрестные ссылки из sub_10004E79. Какие вызовы Windows API могут быть сделаны при входе в эту функцию? Если исходить лишь из этих вызовов, как бы вы ее переименовали?
13. Сколько функций Windows API вызывается непосредственно из DllMain, а сколько — на втором уровне вложенности?
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
134 Часть II • Продвинутый статический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
14. По адресу 0x10001358 находится вызов Sleep (функция Windows API, единственный параметр которой определяет, на сколько миллисекунд нужно остановиться). Пройдитесь вверх по коду и попытайтесь понять, как долго будет бездействовать программа, если этот участок выполнится.
15. По адресу 0x10001701 находится вызов socket. Какие три параметра он принимает?
16. Воспользуйтесь страницей MSDN для функции socket и библиотекой символьных констант в IDA Pro, чтобы придать этим параметрам больше смысла. Как они будут выглядеть после применения изменений?
17. Найдите в коде инструкцию in (опкод 0xED). В сочетании с волшебной строкой VMXh ее используют для обнаружения VMware. Относится ли это к данному вредоносу? Воспользуйтесь перекрестными ссылками на функцию, которая выполняет in, чтобы найти признаки обнаружения VMware.
18. Переместите курсор по адресу 0x1001D988. Что вы там видите?
19. Если у вас установлен плагин IDA Python (поставляется вместе с коммерческой версией IDA Pro), запустите скрипт Lab05-01.py, который содержится в архиве вредоносного ПО для этой книги (убедитесь в том, что курсор находится по адресу 0x1001D988). Что произойдет при выполнении скрипта?
20. Как превратить эти данные в единую строку в формате ASCII, не перемещая курсор?
21. Откройте скрипт в текстовом редакторе. Как он работает?