Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
Малварь как искусствоПишем кейлоггер Stealth Keylogger (100% FUD)
Finall_Fix
+ Вопросец нарисовался.
Пишу кейлоггер для своего троянчика и хочу гденибудь хранить файлы с логами. Может кто подскажет места? Где лучше всего? Ну ведь не в temp же? ) Он у некоторых может и очищаться...
GetKeyNameTextA криво работает, поэтому делал минуя этот апи. :)
Куда прятать логи ?
Да банально в папку пользователя, можно и в темп, вряд-ли кто-то будет монеторить его, так-же как и папку локального пользователя, обозвать файл например "config.dat".:)
Да банально в папку пользователя, можно и в темп, вряд-ли кто-то будет монеторить его, так-же как и папку локального пользователя, обозвать файл например "config.dat".:)
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Привет всем !
Идея написания кейлоггера у меня появилась давно, в начале я писал на ассемблере, но не доделал до конца, получилось что он очень глючил, но т.к. работы было много, а комерсом я не занимаюсь, стимул быстро пропал...
Шло время, я про эту тематику как-то забил, пока мне не попалась на глаза статья, атаки на банковскую систему, при помощи простенького кейлогера и вполне легальной программы, вероятно для пересылки логов и обхода файерволов...
Мне стало интересно, а как сложно "Программисту средней руки", к коим я себя отношу написать простенький кейлогер, как он будет палится аверами и сколько времени на это потребуется !
Идея создания такой темы/раздела появилась уже потом, когда я почти закончил этот кейлоггер.
Но обо всём попарядку, итак ответы на вопросы моего мини-исследования:
1. На момент написания статьи кейлоггер обнаруживает какой-то Endgame, и-то если поиграть с Relise/Debug и настройками компилирования, детекты пропадают;
2. Кейлогер отлично работает с UAC, практически не палит себя, т.е. вы никак не поймёте, что ваши клавиши пишутся в лог.
3. Антивирусы никак не реагируют, т.е. считают что так и надо.
4.Сколько-же время на это ушло ?
Около 5-ти часов, но это нужно учитывать, что опыта работы в студии у меня нет, пришлось разбираться с кодировкой символов, хуками и т.д. Больше гемора с кодировкой конечно было...
Итак перейдём к основной части этой статьи:
1.Постановка задачи:
Написать кейлоггер локального действия, который может отслеживать нажатия клавиш и записывать их в лог, также нужно в логе указать дату нажатия и окно приложения где было нажата клавиша, кейлогер должен работать с русской и английской раскладкой. Также кейлогер должен работать с ограниченными правами в системе и никак не выдавать себя, пример лога:
Безымянный — Блокнот: English: M: Fri May 12 20:38:39 2017
Безымянный — Блокнот: English: ,: Fri May 12 20:38:41 2017
Не важно на чём вы хотите писать, основная идея, это поставить hook, если по простому, то это "ловушка" для клавиатуры, смысл в том-что при нажатии пользователем на клавишу, ваша программа будет выполнять вашу функцию (подпрограмму), где вы можете уже определить нажатую клавишу, записать её в лог и т.д.
В виндовсе есть SetWindowsHookEx, которая устанавливает определяемую программой процедуру фильтра (hook) в цепочку фильтров (hook). Вы должны установить процедуру фильтра (hook) для того, чтобы контролировать в системе определенного рода типы событий. Эти события связаны или с конкретным потоком или со всеми потоками одного и того же рабочего стола, что и вызывающий поток.
Обратите внимание на последнее предложения, благодаря этого свойства, мы можем отследить все нажатия клавиш, в других приложений.
hookProc - Это наша подпрограмма (Которая будет вызываться после нажатия пользователем на клавишу), которую мы позже напишем.
msgLoop() - Тоже очень важная вещь, там цикл, если по простому то программа зациклица и будет постоянно вызывать hookProc когда пользователь нажмёт на клавишу, вот её код:
Функция GetMessage извлекает сообщение из очереди сообщений вызывающего потока и помещает его в заданную структуру. Эта функция регулирует поступление отправленных сообщений до тех пор, пока помещенное в очередь сообщение доступно для извлечения.
Функция TranslateMessage переводит сообщения виртуальных клавиш в символьные сообщения.
Функция DispatchMessage распределяет сообщение оконной процедуре. Она используется, чтобы доставить сообщение, извлеченное функцией GetMessage.
Теперь приступим к написанию нашей основной функции (подпрограммы), которая вызовится, после нажатия на кнопку пользователем:
wParam - Определяет нажата-ли клавиша, поэтому перед тем как что-то делать, мы проверяем нажата-ли клавиша так:
Код:
if (wParam == WM_KEYDOWN)
2. Далее прям по пунктам что нужно сделать:
2.1. Получить раскладку клавиатуры;
2.2. Получить виртуальный код клавиатуры, по нему мы сможем уже определить что конкретно нажал пользователь;
2.3. Ну в общем получить наш символ.
logName - Путь куда будет писаться файл логов, я использую стандартный вывод в поток ofstream, писаться может например в AppData (Туда и пишет), получить путь примерно так:
Код:
strcpy(logName, getenv("APPDATA")); // Get APPDATA folder
strcat(logName, "log.log");
НО ЭТО ЕЩЁ НЕ ВСЁ, ТЕПЕРЬ САМОЕ ИНТЕРЕСНОЕ, А ИМЕННО GetKeyNameTextA - РАБОТАЕТ ТОЛЬКО С СИМВОЛАМИ ЛАТИНСКОЙ РАСКЛАДКИ, КАК-ЖЕ СДЕЛАТЬ ПОДДЕРЖКУ КИРИЛИЦЫ ?
Можно сделать следующий костыль, просто сопоставить кирилицу и латиницу, примерно так:
Номер символа строки _eng соответствует номеру символа _rus, следовательно если мы найдём номер символа _eng, то определим и _rus, тем самым у нас будет кирилица, как это реализовать на примере:
Код:
string GetSymbolRu (string Key)
{
int Number = 0;
string Rezult;
Number = _eng.find(Key);
if (Number != -1)
{
char * tmp = new char [256]; // инициализируем дополнительный массив
CharToOemA(_rus88, tmp); // преобразовываем
delete [] tmp; // удаляем дополнительный массив
Rezult = Rezult + _rus88[Number];
return Rezult; // Присвоили результат
} else {
return Key;
}
}
Итак, находим номер в _eng (Number = _eng.find(Key);), далее по этому номеру уже можем получить символ в кирилице...:)
НО ПАРА МОМЕНТОВ:
Си в принципе не дружит с кирилицей, а Visual Studio особенно, поэтому что-бы всё было чётенько, ещё один кастыльчик от меня:
Преобразовываем строку с кирилицей, для этого выделяем буфер в памяти и юзаем CharToOemA(_rus88, tmp);, всё теперь наша строка будет нормально писаться в файл и выводится на консоль, не забывайте удалить из памяти delete [] tmp; потом...:)
Ну в общем-то и всё, далее просто в зависимости от раскладки делаете нужный вывод в файл:
- Поддержка латиницы/кирилицы, но не всех символов, если решу развивать, это поправлю;
- В логи пишется небольшой мусор (Не нужно учитывать клавиши, которые помечены символом "/"), это можно убрать.
- Можно добавить поддержку скриншётера.
2) В общем отпишитесь, нужно-ли развивать далее это, кстати Relise залили на VT, но это не страшно и специально, можно потом продолжить по обходу детекта поработать и как и через колько будет-ли детект у других.
УБЕДИТЕЛЬНАЯ ПРОСЬБА, ЕСЛИ ВОЗМОЖНО ОТПИШИТЕСЬ, ЕСЛИ СМЫСЛ ДАЛЬШЕ СОЗДАВАТЬ ПОДОБНЫЕ ТЕМЫ И РАЗВИВАТЬ ПОДОБНЫЕ ПРОДУКТЫ ТУТ ! :)
с успешным начинанием. жаль конечно что ты залил свой код на вирустотал, ну да ладно. понимаю так что практических умений в хаке автор не имел. ну ничего всегда в самом начале тяжко.
с успешным начинанием. жаль конечно что ты залил свой код на вирустотал, ну да ладно. понимаю так что практических умений в хаке автор не имел. ну ничего всегда в самом начале тяжко.
там предоставляют api для организаций типа аваста, каспера и так далее. если малварь с одним детектом - то сразу отсылается хантерам и ее потрашат. работа у пидоров такая.
там предоставляют api для организаций типа аваста, каспера и так далее. если малварь с одним детектом - то сразу отсылается хантерам и ее потрашат. работа у пидоров такая.