Перехват (программирование)

Поделись знанием:
Перейти к: навигация, поиск

Перехват (англ. hooking) — технология, позволяющая изменить стандартное поведение тех или иных компонентов информационной системы.





Назначение технологии перехвата

Очень часто в системном программировании возникает задача изменения стандартного поведения системных функций. Например довольно интересным применением данной технологии является переопределение оконной процедуры у GUI приложений Windows (сабклассинг). Это нужно, если программист хочет организовать собственную обработку какого-либо оконного сообщения и только потом передать стандартной оконной процедуре. После сабклассинга цикл обработки сообщений будет выглядеть так:

  • ДО САБКЛАССИНГА:

Сообщение Windows->Окно (оконная процедура)

  • ПОСЛЕ:

Сообщение Windows->Наша оконная процедура->Окно (оконная процедура)

Например, в Уроках Iczelion’а[1] описан пример того, как сабклассинг может использоваться для организации контроля ввода в элементы управления. Технологии перехвата нужны не только в этом случае, но и, например, для предварительной обработки результатов системных функций поиска файлов FindFirst и FindNext, EnumProcess, которая перечисляет процессы в Windows и т. д. Причем в этих целях такие технологии применяют как антивирусные средства[2], так и различного рода вирусы, руткиты и прочие виды вредоносного программного обеспечения.

Очень часто перехват бывает важен для организации отладки программ и является одной из основных технологий, применяемых в отладчиках. В данном случае эта технология позволяет одной программе контролировать выполнение другой. Для этих целей предусмотрен системный вызов ptrace, который позволяет подключаться к процессам, отслеживать значения регистров у контекста отлаживаемого процесса и в том числе контролировать другие системные вызовы. Он является основой для реализации такой возможности отладчиков как точки останова. Данный системный вызов хорошо документирован и присутствует во всех главных *Nix системах: Linux, FreeBSD, Solaris.[3] Чаще всего используется совместно с системным вызовом fork, который и вызывает ptrace, указывая в параметрах вызова, что запускаемый процесс — дочерний. Microsoft Windows также предоставляет для похожих целей т. н. DebugAPI[4].

Виды перехвата системных функций

Основными методами перехвата являются:

  • Подмена адреса настоящей функции (модификация IAT таблиц, модификация SSDT/IDT таблиц)
  • Непосредственное изменение функции (сплайсинг, перехват в режиме ядра с модификацией тела функции)
  • Непосредственная подмена всего компонента приложения/системы (например библиотеки с целевой функцией)

Методы можно также разделить по критерию режима выполнения:

  • Пользовательские (ring3) методы: модификация IAT таблиц, сплайсинг. Их особенность в том, что невозможно что-либо изменить в поведении ядра операционной системы и его расширений.
  • Режима ядра: модификация SSDT/IDT таблиц, перехват в режиме ядра с модификацией тела функции. Позволяет модифицировать структуры данных и код любой части операционной системы и приложений.

Сплайсинг

Сплайсинг (от англ. splice — "сращивать или склеивать концы чего-либо") — метод перехвата API функций путём изменения кода целевой функции. Обычно изменяются первые 5 байт функции. Вместо них вставляется переход на функцию, которую определяет программист. Чтобы обеспечить корректность выполнения операции, приложение, которое перехватывает функцию, обязано дать возможность выполниться коду, который был изменен в результате сплайсинга. Для этого приложение сохраняет заменяемый участок памяти у себя, а после отработки функции перехвата восстанавливает измененный участок функции и дает полностью выполниться настоящей функции.[5]

Особенности технологии

