12.07.2015 Views

Взлом GSM - Xakep Online

Взлом GSM - Xakep Online

Взлом GSM - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ХАКЕР.PROSoft-Ice считает, что остановился внутри процесса VMwareService. Но колонка адресовуказывает, что мы находимся в одном из драйверовЛовля драйвера на живцаinfo• С SoftICE в рукахпоиск «бутылочногогорлышка» занимаетбуквально считанныеминуты, причемрезультат абсолютнонадежен.• «Затор» возникает,когда определенныйузел компьютера(процессор, память,жесткий диск и т.п.)ограничивает потокданных. Это можносравнить с тем, какузкое горлышко ограничиваетвытекающуюиз бутылки воду.• Увеличение объемаоперативной памятиможет быть действеннымрешением длянекоторых видов «заторов»,но не решаетвсех проблем.• «Заторы» сети являютсясамыми сложнымидля обнаружения,так как сеть обычносостоит из каналовсвязи, коммутаторов,маршрутизаторов,серверов, клиентов,кучи протоколов и т.д.Впрочем, если они ее не устранили, это не повод для паники,ибо, как мы уже говорили, ресурсоемкие операции типа криптографиизанимают намного больше времени, чем, например,отдача пользователю файла в том виде, в котором он записанна диске.Достаточно часто приходится сталкиваться с горячимиточками, не имеющими ничего общего с вычислениями. Какправило, это циклы, ожидающие наступления определенныхсобытий. Правильно спроектированная программа никогдане прибегает к такому тупизму. Она просто вгоняет поток в сон,указывая, при каких обстоятельствах тот должен проснуться.Конечно, распознать циклы, не имея опыта дизассемблирования,не так-то легко, но их можно запеленговать и по диапазонупринадлежащих им адресов. Если они появляются согромным отрывом от всех остальных, отправляем программуна свалку, благо практически для всего ПО можно подобратьаналог.В качестве наглядного примера рассмотрим простую программу,мотающую холостой цикл, исходный код которой укладываетсяв одну строку на Си: «main(){while(1);}».Откомпилируем ее без опций оптимизации (в случае MS VCэто: «cl.exe hCPUl.c»), чтобы оптимизатор не выбросилненужный с его точки зрения цикл while, и запустим ее навыполнение. На однопроцессорных машинах мы получим100% загрузку по индикатору. На двухпроцессорных (илиоднопроцессорных с двумя ядрами) — 50%. Соответственно,четыре процессора/ядра дадут всего лишь 25%, хотя SoftICEпри каждом вызове будет всплывать в одном и том же процессе— hCPUl, исполняющемся в одном и том же месте — в циклеwhile. То есть, согласно SoftICE, загрузка процессора близка к100%. Это одновременно верно и нет. С одной стороны, поток,в котором исполняется цикл while, нагружает всего лишь одинпроцессор/ядро из всех имеющихся, совсем не препятствуяисполнению потоков других процессов на оставшихся процессорах(ядрах). Но реальное торможение намного больше, чемэто следует из простых арифметических расчетов. Системныйпланировщик распределяет очереди потоков равномерномежду всеми процессорами (ядрами), и если один из процессоров(ядер) захватывается «неправильным» потоком,планировщик начинает оптимизировать очередь потоков.Эффективность такой оптимизации невелика, в чем нетрудноубедиться, измерив реакционноспособность сервера с запущеннойпрограммой hCPUl и без нее.Теперь перейдем к более сложным вопросам, зарывшись внедра драйверов. SoftICE всегда отображает имя процессав правом нижнем углу, вне зависимости от того, находитсяли система на прикладном (user-land) или ядерном (kernelspace)уровне. А что у нас в ядре? Например, драйвера,которые могут вообще не иметь отношения к отображаемомупроцессу. Просто драйвер получил управление (скажем, попрерыванию, поступившему извне) именно в тот момент, когдасистема переключила контекст на данный процесс. А можетбыть, совсем другой процесс прямо или косвенно инициировалвызов драйвера и тут же заснул, система переключилаконтекст на следующий процесс, а драйвер… как бы выразитьсяделикатнее… если не завис, то конкретно застрял.Соответственно, при вызове отладчика мы будет оказыватьсяв нем чаще, чем в остальных, но имя процесса, отображаемоев нижнем углу, тут не причем.Определить, что система находится в kernel-space, оченьпросто. В конфигурации по умолчанию нижняя половинаадресного пространства принадлежит прикладным программам,а верхняя — ядру. Соответственно, если мы наблюдаемколонку адресов < 80000000h, отладчик находится внутриприкладных программ, в противном случае — это ядро илиодин из его драйверов. Селектор в прикладном режиме равен1Bh и 08h в режиме ядра.Примечание: при указании ключа 3GB в boot.ini ядро сдрайверами «ужимается» до 1 Гб. Получается, что границаядерных земель отодвигается на 40000000h. Во всяком случае,в 32‐битном режиме все происходит именно так, а в 64‐битном— совсем не так (но поскольку SoftICE работает только в32‐битном режиме, оставим проблемы 64‐битных серверов зарамками статьи).Допустим, SoftICE остановится в некотором процессе (кпримеру, VMwareService), но столбец адресов выходит запределы 80000000h, и текущая исполняемая команда, выделеннаяинверсной строкой, расположена по BFF0ACE2h.Как узнать, какому из драйверов она принадлежит? Даемкоманду «DRIVER» или «MOD» и смотрим на базовые адресазагрузки драйверов. К сожалению, SoftICE не сортирует ихпо списку возрастания, но этот недостаток легко исправить.Достаточно выйти из SoftICE, запустить поставляемыйвместе с ним Symbol Loader и сохранить историю команд втекстовой файл. Затем посредством MS Word или MS Excelпреобразовать ее в таблицу.130xàêåð 07 /115/ 08

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!