Newsgroup: it.comp.programmare.win32
Titolo: Realizzazzione di una funzione che cripta un txt mediante una chiave simmetrica

Ho realizzato l' iniezione di una Dll nel processo del NOTEPAD. dentro
la Dll ho realizzato delle funzioni che filtrano le originali funzioni
Readfile e Writefile della kernel32.dll.
Questa è una delle 2 funzioni:
__declspec(dllexport) void _WriteFile(HANDLE hFile, LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped)
{
	MessageBox(0,"Sono nella WriteFile", "Finestra di Dialogo",0);
 
WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
	return;
}
Il mio problema è che ho una funzione che cripta un file.txt, ma essa
vuole passato  il nome del file. La funzione che ho creato io mi da
l'handle al file. Come posso mettere tutto insieme , in maniera tale
che quando salvo un documento scritto tramite il NOTEPAD esso mi viene
salvato criptato. La ReadFile dovrebbe fare il drecript.

vuole passato  il nome del file.
Intercetta anche la CreateFile.

> Intercetta anche la CreateFile.
Riesco a intercettare la CreateFile ,ma lui la usa sia per aprire il
file che per salvarlo. Il mio problema e che il NOTEPAD quando salva
il file lo deve salvare criptato,mentre quando lo apre lo deve
decriptare. Rischierei di far criptare 2 volte il file.

decriptare. Rischierei di far criptare 2 volte il file.
Occorre solo controllare il secondo parametro della CreateFile.
Se e' settato il bit GENERIC_READ ha aperto il file per leggere,
se e' settato il bit GENERIC_WRITE ha aperto il file per
scrivere.
Ad ogni modo non capisco perche' il file rischia di passare due
volte per la fase di crittaggio. Il Notepad ha in memoria il
testo in chiaro, quindi le tue funzioni nella dll dovrebbero
essere:
__declspec(dllexport) void _WriteFile (HANDLE hFile, LPCVOID
lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD
lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
Critta (lpBuffer,nNumberOfBytesToWrite);
WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
}
__declspec(dllexport) void _ReadFile (HANDLE hFile, LPCVOID
lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD
lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
DeCritta (lpBuffer,nNumberOfBytesToWrite);
ReadFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
}

 }
Tu mi dici di mettere il mio file in un buffer?
Allora non mi serve filtrare anche la CreateFile?
Fammi capire meglio, che mi sto confondendo.

la mia Funzione che cripta fà questo:
Qui vengono passati i file da riga di comando.
{
	char *str= (char *)malloc(9*sizeof(char));
	printf("argv[0]=>main prg , argv[1]=>input file , argv[2]=>output file
\n");
	srand((unsigned)time(NULL));							//*  permette di far variare le
stringhe in uscita
 
str=genera_key(LEN);                                                              //
* Funzione che mi genera la key in automatico
 
faiopsufile(argv[1],argv[2],str);                                                   //
* Funzione che cripta il file che vuole come parametri d'in il file di
in, quello di out ela
key.
    system("pause");
    return 0;
}
 Come faccio a inserirlo all'interno della writefile?

se posso dire la mia, e visto che la mia ti si è rivelata utile già una
volta, qualsiasi cosa tu stia facendo la stai facendo nel modo errato. le
situazioni in cui è realmente necessario utilizzare tecniche di hooking
sono veramente rare nel mondo della programmazione Win32 (riesco a
concepirlo solo per i debuggers). vuoi che altri utenti sulla tua
workstation siano impossibilitati a leggere un tuo file? proteggilo con
un'ACL adeguata (clic destro -> Proprietà -> Protezione). vuoi che nessuno
possa aprirlo leggendo la partizione da un altro sistema operativo, per
esempio una distro live di Linux? questo non ha senso: un ipotetico
software che legga il filesystem ignorando le ACL che proteggono i files è
un software illegale e il suo uso (o la sua creazione, se l'autore di è
scordato di mettere un paio di disclaimers qua e là) è perseguibile
penalmente, tantopiù quando si tratta di un filesystem come NTFS, i cui
internals sono protetti da trade secret (non sono del tutto sicuro che gli
autori di LinuxNTFS stiano lavorando nell'ambito del legale, ma perché mai
Microsoft dovrebbe perseguirli quando gli forniscono interoperabilità
gratuita?). vuoi comunque che il file non sia memorizzato in chiaro nella
partizione, just in case? la crittografia in Windows è supportata a
livello di filesystem (clic destro -> Proprietà -> Generale -> Avanzate ->
Crittografa contenuto ecc. ecc.). è già tutto pronto. credi di essere il
primo della terra ad avere certi problemi? o forse l'unico del pianeta a
dover mantenere dei dati segreti su un hard disk?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 segreti su un hard disk? 
Torniamo al punto uno. Se il nostro amico spiega un po' più in 
dettagli la sua idea, può darsi che si trovino soluzioni migliori.
-- 
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non è valido)

 Come faccio a inserirlo all'interno della writefile?
