Gray Hat C#

#6 Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности. Интеграция с нативными библиотеками.

Здравствуйте, дорогие друзья.

Наконец, иногда Вам необходимо использовать библиотеки, доступные только в стандартных библиотеках операционной системы, например libc в Linux и user32.dll в Windows. Если Вы планируете использовать код в библиотеке, написанной на C, C++ или другом языке, который компилируется в собственную ассемблерную систему, C# очень упрощает работу с этими собственными библиотеками, и мы будем использовать этот метод в следующих статьях при создании кросс-платформенной библиотеки, для полезных нагрузок Metasploit. Эта функция называется Platform Invoke или сокращенно P/Invoke. Программистам часто приходится использовать собственные библиотеки, поскольку они быстрее виртуальных машин, например, используемых в .NET или Java. Программисты, такие как финансовые или научные специалисты, которые используют код для сложных математических вычислений, могут писать код, который им нужен для быстрой работы, на C (например, код для прямого взаимодействия с аппаратным обеспечением), но использовать C# для обработки кода, требующего меньшей скорости.
В листинге 1.14 показано простое приложение, которое использует P/Invoke для вызова стандартной функции C printf() в Linux или для открытия окна сообщения с использованием user32.dll в Windows.

Listing 1-14: Demonstrating P/Invoke with a simple example
Listing 1-14: Demonstrating P/Invoke with a simple example

Этот пример выглядит сложнее, чем есть на самом деле. Сначала мы объявляем две функции, которые будут искаться извне, в разных библиотеках. Мы делаем это, используя атрибут DllImport [1]. Атрибуты позволяют добавлять дополнительную информацию к методам (или классам, свойствам классов и т. д.), которые используются во время выполнения виртуальной машиной .NET или Mono. В нашем случае атрибут DllImport сообщает среде выполнения, что нужно искать метод, который мы объявляем, в другой DLL, вместо того, чтобы ожидать, что мы напишем его. Мы также объявляем точные имена функций и параметры, которые ожидают функции. В Windows мы можем использовать функцию MessageBox(), которая ожидает несколько параметров, таких как заголовок всплывающего окна и отображаемый текст. В Linux, функция printf() ожидает печати строки. Обе эти функции просматриваются во время выполнения, что означает, что мы можем скомпилировать их в любой системе, поскольку функция во внешней библиотеке не ищется до тех пор, пока программа не запустится и не будет вызвана функция. Это позволяет нам скомпилировать приложение в любой операционной системе, независимо от того, имеет ли эта система одну или обе библиотеки. Объявив наши собственные функции, мы можем написать быстрый метод Main() [2], который проверяет текущую операционную систему с помощью оператора if, используя os.Platform [3]. Свойство Platform, которое мы используем, сопоставляется с перечислением PlatformID [4], в котором хранятся доступные операционные системы, на которых может работать программа. Используя перечисление PlatformID, мы можем проверить, находимся ли мы в Windows, а затем вызвать соответствующий метод: либо MessageBox() [5] в Windows, либо printf() [6] в Unix. Это приложение после компиляции можно запускать как на компьютере с Windows, так и на компьютере с Linux, независимо от того, в какой операционной системе оно было скомпилировано.


Заключение

Язык C# обладает множеством современных функций, которые делают его отличным языком для сложных данных и приложений. Мы лишь поверхностно коснулись некоторых наиболее мощных функций, таких как анонимные методы и P/Invoke. В последующих разделах Вы познакомитесь с концепциями классов и интерфейсов, а также со многими другими расширенными функциями. Кроме того, Вы узнаете о многих других доступных Вам основных классах, таких как клиенты HTTP и TCP и многое другое.


По мере того, как мы разрабатываем собственные инструменты безопасности, Вы также узнаете об общих шаблонах программирования, которые являются полезными соглашениями для создания классов, упрощающими и ускоряющими их создание.
C# — красивый и мощный полнофункциональный язык, а благодаря кроссплатформенной поддержке Mono, которая переносит C# на телефоны и встраиваемые устройства, он так же функционален и удобен в использовании, как Java, таки и в других альтернативах.

На этом все. Всем хорошего дня!

Цикл статей по Gray Hat C#. Руководство для хакера по созданию и автоматизации инструментов безопасности.