8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 7 8 9 10 11 12 13 ... 102

На худой конец, можно попробовать перехватить передачу управления распакованному коду, просто поставив на соответствующие API-функции точки останова. При определенных навыках работы с двоичным кодом мы имеем все шансы осуществить такой перехват еще до того, как вирус успеет внедриться в систему или что-то испортить в ней. Однако никаких гарантий на этот счет у нас нет, и вирус в любой момент может вырваться из-под контроля, поэтому исследования такого рода лучше всего проводить на отдельной машине или под любым симпатичным вам эмулятором PC.

Вызываем soft-ice и устанавливаем точки останова на все потенциально опасные функции, а также все те функции, которые обычно присутствуют в стартовом коде (см. далее раздел «Стартовый код»). Если вирус написан на языке высокого уровня, мы перехватим управление еще до начала выполнения функции main. В противном случае отладчик всплывет при первой попытке выполнения потенциально опасной функции.

Отладчики, устанавливающие глобальные точки останова (и soft-ice в их числе), всплывают независимо от того, какое приложение их вызывает. Поэтому всегда обращайте внимание на правый нижний угол экрана, в котором soft-ice выводит имя процесса, «потревожившего» отладчик, и. если это не исследуемый вами процесс, а что-то еще, вы можете смело покинуть отладчик, дожидаясь его очередного всплытия (табл. 1.1).

Таблица 1.1. Функции, помогающие перехватить управление у распакованного вирусного кода

Основные функции стартового кода

Основные потенциально опасные функции

GetVersion

CreateFi1еА

GetVersionExA

RegOpenKeyA

GetCommandLineA

RegOpenKeyExA

GetModuleHandleA

LoadLibraryA

GetStartupInfoA

FindFirstFileA

Settlnhandl edExcept i onFi 1 ter

FindFirstFileExA

Давайте продемонстрируем технику ручной распаковки на примере анализа вируса I-Worm.Sobig.f. РЕ-SCAN показывает, что он упакован полиморфным упаковщиком Te.Lock 0.98 (http://egoiste.cjb.net/). Однако найти готовый распаковщик в Интернете для этой версии упаковщика не удается (те, что есть, или не распаковывают файл совсем, или распаковывают его неправильно, хотя к моменту выхода книги в свет ситуация может и исправиться). Пошаговая трассировка распаковщика (равно как и попытки анализа алгоритма распаковки) заводят нас в никуда, ибо код оказывается слишком сложен для начинающих (а вот опытные программисты получают от-его реконструкции настоящее удовольствие, ибо упаковщик весьма неплох, только при испльзовании айса имейте в виду, что, во-первых, вам потребуется падч IceExt, меняющий DLP INTa 1 с 3 па 0, а во-вторых, ставить точки останова надо с большой осторожностью,


так как t Elock активно использует отладочные регистры для своих целей, модифицируя их через контекст исключения). Просмотр дампа в НЕХ-редакторе также не показывает ничего подозрительного. Тупик...

А теперь на сцену выходит наш прием с контрольными точками — и исследуемая программа тотчас ловится на GetModulенапсП еА и CreateFileA. На момент вызова последней весь код и все данные зараженного файла уже полностью распакованы и просмотр содержимого сегмента данных немедленно разоблачает вирус по агрессивным текстовым строкам (листинг 1.3).

Листинг 1.3. Распакованный вручную I-Worm.Sobig.f сразу же выдает агрессивность своих намерений характерными текстовыми строками

001В:

: 00419561

62

65

00

00

00

00

62-

61

73

65

36

34

СО 00

53

Ые base64. .S

001В:

: 00419571

4D

54

50

00

СО

ОС

00

74-

-63

70

00

74

65

78 74

2F

МТР. .tcp.text/

001В:

:0041958!

70

61

69

00

00

69-

-73

6F

2D

38

38 35 39

2D

plain..iso-8859-

001В:

: 0041959]

31

00

00

51

55

49

54

0D-

-0А

СО

00

45

48

4С 4F

20

1..QUIT.., EHLO

001В:

:004195А1

25

73

0D

00

00

00

50-

61

73

73

77

6F

72 64

ЗА

%s Password:

001В:

: 004195В1

00

00

ОС

55

73

65

72

6Е-

-61

6D

65

ЗА

00

00 00

41

.. .Lsername: . .A

001В:

004195С1

55

54

48

20

4F

47

49

0D

OA

00

00

00 00

40

UTH LOGIN......M