Non crei un eseguibile per crittare e decrittare, ma usi le sue
funzioni nella dll che hai iniettato.

lo rispiego per l'ennesima volta, io non devo brevettare nessun
programma. sono consapevole che vi sono 5000000.... programmini che
fanno quallo che sto cercando di fare io. Ma io devo farlo con il
NOTEPAD.EXE . quello di Windows. Quindi ho intercettato le funzioni e
le voglio modificare come meglio credo. Ora devo inserire nella
Writefile la funzione che cripta e nella redfile la funzione che
decripata. Cerco consigli?

 funzioni nella dll che hai iniettato.
Dimmi se ho capito bene, quello che intendi. Tui dici di intercettare
la Createfile, in modo tale da avere il nome del file.txt, salvarlo in
una mia variabile e passaro alla mia Writefile che lo usa come come se
andassi a scrivere il nome del file da riga di comando.Giusto?

 wrote in
news:1180523116.2...@h2g2000hsg.googlegroups.com
: 

Cerca un'implementazione dell'algoritmo di crittografia che non
lavori sul file intero ma su singoli blocchi. Anche in questo caso,
però, potresti avere problemi perchè alcuni algoritmi si basano sul
risultato dell'operazione precedente e quindi dovresti tenere
traccia di queste informazioni e resettarle quando riapri un file
nuovo. Nel caso di notepad non ci dovrebbero essere problemi, però
con altri programmi che aggiornano solo parzialmente il file oppure
leggono/scrivono potresti non riuscire a garantire l'integrità dei
dati. In generale la crittografia si implementa a livello di
filesystem e non a livello di applicazione proprio perchè il
filesystem, per definizione, lavora su blocchi a lunghezza fissa che
vengono letti/scritti in modo atomico e non ha tutte le rogne che
hanno Read e WriteFile. Quanto allo specifico problema di notepad e
della tua funzione che crittografa il file tutto intero, puoi
intercettare la createfile e decrittografare il file (se esiste) e
la closefile e crittografarlo. Ovviamente il file resterà in chiaro
per il tempo di esecuzione di notepad e se questo viene "ucciso"
(per un errore o usando il task-manager) può darsi che la tua DLL
non abbia una chance di ricrittografare i dati. Opppure puoi
verificare se notepad legge/scrive tutto il file con una singola
operazione di lettura/scrittura (è possibile) e usare un algoritmo
che ti consenta di crittografare e decrittografare i dati in un
blocco di memoria e non solo in formato file. 


 la closefile e crittografarlo.
Ho questo problema con la CreateFile. Innanzitutto il NOTEPAD richiede
la CreateFileW, che io gli passo
__declspec(dllexport) void _CreateFile(LPCWSTR filename,DWORD
access,DWORD sharing,LPSECURITY_ATTRIBUTES sa,DWORD creation,DWORD
attributes,HANDLE templates)
{
	LPCTSTR nome_file = (LPCTSTR) filename;
	MessageBox(0,nome_file, "Finestra di Dialogo",0);
 
CreateFileW(filename,access,sharing,sa,creation,attributes,templates);
	return;
}
Il problema è che lui nel MessageBox non li stampail nome del file, ma
qualunque nome metto lui mi stampaa video una " C ". Dove sbaglio?
Un altro problema me lo dà con la WriteFile:
__declspec(dllexport) void _WriteFile(HANDLE hFile, LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped)
{
	MessageBox(0,"Sono nella WriteFile", "Finestra di Dialogo",0);
 
WriteFile(hFile,lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,lpOverlapped);
	return;
}
che mi salva il file correttamente, ma quando chiudo il NOTEPA mi
spunta un messaggio che dice:
 Il testo nel file senzanome è stato cambiato.
