buenas gente, estoy aprendiendo un pokito de C y como es mi costumbre, cada vez q leo sobre un lenguaje intento hacer 2 cosas... juegos o programitas residentes en las makinas q me permitan ver mas de lo q deberia...
el tema es q estoy intentando hacer un keylogger con C... y para acceder a los estados de las teclas estuve usando getasynckey q es la misma api de windows q use en un troyano en visual basic, el problema es q con visual basic me devuelve las teclas de todas las ventanas activas sin ninguna modificacion de nada... en cambio en C solamente me devuelve las teclas pulsadas cuando la ventana activa es la del programa compilado... osea q las unicas teclas q muestra son las q tecleo sobre la ventana del programa (visible o no)... tambien intente usando getkeyboardstates:
GetKeyboardState(keyStates);
for (x=2;x<255;x++)
{
// if (GetAsyncKeyState(x)){
if (keyStates[x] & 0x80){ // atencion, esto chekea el bit 7!!!
wsprintf(str,"Tecla\nX=%i",x);
MessageBox(hwndMain, str, "Se presionó", MB_OK);
}
}
pero el resultado es exactamente el mismo q con getasynckey.... y ya no se q funcion usar para obtener el estado del teclado aunke el programa no este activo... despues de todo tiene q residir en memoria sin ser visto...
bueno espero q alguien ya lo haya hecho... estuve buscando sources en internet pero estan todos en C++ y no kiero, yo kiero aprender C y kizas despues C++...
gracias de antemano
esas cosas no se hacen :?
tenes que meterle un hook (gancho) al sistema.
fijate la funcion SetWindowsHookEx con el primer paramentro WH_KEYBOARD .
Igual siempre hay muchas formas de hacer eso.
La mas sucia que vi es un loop infinito que iba chequeando los teclas (pero el hilo de ejecuccion se puso en idle para no afectar los procesos :P).
no te preocupes, hice porkerias de estas antes en vb, pero nunca, ni una sola vez, las use... q se yo, estan muy buenas para aprender, te empiezan a caer las fichas de un monton de cosas, pero no me da como para usarlas contra alguien... lo mas gracioso es q los jueguitos q he hecho por ejemplo en DIV 2 y en Fenix no se los mostre nunce a nadie jejeje asi q se puede decir q todo lo q hice nunca fue usado realmente
gracias por la respuesta, ahora me pongo q experimentar...
mmm me siento un fracasado a la novena potencia... estuve buscando, consegui una dll (keyhook.dll) q hace lo q necesito, pero no para de tirarme errores el linker... me dice "undefined reference <nombre de la funcion>"
resulta q la dll trae un .h.. entonces compile el programa con "gcc prueba.c keyhook.dll" pero sigue dando undefined (con el .h incluido en prueba.c y todas las funciones definidas)...
tambien intente creando la libreria ".a"... pero necesito saber bien q poner en el .def porke no lo tengo... lo hice a mano, pero se ve q a las funciones les falta algo porke despues me tira q no encuentra el "Entry point"... use un programita hecho en asm para saber si realmente las funciones estaban ahi (dll2inc) y estan todas... y desdes FASM se pueden usar, pero el tema es q no se en q le estoy pifiando en C, kizas la forma en q intento incluir el dll... no se la verdad ya q hacer... espero q alguno me pueda tirar un dato
gracias!!
la funcion que te dije, si no me equiboco, es un API de windows, así que te tendria que funcar, eso si no se bien pq' todabia lei que tenia que estar en un DLL.
Ni idea sobre eso especifico pq' no use C.
Pero lo que hace esa funcion API es agregale un gancho al sistema y cada vez que le llega algo al teclado lo envia a tu funicion de ahí lo podes copiar.
Te recomendarias que veas si podes encontrar algo sobre APIs yo estoy un poco desactualizado sobre el tema, pero seguro que hay en la net.
Saludos!
claro el tema con esa funcion es q se necesita una DLL para q funcione, no se puede ejecutar desde el programa... yo consegui una DLL compilada con codigo de fuente y todo q hace lo q necesito, el tema es q no puedo hacer q compile ien mi programa de prueba, me dice undefined references.... probe creando la libreria con las funciones de la DLL pero una vez q compila bien, cuando ejecuto el programa me dice q no encuentra el entry point para las funciones q especifike en la libreria...
probe creando .def desde la dll con 2 programas diferentes e incluso use uno q convertia un .lib(q venia incluido) a .a para linkearlo con gcc... pero en ese caso cuadno compila sigue tirando undefined reference.... este es el .def q tiene las funciones de la DLL:
LIBRARY "KeyHook.dll"
EXPORTS
?AddKeyEntry@@YAJQAUtagKeyEntry@@@Z
?FormatKeyHookError@@YAHJPADH@Z
?FormatKeyHookError@@YAHJPAGH@Z
?GetKeyEntryCount@@YAHPAJ@Z
?GetKeyEntryList@@YAHPAUtagKeyEntry@@HPAJ@Z
?GetKeyEventResult@@YAJIJPAUtagKeyResultA@@I@Z
?GetKeyEventResult@@YAJIJPAUtagKeyResultW@@I@Z
?InstallKeyHook@@YAJXZ
?IsKeyHookInstalled@@YAHXZ
?KeyEntryExists@@YAHQAUtagKeyEntry@@PAJ@Z
?RemoveAllKeyEntries@@YAJXZ
?RemoveKeyEntry@@YAJQAUtagKeyEntry@@@Z
?UninstallKeyHook@@YAJXZ
creo q arriba me ekivoke en la cantidad de programas q use, fueron 3 q dieron el mismo resultado.... de esta forma cuando compilo me da error, y sino uso esto de .def:
LIBRARY "KeyHook.dll"
EXPORTS
AddKeyEntry
FormatKeyHookError
FormatKeyHookError
GetKeyEntryCount
GetKeyEntryList
GetKeyEventResult
InstallKeyHook
IsKeyHookInstalled
KeyEntryExists
RemoveAllKeyEntries
RemoveKeyEntry
UninstallKeyHook
y compila bien, pero esta .def es la q hace q despues no encuentre el entrypoint en la dll....
espero q puedan ayudarme... ya no se como implementar esto
Cita de: dc740mmm me siento un fracasado a la novena potencia... estuve buscando, consegui una dll (keyhook.dll) q hace lo q necesito, pero no para de tirarme errores el linker... me dice "undefined reference <nombre de la funcion>"
resulta q la dll trae un .h.. entonces compile el programa con "gcc prueba.c keyhook.dll" pero sigue dando undefined (con el .h incluido en prueba.c y todas las funciones definidas)...
tambien intente creando la libreria ".a"... pero necesito saber bien q poner en el .def porke no lo tengo... lo hice a mano, pero se ve q a las funciones les falta algo porke despues me tira q no encuentra el "Entry point"... use un programita hecho en asm para saber si realmente las funciones estaban ahi (dll2inc) y estan todas... y desdes FASM se pueden usar, pero el tema es q no se en q le estoy pifiando en C, kizas la forma en q intento incluir el dll... no se la verdad ya q hacer... espero q alguno me pueda tirar un dato
gracias!!
Hola!
:!: Estas laburando bajo Linux. (Presumo esto ya que compilas con gcc) Pero por la extencion de la biblioteca (.dll) Asumo que esta esta compilada para Windows. Las bibliotecas en Linux por lo Gral son *.so o *.5.so o algo por el estilo. Tendrias que conseguir la Biblioteca compilada para Linux o el codigo Fuente y compilarla para El SO del Pinguino. Fijate en el man como Compilar Bibliotecas.
:!: Teniendo la posibilidad de hacer taaaaaaaaaaaantaaaaaaaaaaaaas cosas en C no me parece la mejor un KeyLogger. No se, podrias hacer por ej alguna aplicacion que se conecte/manipule por Puerto paralelo algun dispositivo externo. (El que se te ocurra)
:!: Es una opinion personal, sin la mas minima intencion de ofender.
Saludos.
Charlyo®
Sorry dc740 no lei por completo el POst. Mi respuesta anterior keda por partes obsoleta.
estoy con mingw (por eso gcc)... el tema es q no puedo linkear correctamente la libreria y me esta sacando... en cuanto a lo del puerto... lo habia considerado, pero primero kiero el keylogger... ademas, no te olvides q no necesariamente se puede usar para saber contraseñas, sino tambien para saber kien agarra mi makina cuando yo no estoy y q es lo q hacen... por darte un ejemplo...
bueno gracias, espero una respuesta