Для того чтобы программа могла использовать данную технологию, она должна иметь встроенный дизассемблерный движок и специальный дизассемблер длин, который позволит находить нужную функцию и корректно её изменять. Эта технология крайне платформенно-зависима, а потому требует тщательного контроля и проверки системы на соответствие версий, а также проверки самой функции на соответствие целевой. Системные функции могут меняться при выходе патчей и обновлений Windows (особенно Service Pack для Windows), а также в результате модификаций со стороны других приложений. Ошибки при работе с данной технологией могут приводить к BSOD. В то же время эта технология позволяет осуществлять глобальный перехват API функций, влияя таким образом на все процессы в системе. Начиная с Windows XP SP2 для поддержки "горячего патча" Microsoft изменила стандартный пролог функций с трех байт до пяти (добавила mov edi, edi в стандартный пролог push ebp; mov ebp, esp), что позволяет не проводить анализ длин. Длины в пять байт хватает для замены пролога на опкоды дальнего перехода, а известный пролог позволяет корректно передать управление подменяемой функции.

Сферы применения сплайсинга и методы обнаружения

Он применяется:

  • В ПО, которому необходимо осуществлять функции мониторинга системы
  • Механизмом хуков в Windows
  • Различного рода вредоносными программами. Это основная технология сокрытия для руткитов пользовательского уровня

Основной метод обнаружения факта сплайсинга — это сравнение машинного кода функции, проверяемой на сплайсинг, и кода системной функции, полученного в заведомо чистой системе. Также в обнаружении сплайсинга функции может помочь контроль адресов перехода.

Сравнение с другими технологиями

  • Изменение IAT таблиц процесса[6]. Данная технология не позволяет изменить поведение самой системной функции, а лишь дает возможность «обмануть» выбранное приложение, заставив его использовать вашу функцию. IAT таблица — таблица адресов функций, импортируемых процессом. Технология носит лишь локальный характер, хотя может быть применена сразу к группе приложений. Может быть довольно быстро обнаружена из-за необходимости загрузки DLL[7] в адресное пространство целевого процесса. Сплайсинг же не требует DLL и внедрения в чужой процесс, обладает возможностью глобального захвата функции. У сплайсинга есть ещё одно преимущество: не все системные функции импортируются процессом через IAT. Например, функция может быть загружена вызовом GetProcAddress. Использование же непосредственной модификации кода функции снимает подобное ограничение.
  • Перехват в режиме ядра. Позволяет перехватывать любые функции, в том числе и экспортируемые ядром. Наиболее труден для обнаружения в случае успеха, так как позволяет фальсифицировать любые данные, предоставляемые операционной системой. Требует написания специального компонента для взаимодействия с ядром драйвера. Может привести к BSOD при неправильном программировании в режиме ядра. Может быть обнаружен на фазе загрузки драйвера в ядро или при проверке активных драйверов, а также при проверке ядра на изменения[8]. Более трудный в программировании метод, чем сплайсинг, но более гибкий, так как позволяет перехватить функции самого ядра, а не только WinAPI функции, которые служат лишь посредником между ядром и программой, которая что-либо запрашивает у операционной системы.
  • Замена самой библиотеки с функцией. Весьма радикальное решение проблемы, обладающее рядом существенных недостатков:
  1. Требует замены файла на диске, что может быть запрещено и пресечено самой системой. Например, замену системных файлов Windows не позволит выполнить защита файлов Windows (WFP), хотя её можно и отключить. Такое действие может быть также обнаружено при статическом анализе системы ревизорами.
  2. Требуется полная эмуляция всех возможностей заменяемой DLL или иного компонента, что весьма трудоемко даже в случае открытости и осложняется необходимостью дизассемблирования в случае закрытости целевой программы.

Все это показывает, что это весьма нерациональный способ решения проблемы изменения поведения программы в случае возможности применения первых двух подходов или сплайсинга.

Перехват в режиме ядра