Salvare i cambiamenti correnti?

  Il testo nel file senzanome è stato cambiato.
La WriteFile torna un booleano. Tu non torni nulla e quindi è 
probabile che il notepad consideri il salvataggio come fallito ma, 
non avendo un codice di errore (la GetLastError() tornerà zero) non 
mostra il messaggio.
Non prenderla come una critica offensiva, ma credo che prima di 
mettere le mani su hook e simili tu debba approfondire un po' le tue 
conoscenze sulle API di windows.


andassi a scrivere il nome del file da riga di comando.Giusto?
No, la WriteFile non ha bisogno del nome del file per poter
funzionare, ma dell'handle del file aperto dalla CreateFile.
Vediamo come funziona il Notepad.
Al comando "Salva", apre il file con la CreateFile che ritorna un
handle. Scrive il testo con la WriteFile e chiude il file con
CloseHandle.
Tu intercetti la WriteFile. Essa riceve come parametri:
- l'handle del file aperto in scrittura.
- il buffer in memoria che contiene il testo.
- la lunghezza del testo (numero di caratteri).
Le operazioni che devi fare sono:
- allocare un buffer in locale grande quanto il buffer del
Notepad.
- copiare il buffer del Notepad in quello locale.
- crittare il buffer locale.
- salvare il buffer locale con una WriteFile.
- deallocare il buffer locale.
Deve essere eseguita un'operazione simmetrica di decrittazione
con la ReadFile.
ATTENZIONE: come suggerito da Valter, queste operazioni hanno
senso solamente se il Notepad legge/scrive il testo con una sola
chiamata alla ReadFile/WriteFile.

 dettagli la sua idea, può darsi che si trovino soluzioni migliori.
per me se ne troverebbero sicuramente: resto dell'opinione che queste
tecniche debbano essere confinate alle attività di debugging.


 debugging. 
O a casi in cui non si può farne a meno.


Come faccio a modificare l'ACL(Access Controll List) delmio file.
Mimandate date qualche link per capire?

 Mimandate date qualche link per capire?
sostanzialmente si tratta di:
1) ottenere l'ACL corrente
2) aggiungervi le ACE che vuoi tu
3) settare la nuova ACL
per il punto uno vedi queste funzioni:
http://msdn2.microsoft.com/en-us/library/aa446641.aspx
http://msdn2.microsoft.com/en-us/library/aa446648.aspx
per il punto 2 vedi queste:
http://msdn2.microsoft.com/en-us/library/aa374947.aspx
http://msdn2.microsoft.com/en-us/library/aa374962.aspx
e per il punto 3 ovviamente quest'altra:
http://msdn2.microsoft.com/en-us/library/aa379578.aspx


 3) settare la nuova ACL
Ho visto i link ma mi sembra un pò troppocomplicato per me e e per il
tempo che mi ritrovo.
Ho trovato girando su internet una funzione che cripta e decripta,
solo che vuole in ingresso il nome del file (es. file.txt), tramite le
funzioni WriteFile e ReadFile, io non posseggo il nome del file,ma
solo un LPCVOID buffer. Come posso convertire questo in un FILE.
Sempre se è possibile?
Altrimenti ci sarebbe un qulache modo piùsemplice per criptare e
decriptare tramite le funzioni che intercetto, poichè a me interessa
criptare e decriptare ilfile solo per fare vedere che l'intercetto
funziona correttamente, in realtànon devo creare nessun sistema di
criptaggio, mi basterebbe cripatre un file con una semplice XOR.
Datemi una mano!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 
Scusa ma a questo punto non mi contengo piů:
MA CI SEI O CI FAI???????

 MA CI SEI O CI FAI???????