001В:

:Q04195D1

4:

49

20

46

52

4F

40-

-ЗА 20

ЗС

25

73

ЗЕ 0D

AIL FROM: <%s>..

Э01В:

: 004195b 1

00

00

00

52

43

50

54

го-

-54

4F

ЗА

20

ЗС

25 73

ЗЕ

...RCPI Г0: <%s>

001В:

00419BD1

00

00

00

24

00

00

53-

-4F

46

54

57

41

52 45

...$\..SOFTWAREX

001В:

004193Е1

4D

69

63

72

6F

/3

66-

-74

57

69

бг

64 6Е

77

MicrosoftXWindow

001В:

:004I93F1

73

43

75

72

72

65

6Е-

-74

56

65

/2

73

69 6F

6F

bNCurrcntVersion

001В:

:00419С01

52

75

00

00

СО

2С-

-2Г

73

69

6F

63

СО 00

64

\Run... /sinc.d

001В:

:00419С11

62

78

СС

66

70

00

6D-

-68

74

00

77

61

62 00

68

bx.hlp.mht.wab.h

СТАРТОВЫЙ КОД

Вдевяностых годах двадцатого века, когда вирусы создавались преимущественно на ассемблере и писались преимущественно профессионалами, а коммерческие программисты в своем подавляющем большинстве полностью отказались от ассемблера и перешли на языки высокого уровня, для разработчиков антивирусов наступили золотые дни, ибо распознать зараженный файл обычно удавалось с первого взгляда. Действительно, любая нормально откомпилированная программа начинается с так называемого стартового кода {Start-Up code), который легко распознать визуально (стартовый код, как правило, начинается с вызова функций GetVersion, GetModuleHandleA и т. д.). Дизассемблер IDA автоматически идентифицирует стартовый код по обширной библиотеке сигнатур, выдавая тин и версию компилятора.

ПРИМЕЧАНИЕ-------

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


Вообще-то никаких формальных признаков «нормального» start-upa не су1це ствует и всяк разработчик волен реалнзовывать его по-своему. Однако свой соб ственный start-up цепляет к программе только извращенец. Обычные програщ мисты для этих целей используют библиотечный стартовый код, поставляемый вместе с компилятором, зачастую даже и не подозревая о его существовании Несмотря на то что даже в рамках одпого-единствеиного компилятора существует множество разновидностей стартового кода, все они легко узнаваемы и факт отсутствия стартового кода надежно обнаруживается даже самыми начинающими из исследователей!

Приблизительная структура типичного стартового кода такова: сначала идет пролог, затем настройка обработчика структурных исключений (для С++ программ), обнаруживающая себя по обращению к сегментному регистру FS. Затем следует вызов функций GetVersion (GetVersionEx), GetModuleHandleA н GetStartupInfoA. Подробнее об идентификации стартового кода можно прочитать в книге Криса Каспсрски «Фундаментальные основы хакерства» или в «Наскег Disassembling Uncovered* его же, которую, кстати говоря, можно стащить отсюда: http://www.web-hack.ru/books/books.php?go=48

Здесь же мы не можем позволить себе подробно останавливаться на этом обширном вопросе и просто сравним стартовый код нормальной программы с кодом вируса Win2K.Inta.1676 (листинги 1.4 и 1.5).

Листинг 1.4. Так выглядит нормальный start-up от Microsoft Visual С++ 6.0...

.text:00401670 start

proc near

.text:00401670

push

ebp

.text:00401671

mov

ebp. esp

.text:00401673

push

Of FFFFFi+h

.text:00401675

push

offset stru 420218

,text:004016/A

push

of f set except hand1 er3

,text:0040167F

mov

eax. Targe fs:0

.text:00401685

push

eax

.text:00401686

mov

large fS:0. esp

.text:004G1696

call

ds:GetVersion : Get с

Windows

,text:004016EC

push

0

.text:004016EE

call

heap init

.text:00401/04

mov

[ebp+var 4]. 0

.text:0040170B

call

ioinit

.text .-00401710

call

dS:GetCommardtineA

.text:00401716

mov

dword 424F44. eax

.text:0040171B

call

crtGetEnvironmentStrii

.text:00401720

mov

dword 4235C0. eax

.text:00401725

call

setargv

.text:0040172A

call

setenvp

.Lext:0040172F

call

cinit

.text:00401754

call

main

.text:00401763

call

exit

Get current version numper of



0 ... 7 8 9 10 11 12 13 ... 102