Анимация
JavaScript
|
Главная Библионтека
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 |