Le risposte come queste non servono a niente.


Ti ripeto le mie scuse, è da un po che lurko i tuoi disperati tentativi 
di lamerate...
...ma viste le domande che continui a fare, incomincio a sospettare che 
la tua non sia semplice "ignoranza" ma qualcosa di più:
scusa ma se ti basta fare lo xor dei byte, qual'è la difficoltà nel 
farlo nelle ReadFile/WriteFile? hai il puntatore al buffer, la 
lunghezza, cosa ti manca?
Senza offesa ma se non riesci a capire neppure questo hai un problema 
serio...

il problema è che essendo non tanto pratico non riesco acon la
programmazione, non avevo mai vistoun punatore a un buffer di tipo
LPCVOID, quelli che ho sempre usato sono di tipo char * o unsigned
char *.

 funziona correttamente,
ma toglimi una curiosità: si tratta di qualche assurda tesi universitaria
assegnata da qualche scriteriato di professore?


Ulisse81 ha scritto:

non sei tanto pratico con la programmazione e pretendi di esserlo con
l'API Hooking? io direi che come strada didattica ne hai scelta una
pessima. prima di avventurarti con queste tecniche da super-hacker, ma
prima ancora di avventurarti anche solo con le API Win32, io direi che
devi imparare bene il C.



Colpito.
Ascolta sono riuscito a realizzare la cripta file e funziona
correttamente, ho quelche problemino con la decripta.
Ho messo la funzione su un normalissimo file.c e compilata, decripta
il file criptato tramite il NOTEPAD correttamente.Quindi la funzione è
esatta. Messa nella mia Readfile, non mi decripta il fle. Questo è
quello che gli faccio fare io:
void _ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD
nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED
lpOverlapped )
{
	MessageBox(0,"Sono nella ReadFile", "Finestra di Dialogo",0);
	char *buff = (char *)lpBuffer;	                              // Ho un
puntatore locale che punta alla stessa area di memoria dei mie dati
	int len = (int) nNumberOfBytesToRead;               // Qui mi da un
problema
	char *buff_out = (char *)malloc(len*sizeof(char));
	buff_out = decriptazione(buff,len);
	lpBuffer = buff_out;
	ReadFile(hFile, lpBuffer,nNumberOfBytesToRead, lpNumberOfBytesRead,
lpOverlapped);
	free(buff_out);
	return;
}
Questa è la mia idea, non sò se è quella corretta. lpBuffer è un
puntatore ai miei dati, mi creo un altro puntatore a questi dati, così
che non perdo il riferimento ai dati. Modifico il contenuto del
buff_in. il risultato di questo criptaggio lo và a salvare in
buff_out. La funzione decriptazione decripta il file carattere per
carattere.

Hou piccolo problema ho relaizzato una funzione che cripta e decripta
tramite una XOR e realizzata in un normale int main funziona tutto
correttamente, maquanda la vado ad inserire nellamia Dll ,funziona
solo la criptafile, la decripta, che poi èla stessa funzione, non mi
funziona. Io penso cheil problema sia perchè non passo il contenuto
del file, in un buffer locale. Come posso fare a passare il contenuto
del mio file puntato da lpBuffer in un buffer di appoggio, visto che
non ho il nome del file?

Ho un problemino che penso risolva tutti i miei problemi. Ho creato la
funzione che cripta e decripta il file usando sia la XOR, che usando
unafunzione che fà lo  shift in avanti e in indietro del codice ascii
del mio carattere. Entrambi funzionano correttamente se li inserisco
in un file.c e compilo il tutto. Quando passo il tutto sulla mia Dll,
funziona solo la criptafile, la decriptafile non fà niente. Secondo me
potrei risolvere il problema lavorando con un buffer di appoggio su
cui carico tutto il mio file puntato da lpBuffer prima delle
operazioni di cript e decript. Solo che non avendo il file ( fp =
fopen("........txt", "r")) non sò come fare. Qualcuno potrebbe darmi
una mano?

 carattere.
