Клизма для файрвола Николай «GorluM» Андреев Хакер, номер #072, стр. 072-112-2 И это только маленькая часть всех возможностей, открывающихся перед взломщиком, изучившим такую невероятно полезную технологию, как Process Injection. О возможностях перехвата я вообще молчу - это тема не для одной статьи. Способы инжектирования Реализовать выполнение собственного кода в контексте чужого процесса можно кучей разных способов. Небезызвестный программист, редактор Microsoft Press и просто хороший человек Джеффри Рихтер, например, предлагает выполнять свой код из подгружаемой к процессу динамической библиотеки. Для осуществления этого способа весь инжектируемый код вшивается в DLL и запускается из ее EntryPoint, после чего эта библиотека некоторым образом подгружается к чужому процессу. Рихтер в своей книге «Programming Applications for Windows» описывает множество разнообразных методов внедрения DLL. Самыми популярными из них являются использование недокументированных ключей реестра для подгрузки своих библиотек к системным процессам, использование ловушек и удаленных потоков. Для установки ловушки в Windows используется функция API SetWindowsHookEx, одним из параметров которой является идентификатор динамической библиотеки, содержащей функцию-обработчик хука. В результате установки эта DLL подгружается ко всем охватываемым ловушкой процессам. Это не лучший способ инжектирования, так как внедряемый код будет запускаться в контексте нескольких процессов одновременно – это приводит к багам. Обход же этой фичи заставит кодера написать еще не один десяток строк программы. Способ с реестром заключается в том, что если прописать в определенном ключе (HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs) путь к внедряемой DLL, то она будет загружаться ко всякому процессу, использующему user32.dll. Недостатков масса – тут и легкость обнаружения инжектирования, и ограничение на выбор процессов. В общем, способ не катит. Самой интересной идеей из предложенных Рихтером оказалось использование удаленных потоков. Способ позволял внедрять DLL в определенный тобой процесс, фактически не напрягаясь. Основан он на функции CreateRemoteThread, которая создает нить в заданном процессе из заданной функции. Рихтер, не долго думая, впихнул в параметры адрес функции LoadLibraryA и адрес скопированной в пространство процесса-жертвы строки с путем к библиотеке, что заставило процесс подгрузить библиотеку без всяческих претензий с его стороны. Способ был бы просто идеален, если бы не необходимость использования динамических библиотек. Ведь это и лишние килобайты для Трояна, и геморрой при написании. Именно поэтому я и хочу предложить тебе уже не новый, но невероятно удобный метод безбиблиотечного инжектирования собственного кода в чужой процесс. Скажи «НЕТ» динамическим библиотекам! Метод исполнения кода в чужом процессе без использования DLL, о котором я поведаю ниже, судя по всему, впервые был использован замечательной группой Cult of the Dead Cow в их шедевре BO2k. С первого взгляда на него я понял – в этих строках есть Дао. Метод понятен, легок в реализации и просто красив. Я был очарован им, надеюсь, на тебя он тоже произведет впечатление. |