термоядерный инлайн

GETORIX | INT3

Спецвыпуск: Хакер, номер #066, стр. 066-068-2

5 НА ВТОРОЙ СТАНИЦЕ ОТМЕЧАЕМ ВСЕ (CREATE IMPORTS SEGMENT, CREATE RESOURCE SEGMENT).

6 НЕСКОЛЬКО РАЗ ЖМЕМ «ДАЛЕЕ», ОСТАВЛЯЯ ВСЕ ОСТАЛЬНЫЕ НАСТРОЙКИ КАК ЕСТЬ.

После закрытия окна Wizard IDA начнет свой анализ. Так как файл небольшой, процесс не займет много времени.

Как обычно, сначала должен быть определен тип защиты программы. Запускаем ее на устройстве (или эмуляторе). Сразу наблюдаем окно с надписью «This trial copy of PhonTuner will exit in 60 seconds. To purchase a fully functional copy, please visit: www.phonature.com. Thanks for supporting our product». Маловато. Однако жмем ОК и 60 секунд наслаждаемся работой программы. Время проходит, и на экране появляется MessageBox с надписью, аналогичной той, что была в самом начале (см. рис. 1). Затем программа действительно завершается.

Выяснилось, откуда можно плясать. Значит, переходим в IDA. Как правило, MessageBox использует строки из секции .data, поэтому начнем с просмотра данных в окне Strings window. Удивительно, но искомая строка обнаруживается только в секции ресурсов .rsrc, а в секции данных ничего похожего нет (на самом деле есть, в чем убеждаемся перейдя на адрес 02978C. IDA этого не заметила, что очень загадочно). Не страшно, нужный код обращения к MessageBox можно найти менее интеллектуальным, но очень надежным путем — через LR (Link Register) или продвигаясь по вызовам функций снизу вверх. Для этого в окне Names window ищем строку MessageBox, щелкаем по ней дважды и переходим на код, представленный в листинге 1.

Листинг 1. Код вызова функции MessageBox

.text:0001D268 ; int __stdcall MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)

.text:0001D268 MessageBoxW ; CODE XREF: sub_119F4+204 p

.text:0001D268 ; sub_119F4+228 p ...

.text:0001D268 LDR R12, =__imp_MessageBoxW

.text:0001D26C LDR PC, [R12]

.text:0001D26C ; End of function MessageBoxW

Эта процедура передает управление в системную библиотеку coredll.dll, которая, собственно, и отображает сообщение. Нам же нужно узнать, откуда она вызывается. Можно, конечно, нажать клавишу <x> и просмотреть все ее вызовы через XREF (перекрестные ссылки), но поступим проще. Просто поставим breakpoint на адрес 1D268 и запустим программу в отладчике (в IDA 4.9 — кнопка F9). Пропускаем диалог с напоминанием при загрузке и ждем ненавистные 60 секунд. Останавливаемся, где просили, и смотрим в регистр LR. Там красуется адрес 168C8. Переходим на него в листинге IDA, видим формирование текста сообщения и полное отсутствие каких-либо ветвлений. Что ж, видимо, нужно забраться куда-то выше. Повторим только что проделанный трюк и поставим breakpoint на начало этой функции (адрес 16880). Перезапускаем программу в отладчике, снова ждем. На этот раз после остановки в LR лежит адрес 18DF8. По нему переходим в IDA и обнаруживаем там содержимое листинга 2. Ну вот, совсем другое дело.

Листинг 2. Код, анализирующий таймер

.text:00018DC0 LDRB R3, [R4,R7]

.text:00018DC4 CMP R3, #0 ; [прошла ли секунда?]

Назад на стр. 066-068-1  Содержание  Вперед на стр. 066-068-3
ttfb: 4.6579837799072 ms