Он основан на модификации структур данных ядра и функций. Главными мишенями воздействия являются таблицы

  • IDT Таблица диспетчеризации прерываний. Довольно важным для перехвата является прерывание, обрабатывающее обращение к таблице служб SSDT (0x2E)[9].
  • SSDT (System Service Dispatch Table) Таблица диспетчеризации системных сервисов. Обращаясь к ней, система по номеру запрещенного сервиса может получить адрес соответствующего сервиса ядра и вызвать его. А таблица SSPT содержит общий размер параметров, передаваемых системному сервису.
  • psActiveprocess Структура ядра, хранящая список процессов в системе.
  • IRP Таблица драйвера, которая хранит указатели на функции обработки IRP-пакетов.
  • EPROCESS Структура ядра, хранящая большое количество информации о процессе, включая, например, PID (идентификатор процесса).

Такого рода руткиты называются DKOM-руткитами, то есть руткитами, основанными на непосредственной модификации объектов ядра. В руткитах для систем Windows Server 2003 и XP эта технология была модернизирована, так как в этих ОС появилась защита от записи некоторых областей памяти ядра[9]. Windows Vista и 7 получили дополнительную защиту ядра PatchGuard, однако все эти технологии были преодолены руткитописателями[10]. В то же время перехват системных функций в режиме ядра — основа проактивных систем защиты и гипервизоров.

Иные формы перехвата

Можно выделить и другие формы перехвата:

  • Перехват сетевых соединений и пакетов.[11]
  • Перехват паролей. Например, при помощи шпионажа за клавиатурным вводом при помощи кейлоггера.
  • Перехват обращений браузера к сайтам при помощи HTTP Proxy или расширений браузера. Позволяет проанализировать и/или подменить данные, которыми обмениваются браузер и сервер.

Здесь описана лишь часть применений данной технологии.

Примеры программ, использующих перехват

Примеры кода


См. также

Напишите отзыв о статье "Перехват (программирование)"

