Анимация
JavaScript


Главная  Библионтека 

0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

00401B41

push

00401B42

large fs:0, esp

00401B49

esp, 10h

00401B4C

push

00401B4D

push

00401B4E

push

00401B4F

[ebp+var 18], esp

00401B52

call

ds:GetVersion

00401B58

edx, edx

00401B5A

dl, ah

00401B5C

dword 4087B0, edx

00401B62

ecx, eax

00401B64

ecx, 0FFh

00401B6A

dword 4087AC, ecx

00401B70

ecx, 8

00401B73

ecx, edx

00401B75

dword 4087A8, ecx

00401B7B

eax, 10h

00401B7E

dword 4087A4, eax

00401B83

push

00401B85

call

heap init

00401B8A

00401B8B

test

eax, eax

00401B8D

short loc 401B97

00401B8F

push

00401B91

call

sub 401C30 ; fast error exit

00401B96

00401B97

00401B97

loc 401B97:

; CODE XREF: start+61tj

00401B97

[ebp+var 4], 0

00401B9B

call

ioinit

00401BA0

call

ds:GetCommandLineA

00401BA6

dword 409CE4, eax

00401BAB

call

crtGetEnvironmentStringsA

00401BB0

dword 408788, eax

00401BB5

call

setargv

00401BBA

call

setenvp

00401BBF

call

cinit

00401BC4

eax, dword 4087C0

00401BC9

dword 4087C4, eax

00401BCE

push

00401BCF

push

dword 4087B8

00401BD5

push

dword 4087B4

00401BDB

call

sub 401000

00401BE0

esp, 0Ch

00401BE3

[ebp+var 1C], eax

00401BE6

push

00401BE7

call

exit

00401BEC

00401BEC

00401BEC

loc 401BEC:

; DATA XREF: rdata:0 04 0717 0o

00401BEC

eax, [ebp-14h]

00401BEF

ecx, [eax]

00401BF1

ecx, [ecx]

00401BF3

[ebp-20h], ecx

00401BF6

push



00401BF7 push ecx

00401BF8 call XcptFilter

00401BFD pop ecx

00401BFE pop ecx

00401BFF retn

00401BFF start endp ; sp = -34h

b) стартовый код программы "first.exe", полученный дизассемблером IDA Pro 4.01

С приведенным примером IDA Pro успешно справляется, о чем свидетельствует стока "Using FLIRT signature: VC v2.0/4.x/5.0 runtime" в окне сообщений

Рисунок 7 "0x003" Загрузка библиотеки сигнатур

Дизассемблер сумел определить имена всех функций вызываемых стартовым кодом, за исключением одной, расположенной по адресу 0х0401BDB. Учитывая передачу трех аргументов и обращение к exit, после возращения функцией управления, можно предположить, что это main и есть.

Перейти по адресу 0x0401000 для изучения содержимого функции main можно несколькими способами - прокрутить экран с помощью стрелок управления курсором, нажать клавишу <G> и ввести требуемый адрес в появившемся окне диалога, но проще и быстрее всего воспользоваться встроенной в IDA Pro системой навигации. Если подвести курсор в границы имени, константы или выражения и нажать <Enter>, IDA автоматически перейдет на требуемый адрес.

В данном случае требуется подвести к строке "sub 401000" (аргументу команды call) и нажать на <Enter>, если все сделано правильно, экран дизассемблера должен выглядеть следующим образом:

00401000 ; --------------S U B R O U T I N E ----------------------00401000

00401000 ; Attributes: bp-based frame

00401000

00401000 sub 401000 proc near ; CODE XREF: start+AFp

00401000 push ebp

00401001 mov ebp, esp

00401003 push offset aHelloSailor ; "Hello, Sailor!\n"

00401008 mov ecx, offset dword 408748

0040100D call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<(char const *)

00401012 pop ebp

00401013 retn 00401013 sub 401000 endp