non capisco a che ti servono buff e len, e non vedo buff_in; vedo
piuttosto un leak epico (la malloc che va su buff_out te la perdi
all'istruzione successiva). comunque l'errore sta semplicemente nel fatto
che stai cercando di decriptare *PRIMA* di leggere dal file. e cosa
decripti non si sa.


 ha scritto:


 ha scritto:
Prova questo:
BOOL _ReadFile (HANDLE hFile,LPVOID lpBuffer,DWORD
nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped)
{
MessageBox (0,"Sono nella ReadFile","Finestra di Dialogo",0);
BOOL b = ReadFile
(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped);
if (b == FALSE)
   return FALSE;
char *buff = (char *) lpBuffer;
int len = (int) nNumberOfBytesToRead;
// Ma sarebbe meglio:
// int len = (int) *lpNumberOfBytesRead;
char *buff_out = (char *) malloc (len * sizeof (char));
// Cambi la funzione e passi buff_out come parametro
decriptazione (buff_out,buff,len);
memcpy (buff,buff_out,len);
free (buff_out);
return TRUE;
}

> Prova questo:
Anche questo non funziona, il testo che visualizza il NOTEPAD è quello
criptato, mentre con  un MessageBox all'uscita della funzione
decriptazione risulta corretto.

Questa èla ReadFile come l'ho fatta io:
BOOL _ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD
nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED
lpOverlapped )
{
	MessageBox(0,"Sono nella ReadFile", "Finestra di Dialogo",0);
	//* ReadFile originale
	BOOL result = ReadFile(hFile, lpBuffer, nNumberOfBytesToRead,
lpNumberOfBytesRead, lpOverlapped);
	if(result == FALSE)
		MessageBox(0,"ReadFile fallita","Finestra didialogo",0);
	char *buff = (char *) lpBuffer;								//* Faccio puntare i miei dati
anche da un altro puntatore
	MessageBox(0,buff,"Finestra di dialogo",0);					//* Stampa la stringa
criptata
	int len = (int) nNumberOfBytesToRead;						//* Numero di byte da
leggere nel file.
	char *buff_out = (char *) malloc (len * sizeof (char));		//* Buffer
dove viene inserito il testo decriptato
//	buff_out = decriptazione (buff,len);						//* Funzione di
decriptazione file
	decriptazione (&buff_out,buff,len);
	MessageBox(0,buff_out,"Finestra",0);						//* Stampa la stringa
decriptata
	memcpy (buff,buff_out,len);		// void * memcpy ( void * destination,
const void * source, size_t num );
	MessageBox(0,buff,"Finestra",0);							//* Stampa la stringa
decriptata
	free(buff_out);												//* Libera la memoria occupata da buff_out
	return result;
}
Il problema è che il testo che compare nel NOTEPAD è sempre criptato,
anche se tramite MessageBox mi accorgo che il testo è stato decriptato
correttamente.
Come devo fare?

Non c'è nessuno?

Come devo fare?
Questo fine settimana organizzo una Messa Nera. Siamo in tanti,
tutti programmatori Win32, ben organizzati e molto affiatati, Non
solo c'e' la possibilita' di incontrare nuovi amici, ma potremo
anche chiedere l'intervento del supremo demone a favore del
nostro codice mortale. Forse qualcuno vendera' la propria anima!
Abbiamo diversi animali sacrificali e io porto i mantelli neri.
Ci mancano le vergini, puoi pensarci tu?

 del puntatore?
Perchè se no fuori dalla funzione non vedo la modifica del buffer, il
buffer è come è vuoto.

 buffer è come è vuoto.
Scherzavo, funziona anche passando solo buff_out; comunque non risolvo
il problema, una volta che il NOTEPAD effettua l'originale ReadFile
non visualizza ladecriptazione che viene fatta dopo, ma apre il file
così com'è.

 Ci mancano le vergini, puoi pensarci tu?
Ci sono riuscito, anche senza l'intervento del supremo demone.
Ringrazio tutti coloro che mi hanno aiutato.