Примечания

  1. [web.archive.org/web/20121018164714/wasm.ru/article.php?article=1001020 Уроки Iczelion’а. Win32 API. Урок 20. Сабклассинг окна]
  2. К примеру: невозможно получить доступ к процессу Kaspersky Internet Security штатными средствами Windows API, так как соответствующие функции перехвачены антивирусом.
  3. Страница из man Linux Ubuntu: [manpages.ubuntu.com/manpages/jaunty/man2/ptrace.2.html man страница о вызове ptrace] и русскоязычная версия: [www.opennet.ru/cgi-bin/opennet/man.cgi?topic=ptrace&category=2 Русский перевод на OpenNET]
  4. Официальное описание: [msdn.microsoft.com/en-us/library/ms809754.aspx The Debugging Application Programming Interface], а также примеры использования: [www.wasm.ru/article.php?article=1001028 Win32 API. Урок 28. Win32 Debug API I]
  5. [wasm.ru/series.php?sid=8 Цикл статей по перехвату WindowsAPI функций от Ms Rem]
  6. Методы доступа и модификации IAT таблицы довольно подробно описаны у Хоглунд Г., Батлер Дж. — Руткиты: внедрение в ядро Windows. Гл 4 Древнее искусство захвата
  7. Методы внедрения DLL в чужой процесс описаны довольно подробно у Дж. Рихтера Кристофера Назара Windows via C/C++. Программирование на языке Visual C++. Некоторые методы внедрения впервые документировал сам Дж. Рихтер
  8. Например, один из первых руткит-детектеров [wasm.ru/toollist.php?list=21 KLISTNER]
  9. 1 2 Г. Хоглунд Дж. Батлер Руткиты внедрение в ядро Windows. Глава 4 Древнее искусство захвата
  10. [www.xakep.ru/magazine/xs/072/072/5.asp убийство часового КРИС КАСПЕРСКИ, АКА МЫЩЪХ Спецвыпуск: Хакер, номер #072, стр. 072-072-5]
  11. Например, этим занимаются снифферы. Одной из бесплатных реализаций захвата сетевых пакетов является сетевой драйвер уровня NDIS WinPCAP

Литература

Ссылки

  • [wasm.ru/series.php?sid=8 Цикл статей по перехвату функций от Ms Rem]
  • [wasm.ru/article.php?article=tracknapi Слежение за вызовами Native API]
  • [wasm.ru/publist.php?list=1 Туториалы Iczelion’а о Win32 API]
  • [www.xakep.ru/magazine/xs/072/072/5.asp Убийство часового КРИС КАСПЕРСКИ, АКА МЫЩЪХ Спецвыпуск: Хакер, номер #072, стр. 072-072-5]
  • [kaimi.ru/2010/08/your-own-injector/ Сплайсинг WinAPI с использованием Си и MASM]

Отрывок, характеризующий Перехват (программирование)

«Le chef de la garienison de Glogau avec dix mille hommes, demande au Roi de Prusse, ce qu'il doit faire s'il est somme de se rendre?… Tout cela est positif.
«Bref, esperant en imposer seulement par notre attitude militaire, il se trouve que nous voila en guerre pour tout de bon, et ce qui plus est, en guerre sur nos frontieres avec et pour le Roi de Prusse . Tout est au grand complet, il ne nous manque qu'une petite chose, c'est le general en chef. Comme il s'est trouve que les succes d'Austerlitz aurant pu etre plus decisifs si le general en chef eut ete moins jeune, on fait la revue des octogenaires et entre Prosorofsky et Kamensky, on donne la preference au derienier. Le general nous arrive en kibik a la maniere Souvoroff, et est accueilli avec des acclamations de joie et de triomphe.
«Le 4 arrive le premier courrier de Petersbourg. On apporte les malles dans le cabinet du Marieechal, qui aime a faire tout par lui meme. On m'appelle pour aider a faire le triage des lettres et prendre celles qui nous sont destinees. Le Marieechal nous regarde faire et attend les paquets qui lui sont adresses. Nous cherchons – il n'y en a point. Le Marieechal devient impatient, se met lui meme a la besogne et trouve des lettres de l'Empereur pour le comte T., pour le prince V. et autres. Alors le voila qui se met dans une de ses coleres bleues. Il jette feu et flamme contre tout le monde, s'empare des lettres, les decachete et lit celles de l'Empereur adressees a d'autres. А, так со мною поступают! Мне доверия нет! А, за мной следить велено, хорошо же; подите вон! Et il ecrit le fameux ordre du jour au general Benigsen
«Я ранен, верхом ездить не могу, следственно и командовать армией. Вы кор д'арме ваш привели разбитый в Пултуск: тут оно открыто, и без дров, и без фуража, потому пособить надо, и я так как вчера сами отнеслись к графу Буксгевдену, думать должно о ретираде к нашей границе, что и выполнить сегодня.
«От всех моих поездок, ecrit il a l'Empereur, получил ссадину от седла, которая сверх прежних перевозок моих совсем мне мешает ездить верхом и командовать такой обширной армией, а потому я командованье оной сложил на старшего по мне генерала, графа Буксгевдена, отослав к нему всё дежурство и всё принадлежащее к оному, советовав им, если хлеба не будет, ретироваться ближе во внутренность Пруссии, потому что оставалось хлеба только на один день, а у иных полков ничего, как о том дивизионные командиры Остерман и Седморецкий объявили, а у мужиков всё съедено; я и сам, пока вылечусь, остаюсь в гошпитале в Остроленке. О числе которого ведомость всеподданнейше подношу, донеся, что если армия простоит в нынешнем биваке еще пятнадцать дней, то весной ни одного здорового не останется.
«Увольте старика в деревню, который и так обесславлен остается, что не смог выполнить великого и славного жребия, к которому был избран. Всемилостивейшего дозволения вашего о том ожидать буду здесь при гошпитале, дабы не играть роль писарскую , а не командирскую при войске. Отлучение меня от армии ни малейшего разглашения не произведет, что ослепший отъехал от армии. Таковых, как я – в России тысячи».
«Le Marieechal se fache contre l'Empereur et nous punit tous; n'est ce pas que с'est logique!
«Voila le premier acte. Aux suivants l'interet et le ridicule montent comme de raison. Apres le depart du Marieechal il se trouve que nous sommes en vue de l'ennemi, et qu'il faut livrer bataille. Boukshevden est general en chef par droit d'anciennete, mais le general Benigsen n'est pas de cet avis; d'autant plus qu'il est lui, avec son corps en vue de l'ennemi, et qu'il veut profiter de l'occasion d'une bataille „aus eigener Hand“ comme disent les Allemands. Il la donne. C'est la bataille de Poultousk qui est sensee etre une grande victoire, mais qui a mon avis ne l'est pas du tout. Nous autres pekins avons, comme vous savez, une tres vilaine habitude de decider du gain ou de la perte d'une bataille. Celui qui s'est retire apres la bataille, l'a perdu, voila ce que nous disons, et a ce titre nous avons perdu la bataille de Poultousk. Bref, nous nous retirons apres la bataille, mais nous envoyons un courrier a Petersbourg, qui porte les nouvelles d'une victoire, et le general ne cede pas le commandement en chef a Boukshevden, esperant recevoir de Petersbourg en reconnaissance de sa victoire le titre de general en chef. Pendant cet interregne, nous commencons un plan de man?uvres excessivement interessant et original. Notre but ne consiste pas, comme il devrait l'etre, a eviter ou a attaquer l'ennemi; mais uniquement a eviter le general Boukshevden, qui par droit d'ancnnete serait notre chef. Nous poursuivons ce but avec tant d'energie, que meme en passant une riviere qui n'est рas gueable, nous brulons les ponts pour nous separer de notre ennemi, qui pour le moment, n'est pas Bonaparte, mais Boukshevden. Le general Boukshevden a manque etre attaque et pris par des forces ennemies superieures a cause d'une de nos belles man?uvres qui nous sauvait de lui. Boukshevden nous poursuit – nous filons. A peine passe t il de notre cote de la riviere, que nous repassons de l'autre. A la fin notre ennemi Boukshevden nous attrappe et s'attaque a nous. Les deux generaux se fachent. Il y a meme une provocation en duel de la part de Boukshevden et une attaque d'epilepsie de la part de Benigsen. Mais au moment critique le courrier, qui porte la nouvelle de notre victoire de Poultousk, nous apporte de Petersbourg notre nomination de general en chef, et le premier ennemi Boukshevden est enfonce: nous pouvons penser au second, a Bonaparte. Mais ne voila t il pas qu'a ce moment se leve devant nous un troisieme ennemi, c'est le православное qui demande a grands cris du pain, de la viande, des souchary, du foin, – que sais je! Les magasins sont vides, les сhemins impraticables. Le православное se met a la Marieaude, et d'une maniere dont la derieniere campagne ne peut vous donner la moindre idee. La moitie des regiments forme des troupes libres, qui parcourent la contree en mettant tout a feu et a sang. Les habitants sont ruines de fond en comble, les hopitaux regorgent de malades, et la disette est partout. Deux fois le quartier general a ete attaque par des troupes de Marieaudeurs et le general en chef a ete oblige lui meme de demander un bataillon pour les chasser. Dans une de ces attaques on m'a еmporte ma malle vide et ma robe de chambre. L'Empereur veut donner le droit a tous les chefs de divisions de fusiller les Marieaudeurs, mais je crains fort que cela n'oblige une moitie de l'armee de fusiller l'autre.
[Со времени наших блестящих успехов в Аустерлице, вы знаете, мой милый князь, что я не покидаю более главных квартир. Решительно я вошел во вкус войны, и тем очень доволен; то, что я видел эти три месяца – невероятно.
«Я начинаю аb ovo. Враг рода человеческого , вам известный, аттакует пруссаков. Пруссаки – наши верные союзники, которые нас обманули только три раза в три года. Мы заступаемся за них. Но оказывается, что враг рода человеческого не обращает никакого внимания на наши прелестные речи, и с своей неучтивой и дикой манерой бросается на пруссаков, не давая им времени кончить их начатый парад, вдребезги разбивает их и поселяется в потсдамском дворце.
«Я очень желаю, пишет прусской король Бонапарту, чтобы ваше величество были приняты в моем дворце самым приятнейшим для вас образом, и я с особенной заботливостью сделал для того все нужные распоряжения на сколько позволили обстоятельства. Весьма желаю, чтоб я достигнул цели». Прусские генералы щеголяют учтивостью перед французами и сдаются по первому требованию. Начальник гарнизона Глогау, с десятью тысячами, спрашивает у прусского короля, что ему делать, если ему придется сдаваться. Всё это положительно верно. Словом, мы думали внушить им страх только положением наших военных сил, но кончается тем, что мы вовлечены в войну, на нашей же границе и, главное, за прусского короля и заодно с ним. Всего у нас в избытке, недостает только маленькой штучки, а именно – главнокомандующего. Так как оказалось, что успехи Аустерлица могли бы быть положительнее, если б главнокомандующий был бы не так молод, то делается обзор осьмидесятилетних генералов, и между Прозоровским и Каменским выбирают последнего. Генерал приезжает к нам в кибитке по Суворовски, и его принимают с радостными и торжественными восклицаниями.
4 го приезжает первый курьер из Петербурга. Приносят чемоданы в кабинет фельдмаршала, который любит всё делать сам. Меня зовут, чтобы помочь разобрать письма и взять те, которые назначены нам. Фельдмаршал, предоставляя нам это занятие, ждет конвертов, адресованных ему. Мы ищем – но их не оказывается. Фельдмаршал начинает волноваться, сам принимается за работу и находит письма от государя к графу Т., князю В. и другим. Он приходит в сильнейший гнев, выходит из себя, берет письма, распечатывает их и читает письма Императора, адресованные другим… Затем пишет знаменитый суточный приказ генералу Бенигсену.
Фельдмаршал сердится на государя, и наказывает всех нас: неправда ли это логично!
Вот первое действие. При следующих интерес и забавность возрастают, само собой разумеется. После отъезда фельдмаршала оказывается, что мы в виду неприятеля, и необходимо дать сражение. Буксгевден, главнокомандующий по старшинству, но генерал Бенигсен совсем не того же мнения, тем более, что он с своим корпусом находится в виду неприятеля, и хочет воспользоваться случаем дать сражение самостоятельно. Он его и дает.
Это пултуская битва, которая считается великой победой, но которая совсем не такова, по моему мнению. Мы штатские имеем, как вы знаете, очень дурную привычку решать вопрос о выигрыше или проигрыше сражения. Тот, кто отступил после сражения, тот проиграл его, вот что мы говорим, и судя по этому мы проиграли пултуское сражение. Одним словом, мы отступаем после битвы, но посылаем курьера в Петербург с известием о победе, и генерал Бенигсен не уступает начальствования над армией генералу Буксгевдену, надеясь получить из Петербурга в благодарность за свою победу звание главнокомандующего. Во время этого междуцарствия, мы начинаем очень оригинальный и интересный ряд маневров. План наш не состоит более, как бы он должен был состоять, в том, чтобы избегать или атаковать неприятеля, но только в том, чтобы избегать генерала Буксгевдена, который по праву старшинства должен бы был быть нашим начальником. Мы преследуем эту цель с такой энергией, что даже переходя реку, на которой нет бродов, мы сжигаем мост, с целью отдалить от себя нашего врага, который в настоящее время не Бонапарт, но Буксгевден. Генерал Буксгевден чуть чуть не был атакован и взят превосходными неприятельскими силами, вследствие одного из таких маневров, спасавших нас от него. Буксгевден нас преследует – мы бежим. Только что он перейдет на нашу сторону реки, мы переходим на другую. Наконец враг наш Буксгевден ловит нас и атакует. Оба генерала сердятся и дело доходит до вызова на дуэль со стороны Буксгевдена и припадка падучей болезни со стороны Бенигсена. Но в самую критическую минуту курьер, который возил в Петербург известие о пултуской победе, возвращается и привозит нам назначение главнокомандующего, и первый враг – Буксгевден побежден. Мы теперь можем думать о втором враге – Бонапарте. Но оказывается, что в эту самую минуту возникает перед нами третий враг – православное , которое громкими возгласами требует хлеба, говядины, сухарей, сена, овса, – и мало ли чего еще! Магазины пусты, дороги непроходимы. Православное начинает грабить, и грабёж доходит до такой степени, о которой последняя кампания не могла вам дать ни малейшего понятия. Половина полков образуют вольные команды, которые обходят страну и все предают мечу и пламени. Жители разорены совершенно, больницы завалены больными, и везде голод. Два раза мародеры нападали даже на главную квартиру, и главнокомандующий принужден был взять баталион солдат, чтобы прогнать их. В одно из этих нападений у меня унесли мой пустой чемодан и халат. Государь хочет дать право всем начальникам дивизии расстреливать мародеров, но я очень боюсь, чтобы это не заставило одну половину войска расстрелять другую.]
Князь Андрей сначала читал одними глазами, но потом невольно то, что он читал (несмотря на то, что он знал, на сколько должно было верить Билибину) больше и больше начинало занимать его. Дочитав до этого места, он смял письмо и бросил его. Не то, что он прочел в письме, сердило его, но его сердило то, что эта тамошняя, чуждая для него, жизнь могла волновать его. Он закрыл глаза, потер себе лоб рукою, как будто изгоняя всякое участие к тому, что он читал, и прислушался к тому, что делалось в детской. Вдруг ему показался за дверью какой то странный звук. На него нашел страх; он боялся, не случилось ли чего с ребенком в то время, как он читал письмо. Он на цыпочках подошел к двери детской и отворил ее.
В ту минуту, как он входил, он увидал, что нянька с испуганным видом спрятала что то от него, и что княжны Марьи уже не было у кроватки.
– Мой друг, – послышался ему сзади отчаянный, как ему показалось, шопот княжны Марьи. Как это часто бывает после долгой бессонницы и долгого волнения, на него нашел беспричинный страх: ему пришло в голову, что ребенок умер. Всё, что oн видел и слышал, казалось ему подтверждением его страха.
«Всё кончено», подумал он, и холодный пот выступил у него на лбу! Он растерянно подошел к кроватке, уверенный, что он найдет ее пустою, что нянька прятала мертвого ребенка. Он раскрыл занавески, и долго его испуганные, разбегавшиеся глаза не могли отыскать ребенка. Наконец он увидал его: румяный мальчик, раскидавшись, лежал поперек кроватки, спустив голову ниже подушки и во сне чмокал, перебирая губками, и ровно дышал.
Князь Андрей обрадовался, увидав мальчика так, как будто бы он уже потерял его. Он нагнулся и, как учила его сестра, губами попробовал, есть ли жар у ребенка. Нежный лоб был влажен, он дотронулся рукой до головы – даже волосы были мокры: так сильно вспотел ребенок. Не только он не умер, но теперь очевидно было, что кризис совершился и что он выздоровел. Князю Андрею хотелось схватить, смять, прижать к своей груди это маленькое, беспомощное существо; он не смел этого сделать. Он стоял над ним, оглядывая его голову, ручки, ножки, определявшиеся под одеялом. Шорох послышался подле него, и какая то тень показалась ему под пологом кроватки. Он не оглядывался и всё слушал, глядя в лицо ребенка, его ровное дыханье. Темная тень была княжна Марья, которая неслышными шагами подошла к кроватке, подняла полог и опустила его за собою. Князь Андрей, не оглядываясь, узнал ее и протянул к ней руку. Она сжала его руку.