Дизассемблер сумел распознать строковую переменную и дал ей осмысленное имя "aHelloSailor", а в комментарии, расположенном справа, для наглядности привел оригинальное содержимое "Hello, Sailor!\n". Если поместить курсор в границы имени "aHelloSailor":и нажать <Enter>, IDA автоматически перейдет к требуемой строке:

00408040 aHelloSailor db Hello, Sailor!,0Ah,0 ; DATA XREF: sub 4 01000+3to

Выражение "DATA XREF: sub 401000+3to" называется перекрестной ссылкой и свидетельствует о том, что в третей строке процедуры sub 401000, произошло обращение к текущему адресу по его смещению ("o" от offset), а стрелка, направленная вверх, указывает на относительное расположение источника перекрестной ссылки.

Если в границы выражения "sub 401000+3" подвести курсор и нажать <Enter>, IDA Pro перейдет к следующей строке:

00401003 push offset aHelloSailor ; "Hello, Sailor!\n"

Нажатие клавиши <Ecs> отменяет предыдущее перемещение, возвращая курсор в



исходную позицию. (Аналогично команде "back" в web-браузере). Смещение строки "Hello, Sailor!\n", передается процедуре "??6ostream@@QAEAAV0@PBD@Z", представляющей собой оператор "<<" языка С++. Странное имя объясняется ограничениями, наложенными на символы, допустимые в именах библиотечных функций. Поэтому, компиляторы автоматически преобразуют (замангляют) такие имена в "абракадабру", пригодную для работы с линкером, и многие начинающие программисты даже не догадываются об этой скрытой "кухне".

Для облегчения анализа текста, IDA Pro в комментариях отображает «правильные» имена, но существует возможность заставить ее везде показывать незамангленные имена. Для этого необходимо в меню "Options" выбрать пункт "Demangled names" и в появившемся окне диалога переместить радио кнопку на "Names", после этого вызов оператора "<<" станет выглядеть так:

0040100D

call

ostream::operator<<(char const *)

На этом анализ приложения "first.cpp" можно считать завершенным. Для полноты картины остается переименовать функцию "sub 401000" в main. Для этого необходимо подвести курсор к строке 0x0401000 (началу функции) и нажать клавишу <N>, в появившемся диалоге ввести "main". Конечный результат должен выглядеть так:

00401000 ;

S U B R O U T I N E

00401000

00401000 ; Attributes: bp-based frame

00401000

00401000 main proc near

00401000 push

00401001 mov 00401003 push 00401008 mov 0040100D call

00401012 pop

00401013 retn 00401013 main endp

; CODE XREF: start+AFp

ebp, esp

offset aHelloSailor ; "Hello, Sailor!\n" ecx, offset dword 408748

ostream::operator<<(char const *) ebp

Для сравнения результат работы W32Dasm выглядит следующим образом (ниже приводится лишь содержимое функции main):

:00401000 55 :00401001 8BEC

push ebp mov ebp, esp

Possible StringData Ref from Data Obj ->"Hello, Sailor!"

:00401003 6840804000

:00401008 B948874000 :0040100D E8AB000000 :00401012 5D :00401013 C3

push 00408040 mov ecx, 00408748

call 004010BD pop ebp ret

Другое важное преимущество IDA - способность дизассемблировать зашифрованные программы. В демонстрационном примере ??? "/SRC/Crypt.com" использовалась статическая шифровка, часто встречающаяся в "конвертных" защитах. Этот простой прием полностью "ослепляет" большинство дизассемблеров. Например, результат обработки файла "Crypt.com" SOURCER-ом выглядит так:

Crypt

proc

7E5B:0100

7E5B:0100 83 C6 06 7E5B:0103 FF E6

7E5B:0105 7E5B:0108 7E5B:010C

B9 14BE

01 AD 5691 add

80 34 66 xor

start: si,6

jmp si

mov cx,14BEh ds:data 1e[di],bp

byte ptr [si],66h

;*No entry point to code

(7E5B:5691=0 f



0 1 [ 2 ] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140