PDA

View Full Version : Si potrebbe impedire uno screenshot?


verloc
24-12-2003, 07:36
Penso a tutto il lavoro che può aver fatto un designer per il suo logo e vederselo copiare con un semplicissimo sc.

A parte la tutela del copyright che funziona benissimo,ma se uno oscuro programmatore brasiliano si "fotte" il tuo logo come fai a saperlo?


Mi erano venute in mente possibili alternative:

catturare con un hook la chiamata al tasto stamp (mentre è attivo il tuo prog) e annullare il messaggio.

C'è una api apposta che gestisce la memorizzazione del desktop-gdi etc ?

cionci
24-12-2003, 08:57
Originariamente inviato da verloc
catturare con un hook la chiamata al tasto stamp (mentre è attivo il tuo prog) e annullare il messaggio.
Credo che sia l'unica alternativa...
Un hook di sistema non sul tasto stamp (altrimenti basterebbe usare i programmi appositi), ma sul messaggio che spedisce questo tasto...ora controllo...

verloc
26-12-2003, 09:43
Originariamente inviato da cionci
Credo che sia l'unica alternativa...
Un hook di sistema non sul tasto stamp (altrimenti basterebbe usare i programmi appositi), ma sul messaggio che spedisce questo tasto...ora controllo...

infatti...:)

VK_SNAPSHOT

però al momento l'hook mi funziona solo se la app di test ha il focus,altrimenti se premo il tasto da altre app me le manda in crash(il che non sarebbe di per se un male :) )


Resta da risolvere la possibilita di fare lo sc con del codice...
mhm... mi viene in mente adesso che se è attiva la tua app, (nel caso lo splash screen con il logo)con un timer "stretto" si può continuare a svuotare la clipboard;però potrebbe salvarlo direttamente su una bitmap.

Se interessa vedo di postare qualcosa domani.

Frank1962
26-12-2003, 09:55
.....si ma questo non sarebbe prettamente "legale" .........fare queste zozzerie con il sistema operativo di chi usa il programma è alquanto scorretto!

....visto che ci sei perchè non cancelli anche il settore 0 dell'hd così gli fai crashare direttamente il pc e sicuramente il logo non te lo prende :rolleyes:

cionci
26-12-2003, 09:56
Frank1962: anche gli antivirus installano hook di sistema...quindi mi sembra ampliamente legale...

Luc@s
26-12-2003, 10:00
Originariamente inviato da cionci
Frank1962: anche gli antivirus installano hook di sistema...quindi mi sembra ampliamente legale...

davvero?

Luc@s
26-12-2003, 10:03
e se cancellassi il buffer che contiene il logo dopo che è stato shootato?

verloc
26-12-2003, 10:08
Originariamente inviato da Luc@s
e se cancellassi il buffer che contiene il logo dopo che è stato shootato?


Infatti questo ho fatto. ;)

cionci
26-12-2003, 10:08
Originariamente inviato da Luc@s
e se cancellassi il buffer che contiene il logo dopo che è stato shootato?
Infatti credo che sia questo che vuole fare...
Bisogna mettere un hook di sistema è cercare il logo allinterno del buffer per ogni screenshot e sostituirlo con altra roba...

cionci
26-12-2003, 10:09
Originariamente inviato da Luc@s
davvero?
Altrimenti come farebbero a leggere ogni file che viene aperto per cercare i virus ?

cionci
26-12-2003, 10:13
Io farei una cosa del genere sui messaggi del sistema:

HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;

hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");
hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,hkprcSysMsg,hinstDLL,0);

E poi controlli qual'è il messaggio di sistema per gli screenshot...credo che in questo modo lo potresti prendere...

cionci
26-12-2003, 10:25
Qui ne parlano...sembra un casino: http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20771005.html

cionci
26-12-2003, 10:31
Anche questo ti può essere utile per ricevere l'hook sul tasto da ogni applicazione...
http://www.codeproject.com/clipboard/hscr2clp.asp?print=true

Comunque vale sempre il discorso che con i programmi che prendono la DC dello schermo e poi con BitBlt copiano il contenuto in una bitmap è impossibile impedire questa possibilità...

Frank1962
26-12-2003, 10:47
Originariamente inviato da cionci
Frank1962: anche gli antivirus installano hook di sistema...quindi mi sembra ampliamente legale...
sarà ......ma li è ovvio che l'utente è a coscienza del fatto che un Antivirus ti "controlla" il pc, cosa diversa se , per esempio, installo un client ftp e questo per non farsi fregare il logo ":rolleyes:" mi combina schifezze sul mio OS facendomelo addirittura rendere instabile! :muro:

Luc@s
26-12-2003, 10:56
Originariamente inviato da verloc
Infatti questo ho fatto. ;)

Mi faresti vedere il cod?

cionci
26-12-2003, 11:18
Originariamente inviato da Frank1962
per esempio, installo un client ftp e questo per non farsi fregare il logo ":rolleyes:" mi combina schifezze sul mio OS facendomelo addirittura rendere instabile! :muro:
Il fatto dell'instabilità era solo perchè sta tentando di farlo...non credo che voglia che resti così... Deve essere del tutto trasparente all'utente...

verloc
27-12-2003, 08:43
Grazie per i links :)

Attenzione:funziona solo quando la app ha il focus,fa crashare qualunque programma dal quale si tenti di premere il tasto "stamp/print screen"



