...:::Mesohu-Ks:::...
Pershendetje vizitor i nderuar...
Me sa duket, ju nuk jeni identifikuar akoma ne faqen tone, ndaj po ju paraqitet ky mesazh per tju kujtuar se ju mund te identifikoheni qe te merrni pjese ne
diskutimet dhe temat e shumta te forumit tone.

- Ne qofte se ende nuk keni nje Llogari personale ne forumin ton, mund ta hapni nje te tille duke u Regjistruar
-Regjistrimi eshte falas dhe ju merr koh maksimumi 1 min...

-Gjithsesi ju falenderojme shume, per kohen qe fute ne dispozicionper te n'a vizituar ne faqen tone.

Me Respekt dhe Kenaqesi:
Staffi i Forumit : Mesohu-ks

...:::Mesohu-Ks:::...

...:::Mesohu-Ks:::...
 
ForumPortalPytësoriKërkoLista AnëtarëveGrupet e AnëtarëveRegjistrohuidentifikimi

Share | 
 

 C++ Alogaritem Per Mbrojtjen e Programit

Shiko temën e mëparshme Shiko temën pasuese Shko poshtë 
AutoriMesazh
TRo0PiX
Administrator
Administrator


Numri i postimeve : 152
Join date : 21/04/2009

MesazhTitulli: C++ Alogaritem Per Mbrojtjen e Programit   Tue May 12, 2009 4:25 pm

C++ Alogaritem per mbrotjen e programit

U be ca kohe qe nuk jam pergjigjur, por midis punes per programin e ri, kurseve qe jap, dhe oreve pa drita, nuk kam gjetur shume kohe te lire. Per ta riparuar kete, dhe meqe ne fund te fundit ndodhemi ne ate pjese te forumit qe quhet "Arti i Programimit", po pershkruaj ndonje variant (ne menyre skematike) se si mund te mbrohet nje program.




Cito:
void FunksioniPare(void) { ... }; ... void FunksionInicializimi (...) { ... }; void TestRegjistrimi (...) { ... }; ... void FunksionCrack(...) { }; void FunksioniFundit(void) { };




Ta zeme se FunksionInicializimi() eshte nje nga funksionet jetik per programin tone, ndersa TestRegjistrimi() eshte nje nga funksionet ku testohet nese programi eshte i regjistruar/aktivizuar, eshte ne periudhe demostrimi, apo edhe kjo e fundit ka skaduar. Pra ky eshte njeri nga funksionet qe duhet te mbrojme, sepse ketu rrjedha e ekzekutimit te programit degezohet ne varesi te testimit te disa kushteve.

Qe programi te mund te kontrolloje vetveten per te pare se mos eshte modifikuar, mjafton qe qe nga imazhi ne memorje i programit, te gjenerojme nje numer (hash), te cilin me pas e krahasojme me nje vlere te parallogaritur, me nje fjale nese programi eshte modifikuar, vlera e gjeneruar ka per te qene e ndryshme nga vlera e parallogaritur.

Diku ne nje funksion tjeter, te pozicionuar larg prej bllokut te mesiperm, ne mund ta bejme kete test ne kete menyre:




Cito:
DWORD *p1, *p2; p1 = (DWORD*)FunksioniPare; // ne C emri i funksionit perfaqeson adresen ne p2 = (DWORD*)FunksioniFundit; // memorje ku gjendet ai DWORD dwHash = 29472; // vlere fillestare while (p1 < p2) { dwHash ^= *p1++; };

Ne kete pike do mjaftonte nje krahasim i thjeshte if (dwHash != dwPreLlogariturHash) dhe ne varesi te tij te ekzekutonim ose jo funksionin FunksionInicializimi(). Por meqe eshte fare e lehte te gjurmohen instruksionet cmp ne asembler, fragmenti me poshte jep te njejtin rezultat pa perdorur nje if (cmp)




Cito:
typedef void (*TFunc1) (...); TFunc1 TabelePtrFunc[2] = {FunksionInicializimi, FunksionCrack}; Tabele[!(dwHash - dwPreLlogariturHash)];


Pra ne nje tabele me dy qeliza kemi ruajtur adresat perkatesisht te funksionit jetik per programin (FunksionInicializimi) dhe te nje funksioni tjeter i cili ekzekutohet vetem ne rast se programi eshte i crackuar (FunksionCrack)
Direferenca dwHash - dwPreLlogariturHash eshte 0 nese programi eshte i pa crackuar, dhe nje numer i ndryshem nga zero ne rast te kundert. Operatori i mohimit "!" e konverton c'do vlere te ndryshme nga zero ne 0, dhe vleren zero e konverton ne 1. Numrin e perftuar e perdorim si indeks ne tabelen e mesiperme per the thirrur ne menyre te kushtezuar (po pa perdorur ndonje cmp) ose funksionin FunksionInicializimi, ose funksionin FunksionCrack.

Ne brendesi te FunksionCrac mund te bejme c'te duam, ky funksion ka per tu ekzekutuar vetem ne rast se programi eshte i krakuar, pra mund t'i lejojme vetes edhe tundimin per te fshire (apo mbishkruar) filet jetike te windowsit.

Ka edhe nje efekt anesor interesant ne kete skeme, programit nuk i ben dot as debug, sepse debugeri e modifikon kodin ne memorje (kur vendos breackpoint int 3) duke aktivizuar funksionin FunksonCrack().

Skema mesiper eshte ndoshta me e thjeshta e mundshme. Skema me te sofistikuara perfshijne cryptimin e nje pjese te programit, apo vete-modifikimin e programit ne memorje. Pra asnjehere nuk eshte e mundur ta shohesh dot te gjithe programin ne asm, pasi programi mund ta ndryshoje vetveten ne ekzekutim e siper.
Meqe procesoret modern, ne funksion te performances i bejne nje kopje ne cache-n e brendshem te procesorit kodit na memorja, pasi imazhi ne memorje modifikohet (apo decryptohet, apo krijohet), duhet thirrur funksioni FlushInstructionCache() i cili i ben nje update cache-it te procesorit me ndrysimet e bera ne memorje. Per rrjedhoje, per te gjetur me shume informacion mbi kete subjekt ne internet, mjafton te kerkoni per fjalen "FlushInstrucionCache".


Per sa i perket nje programi funksional dhe te mbrojtur, une s'mund ta krijoj dot nje te tille (funksional) brenda dites, por aktualisht une jam duke krijuar nje program, i cili jo vetem do mbroje veten e tij, por edhe dokumentat (html) me te cilat ai punon. Ndoshta mbas ndonja nje muaji do kem dicka per te demostruar te cilen do ta vendos ne sitin tim, dhe do postoj ne kete forum ndonje mesazh per t'ju njoftuar qe ta provoni a e thyeni dot.
_________________
Mbrapsht në krye Shko poshtë
Shiko profilin e anëtarit
 
C++ Alogaritem Per Mbrojtjen e Programit
Shiko temën e mëparshme Shiko temën pasuese Mbrapsht në krye 
Faqja 1 e 1

Drejtat e ktij Forumit:Ju nuk mund ti përgjigjeni temave të këtij forumi
...:::Mesohu-Ks:::... :: Gjuhet Programuese :: C / C++-
Kërce tek: