Прослушка хорошо реализована в Metasploit и Cobalt Strike. Metasploit написан на Ruby, а исходный код Cobalt Strike закрыт. Другие реализации не приходят на ум сразу, но было бы неплохо иметь небольшие и чистые примеры кода, которые легко можно добавить в свою программу.
Еще по теме: Сравнение C&C Metasploit с альтернативой Havoc
Написание программы для прослушки на C#
На C++ код, который нам для этого понадобится, будет большим, громоздким и неудобным. Плюс для исполнения в памяти (как мы любим) потребуется конвертировать его в шелл‑код, затем думать над инжектором, а уж делать COFF — это совсем для избранных. Впрочем, если интересно почитать про выполнение в памяти, то обрати внимание на другую мою статью.
Вся информация, методы и инструменты, описанные в данной статье, предназначены для обучения этичных хакеров (пентестеров). Использование представленной в статье информации для атак на частные лица или организации без их предварительного согласия является незаконным. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Итак, воспользуемся C#. Для записи аудио удобно использовать Nuget-пакет NAudio.
Сразу же находим пример использования.
1 2 3 4 5 6 7 8 9 |
public void StartRec() { WaveSourceStream = new NAudio.Wave.WaveInEvent(); WaveSourceStream.DeviceNumber = 0; WaveSourceStream.WaveFormat = new WaveFormat(16000,1); WaveSourceStream.DataAvailable += sourceStream_DataAvailable; WaveSourceStream.StartRecording(); bufl = new List<byte[]>(); } |
Впрочем, все‑таки лучше написать с нуля. У меня получилась вот такая программа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using NAudio.Wave; using NAudio.Lame; namespace MicrophoneRecordToMp3 { class Program { static void Main(string[] args) { int deviceNumber = 1; string outputFilePath = "recorded_audio.mp3"; using (var waveIn = new WaveInEvent()) { waveIn.DeviceNumber = deviceNumber; waveIn.WaveFormat = new WaveFormat(44100, 1); var writer = new LameMP3FileWriter(outputFilePath, waveIn.WaveFormat, LAMEPreset.STANDARD); void WaveInDataAvailable(object sender, WaveInEventArgs e) { writer.Write(e.Buffer, 0, e.BytesRecorded); } waveIn.DataAvailable += WaveInDataAvailable; waveIn.StartRecording(); Console.WriteLine("Recording... Press Enter to stop and save the file."); Console.ReadLine(); waveIn.StopRecording(); } Console.WriteLine($"Recording saved to '{outputFilePath}'"); } } } |
Этот код позволяет записывать аудио с микрофона в формате .mp3 до тех пор, пока не будет нажата клавиша Enter. Проблема в том, что здесь строго используется некоторое первое (deviceNumber = 1) микрофонное устройство. Чтобы использовать устройство по умолчанию, просто удалим эти строки.
Ниже — финальный PoC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; using NAudio.Wave; using NAudio.Lame; namespace MicrophoneRecordToMp3 { class Program { static void Main(string[] args) { // Путь для сохранения файла string outputFilePath = "recorded_audio.mp3"; // Инициализация объекта WaveInEvent для записи с микрофона using (var waveIn = new WaveInEvent()) { // Задаем формат записи: частота дискретизации 44 100 Гц, один канал (моно) waveIn.WaveFormat = new WaveFormat(44100, 1); // Создаем MP3 writer и оборачиваем его в using, чтобы обеспечить корректное закрытие файла using (var writer = new LameMP3FileWriter(outputFilePath, waveIn.WaveFormat, LAMEPreset.STANDARD)) { // Обработчик события DataAvailable void WaveInDataAvailable(object sender, WaveInEventArgs e) { writer.Write(e.Buffer, 0, e.BytesRecorded); } // Подписываемся на событие DataAvailable waveIn.DataAvailable += WaveInDataAvailable; // Начинаем запись waveIn.StartRecording(); Console.WriteLine("Recording... Press Enter to stop and save the file."); // Ждем нажатия клавиши Enter для остановки записи Console.ReadLine(); // Останавливаем запись waveIn.StopRecording(); } } // Сообщаем о сохранении записи Console.WriteLine($"Recording saved to '{outputFilePath}'"); } } } |
В статье, конечно, продемонстрировать тебе звук не могу, но он был успешно записан, честно‑честно!
Кстати, если тебя интересует способ на C++, то можно использовать Windows Wave API, пример кода есть на GitHub.
Впрочем, существуют проекты, умеющие писать звук и через DirectX, например SharpDXWebcam.
Хочешь приколоться над админом в лучших традициях «Западлостроения»? Если он любит слушать на работе музыку, то мы можем через NAudio изменить уровень громкости! Устрой дискотеку!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using NAudio.CoreAudioApi; using System; public class VolumeChanger { public void SetVolume(int volumeLevel) { if (volumeLevel < 0 || volumeLevel > 100) throw new ArgumentException("Volume must be between 0 and 100."); // Инициализация объекта MMDeviceEnumerator для взаимодействия с аудиоустройствами MMDeviceEnumerator devEnum = new MMDeviceEnumerator(); MMDevice defaultDevice = devEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); // Приведение указанного уровня громкости в диапазоне от 0 до 100 к диапазону от 0,0 до 1,0 float normalizedVolumeLevel = volumeLevel / 100.0f; // Установка уровня громкости defaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar = normalizedVolumeLevel; // Опционально: включение/выключение звука (mute/unmute) //defaultDevice.AudioEndpointVolume.Mute = false; } } class Program { static void Main(string[] args) { VolumeChanger changer = new VolumeChanger(); changer.SetVolume(50); // Установка громкости на 50% } } |
Если нам нужно использовать C++, то придется лезть в COM.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <Windows.h> #include <mmdeviceapi.h> #include <endpointvolume.h> #include <iostream> #pragma comment(lib, "ole32.lib") #pragma comment(lib, "winmm.lib") int main() { HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { std::cout << "Не удалось инициализировать COM библиотеку" << std::endl; return hr; } IMMDeviceEnumerator* deviceEnumerator = NULL; hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID*)&deviceEnumerator); if (FAILED(hr)) { std::cout << "Не удалось создать экземпляр MMDeviceEnumerator" << std::endl; CoUninitialize(); return hr; } IMMDevice* defaultDevice = NULL; hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &defaultDevice); deviceEnumerator->Release(); if (FAILED(hr)) { std::cout << "Не удалось получить устройство по умолчанию" << std::endl; CoUninitialize(); return hr; } IAudioEndpointVolume* endpointVolume = NULL; hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID*)&endpointVolume); defaultDevice->Release(); if (FAILED(hr)) { std::cout << "Не удалось активировать интерфейс громкости" << std::endl; CoUninitialize(); return hr; } // Установить громкость (0.0 — минимум, 1.0 — максимум) float newVolume = 0.5; // 50% hr = endpointVolume->SetMasterVolumeLevelScalar(newVolume, NULL); if (FAILED(hr)) { std::cout << "Не удалось установить уровень громкости" << std::endl; } else { std::cout << "Громкость установлена на " << newVolume * 100 << "%" << std::endl; } endpointVolume->Release(); CoUninitialize(); return 0; } |
На этом все. В следующей статье продолжим шпионскую тему и поговорим о скрытой записи с веб-камеры на C#.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как написать кейлоггер на C#
- Микрофонный шпион для скрытой прослушки
- Программа микрофонный шпион для прослушки помещений