LRESULT __declspec(dllexport) CALLBACK KeyboardProc(
int nCode,
WPARAM wParam,
LPARAM lParam)
{

if (wParam==VK_SNAPSHOT)
{
MessageBox(NULL,"No screenshot","Finestra",MB_OK );
OpenClipboard(NULL);
EmptyClipboard();
return 1;
//return CallNextHookEx( hkb, nCode, wParam, lParam );
}
else return 0;





}
BOOL __declspec(dllexport) installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
return TRUE;
}


BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}






il problema penso sia dovuto ad una diversa implementazione nel CBuilder degli "shared" data segments rispetto a VC.
Per gli hook globali si deve per forza fare così(variabili in segmenti shared:compresi gli handles agli hooks).

cionci
27-12-2003, 10:27
La devi realizzare come DLL...è per quello che ti crash gli altri...

VICIUS
27-12-2003, 10:34
il logo è un'immagine giusto ? a questo punto se io apro il file eseguibile con un programma come hackres riesco a salvare il file tranquillamente anche senza usare il tasto stamp ?

ciao ;)

cionci
27-12-2003, 10:46
Per quello basta codificare l'immagine dentro ad un vettore...

Luc@s
27-12-2003, 10:47
Originariamente inviato da cionci
Per quello basta codificare l'immagine dentro ad un vettore...

Interessante.
Ma come si fa?

verloc
27-12-2003, 12:04
Originariamente inviato da cionci
La devi realizzare come DLL...è per quello che ti crash gli altri...

No,mannaggia quella l'avevo fatta da subito. :)
Avevo dimenticato di passare l'istanza :rolleyes:

Adesso dovrebbe funzionare.

vedo di mettere a posto il codice e lo posto cosi non "distrugge" il computer a nessuno(ho fatto il fioretto laico di non arrabbiarmi più per cose di forum). ;)

verloc
27-12-2003, 12:05
Originariamente inviato da cionci
Per quello basta codificare l'immagine dentro ad un vettore...
;)

crittazione dei dati ed estrazione dell'immagine a runtime.

cionci
27-12-2003, 12:06
Ma il tuo programmone come prosegue ? Non è che mi dai una demo ?!?!?

Luc@s
27-12-2003, 12:08
anche io :)

verloc
27-12-2003, 12:15
Originariamente inviato da cionci
Ma il tuo programmone come prosegue ? Non è che mi dai una demo ?!?!?

Era finito,il prof ha tirato fuori un'altra stonz...
e ho dovuto mettere mani proprio alla teoria che in alcuni punti faceva un pò H2O...
(hanno aspettato 20 anni (davvero) che un idiota facesse un programma per il loro metodo e adesso ne approfittano).

Sono a 6000 linee ditemi se vi sembrano poche per una tesi di un dilettante programmatore di ing civile.


la faccenda del logo non era proprio diretta a me adesso,infatti non è un granchè(devi vedere che schifo fanno quelli dei miei concorrenti :D),un amico architetto mi ha promesso qualcosa.

Fammelo finire e ti mando qualcosa,fra l'altro non me lo sono neanche portato appresso per non avere la tentazione di lavorarci visto che sto preparando le immagini da inserire nel testo della tesi.

verloc
29-12-2003, 15:09
Ecco il codice della dll riveduto,corretto e funzionante (nel senso che non provoca nessuna catastrofe termo-nucleare ).

Interessante notare che la dll viene iniettata nel processo chiamante(cioè quando si preme print screen da qualsiasi prog)
solo quando si preme effetivamente il tasto.


// verloc's no_scr_shot.dll
// purpose: preventing screenshots by clicking "print screen"
// file unit1.cpp :main dll file


//---------------------------------------------------------------------------

#include <windows.h>

//---------------------------------------------------------------------------

extern HHOOK hkb; //defined in SharedData.cpp: this is CBuilder data sharing method

//In VC you need something as:
//
//#pragma data_seg("SHARED")
//
// static HHOOK hkb=NULL;
//
//#pragma data_seg()
//
//#pragma comment(linker, "/section:SHARED,RWS")
//Remember coding your def file!!!


HINSTANCE DllInstance;

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
DllInstance=hinst;
return 1;
}
//---------------------------------------------------------------------------


extern "C"
{

LRESULT __declspec(dllexport) CALLBACK KeyboardProc( //__stdcall
int nCode,
WPARAM wParam,
LPARAM lParam)
{

if (wParam==VK_SNAPSHOT)
{
OpenClipboard(NULL);
EmptyClipboard();
}


return CallNextHookEx( hkb, nCode, wParam, lParam );

}


BOOL __declspec(dllexport) Install_KB_Hook()
{
//MessageBox(NULL,"Hooking","Finestra",MB_OK ); //uncomment this for debugging
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,DllInstance,0);
return TRUE;
}


BOOL __declspec(dllexport) Uninstall_KB_Hook()
{
//MessageBox(NULL,"Unhooking","Finestra",MB_OK );//uncomment this for debugging
BOOL unhooked = UnhookWindowsHookEx(hkb);

return unhooked;
}




}
//end of file unit1.cpp
//


//FILE SharedData.cpp: module for CBuilder shared segment


#pragma option -zRSHARESEG // change default data segment name
#pragma option -zTSHARECLS // change default data class name
#include <windows.h>


// Here is the initialized data that will be shared.

HHOOK hkb=NULL; //static?

//end of file: SharedData.cpp


//file Shared.def: CBuilder sintax
LIBRARY NO_SCR_SHOT

SEGMENTS SHARESEG CLASS "SHARECLS" SHARED

;DATA MULTIPLE SHARED READWRITE
//end of file Shared.def:


L'applicazione di test la lascio come esercizio ;)
Ringrazio tutti quelli che hanno supportato l'iniziativa :)