# Shkenca > Informatikë dhe Internet > Arti i programimit >  C++ - Algoritëm për mbrojtjen e programit

## Neritan Hyso

*Moderatori:* Shkëputur nga tema Përkthyes i faqeve të Internetit
---------------------------

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.



```
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:



```
	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)



```

	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.

----------


## lonely_lion

Interesante !

Me mendimin se ti mund ta lexosh kete postim timin, se mua me kane shume qejf dhe mi fshijne postimet ( s'di ne e ke lexuar postimin tim qe ma fshine ... :-( )

Si teori me duket interesante .... Por une them se me nje inline patcher, pikerisht ajo 0 ne 1 qe kthen mbrapsht funksioni mund te modifikohet !

Sa per rrjeshtin e fundit te postimit tend ... ky me poshte !!!

>>>>>>>

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 ?

>>>>>>>>>>

...them se sfida ka mbaruar   :Lulja3:  apo jo ?

Te pakten askush se konsideroi si sfide !

----------


## Neritan Hyso

Nuk e kam lexuar mesazhin tend te pare, por nese ta kane fshire, nuk besoj se kam humbur ndonje gje te madhe. 

Per sa i perket modifikimit me nje "inline-patcher", padyshim. Madje edhe me nje debuger/dis-asembler skema mund te modifikohet fare lehte. Kjo eshte arsyeja qe une e konsiderova si skemen me te thjeshte te mundshme (ndersa skema me te sofistikuara perfshijne cryptimin e funksioneve jetike, apo vete-modifikimin e tyre).
Nga ana tjeter, edhe kjo skeme e thjeshte eshte shume me funksionale se sa produktet e gatshme. 
Besoj fjala mbrojtje krijoi pak konfuzion. Konkretisht kemi dy mbrojtje, qe me marreveshje fjale po i quajme "mbrojtje nga kopjimi" dhe "mbrojte nga krakimi".
Normalisht nje kraker do perpiqet te identifikoje "mbrojtjen nga kopjimi" dhe ta "thyeje" ate duke modifikuar instruksionet ne asm. Por qe ne proven e pare per te pare efektet e veprimit te tij mbi "brojtjen nga kopjimi", "mbrojtja nga krakimi" ka per tu aktivizuar dhe fare lehte mund t'i nxjerri jashte perdorimit instalimin e windowsit, duke e detyruar te humbase jo vetem "rezultatet e punes se tij" por edhe shume minuta me instalimin e windowsit dhe programeve te tjere. 

Morali eshte ky:

Te veshesh "uniformen" e programatorit nuk do te thote te veshesh uniformen e nje njeriu "impotent", ne meshire te fatit (apo "zemergjeresise" se krakuesve). 

Eshte krejt e kunderta! 

Nje programator, permes programeve te tij mund te beje c'do gje ne c'do kompjuter, shume me shume se vete te zoterit e atyre kompjuterave mund te bejne permes "user interface" te aplikavioneve te gatshme.

Nese te kesh ne dore "OllyDbg" apo ndonje tool tjeter ju duket se keni arme "shkaterrimtare", duhet te dini qe c'do inxhinier ka ne dispozicion mbi 10,000 funksione te gatshme (perfshire gjithe funksionet qe perdor OllyDbg), dhe me pak talent e fantazi mund te krijoje funksione qe askush s'i ka krijuar me pare (me siguri skema qe paraqita une njihet nga shumekush, megjithat une nuk e kam pare kurrkund, eshte thjesht produkt i fantazise time).


Shenim: Nuk e mora vesh se c'fare sfide ka mbaruar, apo nuk u konsideroka sfide!

----------


## Gabeli

> Besoj fjala mbrojtje krijoi pak konfuzion. Konkretisht kemi dy mbrojtje, qe me marreveshje fjale po i quajme "mbrojtje nga kopjimi" dhe "mbrojte nga krakimi".
> Normalisht nje kraker do perpiqet te identifikoje "mbrojtjen nga kopjimi" dhe ta "thyeje" ate duke modifikuar instruksionet ne asm. Por qe ne proven e pare per te pare efektet e veprimit te tij mbi "brojtjen nga kopjimi", "mbrojtja nga krakimi" ka per tu aktivizuar dhe fare lehte mund t'i nxjerri jashte perdorimit instalimin e windowsit, duke e detyruar te humbase jo vetem "rezultatet e punes se tij" por edhe shume minuta me instalimin e windowsit dhe programeve te tjere.


Me ka hasur nje mbrojtje e tille me Magic Utilities 2006. Exe-ja ishte e pakuar me PeCompact.Pasi e cpakova manualisht programi me njoftoi se ekzistonte nje version i ri dhe me ofroi update.Une e pranova me qellim qe te thyeja versionin e fundit.Update-i ishte faktikisht nje virus qe me bllokoi pothuajse 100% komjuterin.Nuk me prishi ndonje pune te madhe sepse rregullisht i bej backup particionit te Windowsit me Acronis dhe mu deshen vetem 3 min per rikthyer ne gjendjen e meparshme.Gjithashtu mund te perdor DeepFreeze ose ndonje program ekuivalent dhe ne kete menyre, mbrojtje te tilla nuk kane asnje rezultat.




> Morali eshte ky:
> 
> Te veshesh "uniformen" e programatorit nuk do te thote te veshesh uniformen e nje njeriu "impotent", ne meshire te fatit (apo "zemergjeresise" se krakuesve). 
> 
> Eshte krejt e kunderta! 
> 
> Nje programator, permes programeve te tij mund te beje c'do gje ne c'do kompjuter, shume me shume se vete te zoterit e atyre kompjuterave mund te bejne permes "user interface" te aplikavioneve te gatshme.


Sinqerisht qe te respektoj si nje programator te zotin por mesa shoh ke nje delir madheshtie te papare. Si qenka krejt e kunderta kur ne internet mund te gjesh krak pothuajse per cdo program? Si qenka krejt e kunderta kur vete ti dhe programi yt jeni viktima te krakut? Nejse e shoh qe egoja jote nuk ta le ta pranosh kete fakt prandaj nuk do debatoj me me ty ne lidhje me kete ceshtje.

----------


## Neritan Hyso

Kam pershtypjen se ky seksion i forumit ka te beje me programimin, dhe jo me psikoanalizen. Une nuk di t'i kem bere ndonje vleresim psiqik ndonje anetari te forumit deri tani, ndersa ty ne c'do 2 shkrime, te shoh ne pozicionin e "psikologut popullor" (nje here me "diagnostikove" si  "naiv", tani si "te semure nga deliri i madheshtise". Jam kurioz te shoh si do "evuloje" semundja ime ne recetat e tua te ardhshme).

Ne shkruajme ato qe mendojme, e per pasoje shkrimet tona reflektojne njohjen qe kemi ne mbi subjekte te ndryshme. Une ve re qe ti ke me shume njohuri se une per sa u perket aplikacioneve apo utilitive te gatshme, e per pasoje pa dyshim je nje perdorues kompjuteri me ekspert se une.
Thene kjo, gjithashtu ve re se ke nje mungese informacioni per sa i perket teknologjive qe ekzistonje "mbrapa" "user-interfeisit" te aplikacioneve te gatshme. KJo eshte dhe arsyeja qe zgjidhjen e c'do problemi e shikon tek nje program i gatshem, dhe mos-ekzistencen e nje programi te gatshem e konsideron si pamudesi zgjidhje.

Per sa i perket krakimit te fjalorit tim, te pakten ne nje internet kafe kam vene re se e perdorin pa kod qe prej nje viti (duke perdorur nje program i cili e "c'ben" totalisht instalimin" duke e ri-intaluar rregullisht c'do 1 apo dy muaj). Ndryshe nga kraku juaj i sakatosur, ata e perdorin programin me te gjitha funksionet e tij.

Mbrojtja e programit tim reflekton nivelin tim te njohjes ketu e 5 vjet me pare. Nga ana tjeter, duhet ta pranoj se perpara 5 vjetesh nuk besoja se kish Shqiptare te zote te krakonin nje program si ky. Ne ate kohe nuk besoj se e kisha gabim.
I vetmi gabim i imi (nese mund te quhet keshtu) eshte se nuk ma mori mendja se programi im do konkuronte me dinjitet edhe 5 vjete mbasi u krijua (jetegjatesia e nje programi tipik eshte reth 2-3 vjet).

Une e kam lane mbrapa me kohe kompleksitetin e te qenit Shqiptar. Per mua zotesia eshte nje atribut individual qe s'ka te beje fare me perkatesine etnike, dhe nuk e justifikoj kurre pamundesine per te realizuar dicka me faktin "se une jam Shqiptar", por "me siguri te jashtmit mund ta realizojne filan gje".

Gjen apo s'gjen krake per te gjitha programet ne internet, nuk e konsideroj fare si argument lidhur me subjektin qe po diskutojme. 
Ne "mbrojtje" te skemes qe paraqita ne fillim te kesaj kollone, do krijoj keto dite nje program te vogel demo, i cili do jete krejtesisht i pa demshem nese ekzekutohet normalisht, ndersa do rezervoje surpriza te pakendshme nese modifikohet. Do ta postoj diku dhe do ju njoftoj. 
Mund te provoni ta  krakoni vete, apo mund t'ua jepni "kolegeve" tuaj "te jashtem" (meqe ata jane me te zote), puna juaj. 

Ajo qe do perpiqem une te demostroj eshte se "kur nuk je nen angazimin per t'u ofruar konsumatoreve produkte komode dhe te thjeshta per tu instaluar, eshte fare e lehte per t'i bere absolutisht te pa-thyeshem!". - Ju provoni te argumentoni te kundertetn.

----------


## Gabeli

> KJo eshte dhe arsyeja qe zgjidhjen e c'do problemi e shikon tek nje program i gatshem, dhe mos-ekzistencen e nje programi te gatshem e konsideron si pamudesi zgjidhje.


Kjo s'ka kuptim! Ok jam dakort nqs. nuk kam ne duar nje program te gatshem si psh.Olly sigurisht nuk do kem mundesi te analizoj kodin dhe si rrjedhim nuk do mund ta modifikoj.Por e njejta gje vlen dhe per ty.Nqs.ti nuk do kishe ne dore nje program te gatshem si psh.C++ me cfare do ta ndertoje fjalorin? me kazem dhe lopate?




> Per sa i perket krakimit te fjalorit tim, te pakten ne nje internet kafe kam vene re se e perdorin pa kod qe prej nje viti (duke perdorur nje program i cili e "c'ben" totalisht instalimin" duke e ri-intaluar rregullisht c'do 1 apo dy muaj). Ndryshe nga kraku juaj i sakatosur, ata e perdorin programin me te gjitha funksionet e tij.


Kjo menyre nuk mund te konsiderohet nje krak dhe programe te tilla ka plot net.Duke qene se vendosem qe mos ta botonim fjalorin tend ne net,atehere nuk u munduam shume per te bere nje thyerje perfekte.Duke qene se kemi hequr servisin fetsrv42.exe dhe evt.dll programi ka keto te meta:

1 - Nuk monitoron dopjo klikun dhe clipboard-in
2 - Nuk duken fjalet qe shkruhen ne textbox

Ndersa mund te perkthesh sa te duash nga interneti dhe nga wordi pa asnje problem.Besoj se userat do preferonin me mire krakun tone "te sakatosur" qe mund ta instalojne ne sa kompjutera te duan sesa te paguanin 3500 leke per nje kopje te vetme te fjalorit.Megjithate meqe te paska ngelur merak te premtoj qe do ta thyejme me mire.




> Ne "mbrojtje" te skemes qe paraqita ne fillim te kesaj kollone, do krijoj keto dite nje program te vogel demo, i cili do jete krejtesisht i pa demshem nese ekzekutohet normalisht, ndersa do rezervoje surpriza te pakendshme nese modifikohet. Do ta postoj diku dhe do ju njoftoj. 
> Mund te provoni ta  krakoni vete, apo mund t'ua jepni "kolegeve" tuaj "te jashtem" (meqe ata jane me te zote), puna juaj. 
> Ajo qe do perpiqem une te demostroj eshte se "kur nuk je nen angazimin per t'u ofruar konsumatoreve produkte komode dhe te thjeshta per tu instaluar, eshte fare e lehte per t'i bere absolutisht te pa-thyeshem!". - Ju provoni te argumentoni te kundertetn.


Po ta them qe tani qe as qe kam ndermend te merrem me te nese e nderton ne menyre qe te demtoje OS. Nuk kam kohe te tepert per te humbur me nje program demo qe s'vlen per asgje. Kur te krijosh nje program komercial atehere do te te demostrojme te kunderten.

----------


## josif

Pershendetje,

Fillimisht urime per temen. Ka kohe qe ne forum nuk sheh tema te tilla te interesante. 

Tema qe ti trajton, eshte teme interesante dhe pjeserisht ka elemente te arsyeshem. Ajo qe mua nuk me duket me vend eshte pika ku ti, direkt ose indirekt, flet per nje program te pathyeshem.

'Programe te pathyeshme nuk ka.' -- me poshte do ta riformoj kete shprehje.

Flas ne baze te njohurive te mija si student viti i fundit ne degen 'Inxhinieri Kompjuterash'. 

Te flasim teorikisht, duke e pare nje program si nje tufe algoritmash (ku algoritm nenkuptoj cdo implementim te nje makine Turingu qe pranon/refuzon ne kohe finite), eshte e qarte se duhet te kemi nje gjendje fillestare dhe ndryshime te gjendjes fillestare nepermjet inputeve deri ne gjendjen perfundimtare, aty ku nje algoritem i tufes perfundon, dhe thirret nje tjeter per te vazhduar e keshtu me rradhe ...

Pra ti je i detyruar te besh publike gjendjen fillestare te programit tend, (initial state), qe mund te jete procesi ne ram i startuar prej programit ne disk, ose cfaredolloj bashkesi instruksionesh e gatshme per tu egzekutuar. 

Plus kesaj ti duhet te besh publike edhe bashkesine e inputeve qe shkaktojne ndryshimin e gjendjes fillestare dhe fillimin e pjeses se instruksioneve qe sherbejne si 'handler'-a per keto inpute.

Per te qene me i qarte, ti duhet te percaktosh rrjedhen e programit, kondicionalisht ne baze te disa verifikimeve si ne post-in tend. P.Sh: diferenca e vleres se nxjerre nga kodi hash eshte nje input per te kaluar gjendjen e procesit nga 'FunksioniPare' ne 'FunksionCrack' ne rast se differenca > 0. 

Ti nuk mund te mos e besh publike kete pjese. Edhe nese programi menjehere fillon te ndryshoje veten, edhe nese e ben kete menjehere pa input, perseri ka nje    input 'lambda', ne kuptimin bosh, qe do te thote se gjendja ndryshon pa nevoje te nje inputi explicit. Pra ti serish je i detyruar te thuash se ku fillon ndryshimi, perndryshe algoritmi nuk do te dije ku te avancoje.

Pra, teorikisht, per sa kohe ti ke te qarte gjendjen fillestare dhe inputet (kushtet) qe ndryshojne kete gjendje, ke mundesine qe programit tia kuptosh rrjedhen. Kur them rrjedhen, nenkuptoj bashkesine e mundesive te ndryshimit te gjendjes. 

Pjesa qe sapo shkoi ishte thjesht prezantimi i zhargonit. Ajo qe nje thyes i programit eshte i interesuar eshte fakti se ti je i detyruar qe te japesh edhe pjesen e 'handler'-ave per cdo input. Pra ti je i detyruar ti tregosh funsionet 'FunksionCrack' ose 'FunsionInicializimi'. Edhe nese ti perdor ndryshimin dinamik te 
kodit ti perseri duhet ti tregosh intruksionet e para te ndryshimit dhe hackeri mund ti ndjeke ato dhe te ta kuptoje se cfare mekanizmi perdor ti.

Pra me sakte : 'Ti mund tia veshtiresosh jeten nje hackeri, por teorikisht rreziku i ndryshimit ekziston.'

Gjithe te mirat!

P.S: Ne kete post une flas ne baze te arkitekturave qe une njoh Von Neuman dhe Harvard. Te me falesh nese ka ndonje arkitekture tjeter qe ben te mundur te kunderten e kesaj teorie :-)




> *Moderatori:* Shkëputur nga tema Përkthyes i faqeve të Internetit
> ---------------------------
> 
> 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.
> 
> .... (fshire per arsye hapesire) ....

----------


## josif

Per sa i perket perdorimi te ndonje teknike kunder hackerave, paraziteve, apo cdolloj bakterie tjeter :-), me vijne ne mend keto ide :

1 - kursesi mos e bej publik kodin hash, pra vleren prej ku ti inicializon 'dwPreLlogariturHash' ruaje ne nje vend te sigurt. Mund te perdoresh nje DBMS serioz, ose ta therrasesh nepermjet networkut prej nje serveri. Perndryshe hackeri ta modifikon programin dhe ta shndrerron shumen e vlerave te cdo word-i duke shtuar ca instruksione diku, e hequr disa instruksione diku tjeter, ne menyre qe totali te jete serish = dwPreLlogariturHash.

2 - je i sigurt se (p2-p1) eshte e barabarte ne te gjitha versionet e MS Windows. Pershembull ne 'windows vista' MUND te kete ndryshuar stili i ruajtjes se funksioneve. Nese 'FunksioniFundit' ruhet i pari dhe 'FunksioniPare' ruhet i fundit, atehere while (p1 < p2)	 kthehet ne loop infinit.

----------


## Neritan Hyso

Nuk di sa normale është, që kur hap një temë të re, qoftë dhe në mënyrë të pavullnetshme (siç është rasti i kësaj teme ku edhe moderatori ka pjesën e tij), duhet të replikosh me të gjithë duke shkruar efektivisht më shumë se gjysmën e gjithë kollonës.
Ndoshta dikujt i duket eufori, por unë i kam justifikuar ndërhyrjet e mia me faktin që të tjerët, në shkrimet e tyre më citonin mua (madje citimet zinin më shumë vend se ajo çka shkruanin), e për pasojë më është dukur se prisnin një përgjigje nga unë.
Sidoqoftë, meqë këto kohë është në modë mbajtja e një profili të ulët (ok, termin e piratova nga qëndrimet post-fushatë), ky është dhe mesazhi im i fundit për këtë temë, ndaj dhe ndoshta do zgjatem pak për tju përgjigjur të dy para-shkruesve (që sërisht më citojnë mua).

Natyrisht programet nuk krijohen me kazëm dhe lopatë, por edhe sikur të krijoheshin, edhe kazma me lopatën janë mjete (tools) që i kanë krijuar të tjerët, pra në çdo rast nuk shpëton dot nga mjetet e gatshëm. Por ajo që po thosha unë ishte se, duke e marrë si të mirëqënë se si ai që përdor C++ dhe ai që përdor OllyDbg janë njëlloj të mirë-informuar (dhe talentuar), mjete të tilla si gjuhët e programimit të vënë në dispozicion shumë më tepër mjete shprehëse për të shprehur talentin apo njohuritë se sa aplikacione të tilla si OllyDbg.

Fakti që ekzistojnë shumë programe të krakuar, si dhe fakti që Shqiptarët përdorin vetëm programe të tilla (pra vetëm ato njohin), të çon në konkluzionin e gabuar se çdo program mund të krakohet.
E vërteta është se ndonëse ka shumë programe të mbrojtur nga kopjimi, mbrojtja e të cilëve është thyer, programet që mbrohen edhe nga krakimi zënë një përqindje shumë të vogël, dhe përgjithësisht programe të tilla nuk thyhen (ok, dikush mund të krijojë një KeyGen, por kjo është tjetër histori, jo rrallëherë sekreti mbi algoritmin e kodeve del nga vetë firma  korrupsionin se shpikën Shqiptarët!).
Do thoni ju -po kur qënka kështu, atëherë përse nuk mbrohen të gjithë nga krakimi?.  Unë mund ti përgjigjem me kopetencë kësaj pyetje vetëm për rastin tim, ndërsa për rastin e përgjithshëm vetëm mund të hamendësoj.

Vetëm pak vite më parë, unë kisha vështirësi të nxirrja në treg një Kurs Kompjuteri Multimedial & Interaktiv, 100% me zë, 100% Shqip, e gjithë teoria me video dhe animacione, me një simulator të DOS-it në Shqip, lojra për të praktikuar përdorimin e mausit dhe tastierës, si dhe hapësira interaktive për të praktikuar gjithë teorinë mbi Windowsin - një nga programet më të mirë në Botë në llojin e tij. Vështirësia ime qëndronte në faktin se, në Shqipëri nuk ishin krijuar kurrë më parë produkte teknologike të një cilësie të krahasueshme me Botën (e lëre pastaj më të arrirë), e për pasojë konsumatori me të drejtë mund të mos kishte besim tek një produkt Shqiptar, kështu që tregtarët nuk donin as ti hidhnin sytë. Mua mu desh të shpikja një partner imagjinar, ti jepja atij gjithë meritat duke thënë është një bashkëpunim Shqiptaro-Italian, ku Italinanët kanë bërë pjesën dërrmuese të punës, kurse Shqiptarët janë marrë kryesisht me përkthimin  vetëm kështu munda tua prish mendjen disa tregtarëve. Ky është skenari më i keq i mundshëm  pamundësia të dalësh në treg në mënyrë që të tjerët të vlerësojnë atë çka ke për tu ofruar.

Një skenar përsëri i pakëndshëm, por shumë më i mirë se i pari, është kur  ti del në treg me një produkt, por dikush tjetër del me diçka më të mirë, e për pasojë produkti yt nuk vlerësohet. Të paktën në këtë rast e pate shansin për ta provuar veten. Në fund të fundit ky është një skenar normal, që herët a vonë i ndodh gjithkujt, ndaj dhe nuk ja vlen të shqetësohesh për të.

Një skenar tjetër, sërisht i pakëndshëm, por akoma më i mirë se i dyti, është kur programi tjetër, sështë veçse programi yt i krakuar. Ndërsa në skenarin e dytë nuk merrje as të ardhura as reklamë, në këtë skenar të paktën publiciteti është i garantuar.

Kur ti thua se userat do preferonin më mirë krakun tuaj me funksionalitet të cunguar, se sa versionin tim të plotë, kjo do të thotë se ata gjithashtu do preferonin më mirë krakun tuaj se sa versionin pa para të Ectacos apo Livingsoftit. Pra nëse ti po thua se programi im, i krijuar disa vite para versionit të fundit të Livingsoft, edhe vetëm me një pjesë të funksionalitetit të tij është më i mirë se ky i fundit, atëherë unë sinqerisht të falenderoj, sepse një publicitet të tillë unë vetë skam guxuar kurrë ta bëj. 

Kur ti më quan mua viktimë, edhe pse unë sjam ndjerë i tillë as në skenarin e parë që përshkrova më lart, unë besoj se kjo fjalë në fakt të përshkruan më mirë ty. Unë nuk arrij të sjell në mend ndonjë punë, ku po të punosh aq kohë sa keni punuar ju mbi krakimin e programit tim, të fitohet më pak se 3500L. Pra në fakt ju e keni paguar programin tim më shtrenjtë se kushdo tjetër.

Para ca kohësh lexova një artikull teknik mbi bug-et dhe teknikat për eliminimin e tyre. Ndër të tjera autori bënte edhe një analizë interesante se pse ka kaq shumë bug-e në programet e sotme. Me pak fjalë konkluzioni i analizës së tij ishte ky:
- Dikur ishte shumë e vështirë të krijoje një program (psh. në asembler), e për pasojë vetë shkalla e vështirësisë ishte një filtër i fortë, të cilin pak kush arrinte ta kalonte, dhe ata që ja dilnin ishin mjaftueshmërisht kopetentë në atë që bënin.
Sot ekzistojnë një mori tool-sash RAD (Rapid Application Developement) si Delphi, Borland C++ Builder, MFC, etj., të cilët i lejojnë thuajse kujtdo të krijojë një program brenda pak sekondash (në një pjesë të tyre mjafton të shtypësh vetëm një buton, dhe kaq mjafton që tool-si të të bëjë peshqesh një Notepad apo Wordpad aty për aty). Pra sot filtri është shumë i butë, shumëkush mund të bëjë një program, e për pasojë mesatarja e aftësive të krijuesve të tyre është më e ulët  për pasojë bug-et e shumta.

Unë po e huazoj analizën e këtij autori, për të thënë se dy nga arsyet pse shumica e programeve nuk janë të mbrojtur nga krakimi janë:
-	E para, teknikat për mbrojtjen nga krakimi nuk janë dhe aq të lehta për tu implementuar, pra përbëjnë një filtër ca më të vështirë, që jo të gjithë ata që krijojnë programe sot arrijnë ta kalojnë.
-	E dyta, RAD-et apo framework-et shërbejnë pikërisht për ta izoluar programatorin nga detajet teknike, por skemat e mbrojtjes kërkojnë pikërisht të jesh në kontakt me këto detaje teknike. Pra ndërsa këto platforma e bëjnë programimin më të lehtë, ato e bëjnë implementimin e mbrojtjes akoma më të vështirë.

Gjithashtu në një artikull tjetër, ku analizoheshin RAD-et apo framework-et, thuhej diçka e tillë: Ok, mbase me këto platforma është e vështirë të manaxhosh një projekt për një kohë të gjatë, pra projekti të evulojë për të krijuar disa versione të programit (për shkak të vetë evolimit të platformës), por kjo është ok, sepse me këto platforma mund të krijohet me shpejtësi një program nga e para, dhe programe të tilla janë gjithësesi programe me kosto të ulët, që përgjithësisht kanë një jetëgjatësi të shkurtër. 
Pikërisht jetëgjatësia e shkrurtër është një tjetër argument pse një pjesë e programeve nuk kanë nevojë për mbrojtje të tilla të sofistikuara, ku implementimi i mbrojtjes mund të jetë më i vështirë se vetë krijimi i programit.

Dhe si një argument të fundit po ju sjell në vëmendje se kjo është industria më e madhe në Botë. Jo rastësisht disa nga kompanitë e softwerëve janë edhe kompanitë me xhiron më të madhe të të ardhurave, çka do të thotë se mbrojtjet aktuale teknike kombinuar me mbrojtjet ligjore, sot për sot rezultojnë të mjaftueshme.

..................................................  .......................

Për sa i përket analizës teorike të parashkruesit, pasojë e së cilës është dhe konkluzioni se programe të pa-thyeshëm nuk ka!, unë mendoj se analizës së tij i ka shpëtuar një detaj  krakimi nuk është akt teorik, është krejt e kundërta!
Para se ta shtjelloj këtë, le të bëjmë një marrëveshje fjale për të përkufizuar se kur një program konsiderohet i pa-thyeshëm.
Unë mendoj se përkufizimi më i saktë do ishte ky: Një program konsiderohet i pa-thyeshëm, nëse për ta thyer atë, do duhej më shumë punë (apo kohë) se sa do duhej për ta krijuar nga e para.
Pikërisht mbrapa këtij përkufizimi qëndron motivimi praktik për të thyer një program  programet thyhen pikërisht sepse është më e lehtë të thyhen se sa të krijohen nga e para.

Le të marrim një shembull me numra:
Ta zëmë se për të krijuar një program duhen 100 ditë punë, nga të cilat mbrojtja na hëngri 1 ditë. 
Normalisht mjetet që përdoren për të krijuar një program janë shumë më komode dhe efektive se sa ato që përdoren për ta krakuar, pra duhet më shumë kohë për ta thyer mbrojtjen nga sa u desh për ta krijuar atë. Në shembullin tonë po themi se duhen 10 ditë për ta thyer.
10 ditë për ta thyer mbrojtjen janë më shumë se 1 ditë që u desh për ta krijuar atë, por 10 ditë janë shumë më pak se 100 ditët që u deshën për të krijuar gjithë programin, pra gjithësesi ato 10 ditë e kanë justifikuar veten.

Analiza teorike e parashkruesit mbi inputet, autputet, dhe monitorimin hap mbas hapi të instruksioneve  qëndron, por a e keni vënë re se disa programeve, edhe kur ekzekutohen në kompjutera shumë të shpejtë, u duhet më shumë se 1 sekondë për tu hapur.
Duke gjykuar nga numri i instruksioneve për sekondë që janë në gjendje të ekzekutojnë procesorët modern, me një llogaritje të përafërt mund të thuhet se përgjithësisht programet ekzekutojnë nga disa miliona në dhjetëra miliarda instruksione gjatë sekuencës së tyre të hapjes.
Pavarësisht se një pjesë e mirë e tyre janë loop-e, prap se prap, koha që i duhet një njeriu për të lexuar/kuptuar hap mbas hapi çdo instruksion, ndërsa programi ngarkohet, me një dis-asembler ku nuk ke gjëra të tilla si FunksionKrak apo dwPreLlogariturHash, por vetëm numra (offset-et) në hekzadecimal, mund të jetë e tillë që një njeriu mund të mos i mjaftojë e tërë jeta.
Pa dyshim ekzistojnë teknika për ta reduktuar ndjeshëm këtë kohë, teknika që nxirren në sipërfaqe me anë të user interface të programeve të tilla si OllyDbg apo ndonjë tool tjetër.

Ajo që unë u përpoqa të them më parë, është se ekzistojnë gjithashtu teknika të tjera për të sabotuar teknikat e mësipërme  duke i detyruar efektivisht krakerat në një sipërmarrje teorikisht të mundshmë, por ndoshta më afatgjatë se vetë jeta e tyre (dhe në çdo rast më afatgjatë se jeta e subjektit (programit)).

Skema që unë paraqita në fillim të kësaj kollone, ndonëse e thjeshtë, ilustronte pikërisht këtë koncept. Imagjinoni një program të mbrojtur me një skemë të tillë, ju e hapni me një debuger, vendosni një breakpoint, e ekzekutoni, dhe krejt pa pritur gjendeni përballë punës për të ri-vendosur disa Gb të humbura në kompjuterin tuaj (në rastin më të mirë, kur i keni bërë backup), dhe ndërkohë nuk arritët të mblidhni ndonjë të dhënë të rëndësishme nga debugbreak-u i rrezikshëm. 
Natyrisht dëmi është i riparueshëm, unë nuk thashë se mbrojtja konsiston në një bombë me sahat, por fakti është se koha që duhet për ta vrojtuar hap mbas hapi një program të tillë shumëfishohet ndjeshëm (vrojtimi i programit të dis-asembluar, por jo në ekzekutim, sado i zoti të jesh, nuk të jep shumë informacion nëse programi e ka të kryptuar një pjesë të funksioneve të tij, apo i modifikon ato në ekzekutim e sipër).
Kështu që 10 ditëshi i shembullit të mësipërm fare lehtë mund të bëhet 300, shumë më tepër se 100 ditëshi që u desh për ta krijuar programin, e për pasojë kostoja e krakut mund të dalë edhe më e lartë se ajo e programit origjinal.

Një program të tillë unë e konsideroj të pa-thyeshëm, dhe ska asgjë të pamundur për një realizim të tillë.

Ka edhe një faktor psikologjik këtu. Kur krijon një program, qoftë edhe voluminoz, ti e shikon çdo ditë tek sa ai hedh shtat, e për pasojë e di që puna që po bën herët a vonë do shpërblehet. Ndërsa kur je duke krakuar një program, i cili orë e çast të detyron ti bësh backup kompjuterit, dhe nuk ka asnjë mënyrë për të kuptuar se edhe sa kohë ka për të zgjatur kjo punë, nuk di se sa javë, muaj, apo vite do insistonte dikush para se të dorëzohej.

Për sa i përket merakut se mos Windows Vista mund të ndryshojë rradhën e vendosjes së funksioneve në memorje duke shkaktuar një loop pafund, ky është një merak i kotë. Nëse Windowsi do ishte aq i marrë sa të guxonte jo tu ndryshonte rradhën, por qoftë edhe të fuste një funksion tjetër midis tyre, skema nuk do funksiononte gjithësesi (do ndryshonte hashi).
Konkretisht programet kompilohen/linkohen në një format që quhet PE (Portable Executable  mbi këtë subjekt kam përshtypjen se krakerat e mi, ndonëse mund të jenë pa shkollë, mund të dinë më shumë).
Fjala Portable e PE-së do të thotë të paktën 3 gjëra: 
-	e para, pavarësisht nga tipi i modulit (exe, dll, apo driver) formati është i njëjtë.
-	e dyta, imazhi në memorje është konsistent (nuk po them identik) me imazhin e files në disk.
-	dhe e treta, i njëjti format për OS të ndryshëm.

Një rradhitje e mirë e funksioneve në memorje, mund të bëjë që programi të ekzekutohet më shpejtë (psh. nëse disa funksione që ekzekutohen gjatë një momenti të caktuar të programit vendosen pranë njëri-tjetrit, shanset janë që ata të përfundojnë në chache e brendshëm të procesorit), për pasojë fjalën e fundit se ku do përfundojnë funksionet në memorje e ka hartuesi i programit  as kompilatori/linkeri dhe ca më pak Sistemi i Operimit mund të dalë mbi vullnetin e tij.
Gjithësesi, nëse në ndonjë OS të caktuar ndryshon alignment i kodit në memorje (edhe një gjë e tillë mund ta ndryshonte hash-in), përsëri ka plot mënyra për ti bërë derman. Pa u zgjatur në teknika më të vështira, unë do thosha se një programator mjafton thjesht ta testojë programin në të gjitha OS që ai do të suportojë. Nëse në ndonjë prej tyre manifestohet ndonjë problem, dy alternativa të thjeshta do ishin: ose një kompilim enkas për OS problematik dhe një program instalimi që instalon versionin e duhur për çdo OS, ose nëse gjykohet se klientela që përdor këtë OS është fare e pakët, e për pasojë e neglizhueshme, thjeshtë e bën programin që të mos punojë në këtë OS (është fare e lehtë të zbulosh në mënyrë programatike versionin e Windowsit në të cilin programi po ekzekutohet).

Për sa i përket arkitekturës Von Neuman, edhe mikro-ordinatori më i hershëm që kam parë unë (dhe që ishte me manivelë) ishte i po kësaj arkitekture, kështu që ndonjë arkitekturë tjetër nuk di. Nga ana tjetër, mënyra se si risorset e hardwerit ndahen (apo grupohen), pra arkitektura, ska të bëjë fare me subjektin.

Për sa i përket ruajtjes së dwPreLlogariturHash në një server, me siguri në një të ardhme kur açesi në internet të jetë më i shpejtë dhe më i kudo-gjendur, skenari ku një pjesë e aplikacionit ekzekutohet në server ka për të qënë mbizotërues, gjithësesi, sot për sot nuk ka pse ta kushtëzojmë ekzekutimin e programit vetëm në kompjutera që kanë açes në internet (vetëm për hir të një dwPreLlogariturHash)  ka zgjidhje më të thjeshta.
Duke ditur që në kompjuter çdo informacion, në fund të fundit përfaqësohet nga numra, çfarë më pengon mua ta sakrifikoj një pixel të një prej bitmap-eve që shoqërojnë programin, për të ruajtur pikërisht vlerën e hashit.

Arsyeja pse ekzistojnë file me format standart (një strukturë e brendshme  header  që shpreh domethënien e numrave që përbëjnë trupin e files) si dhe ekstensione standarte (bmp, wav, mp3, etj, etj), është pikërisht që domethënia e këtyre numrave të mund të lexohet/shfrytëzohet nga programe/përdorues të ndryshëm.
Nëse ne duam të kundërtën, pra që domethënien e një blloku numrash të mos e kuptojnë dot programe/njerëz të tjerë, apo më mirë akoma ta keqkuptojnë atë, bëjmë pikërisht këtë gjë:
Psh. një funksion të kompiluar (që sështë veçse një varg numrash) mund ta fusim në mes të një bitmap-i. Kur programi e ngarkon bitmap-in në memorje (për qëllimet e tij), fare lehtë (duke përdorur një offset) mund ta instruktojmë procesorin që një bllok të caktuar nga byte-t që përbëjnë bitmap-in ta trajtojë si instruksione (sepse të tilla janë - dhe këtë fakt e dimë vetëm ne).

Tani, sa kohë i duhet një krakeri (sado të zotë), i cili ka para syve vetëm offsete në hxm, të mund të zbulojë djallëzi të tilla që sduan më shumë se nja dy orë për tu realizuar. Dhe ka skema (apo djallëzi) që edhe kur tjetri ti shpjegon me fjalë sështë e lehtë ti kuptosh, e lëre pastaj ti deduktosh teksa kullot sytë para disa qindra mijëra instruksione në asm.

Thuhet se në kompjuter ska asgjë të pamundur. Dikush mund ta lidhi këtë pohim ekskluzivisht me krakimin, dikush me programimin, me sa duket është çështje kënd-vështrimi.

Përfundimisht për mua një debat nuk është një luftë, ku nëse argumentat e tua nuk triumfojnë mbi ato të kundërshtarit, sduhet të kthehesh i gjallë në shtëpi. Unë e shoh një debat më shumë si një pikë-takimi, ku gjithkush sjell eksperiencën apo botëkuptimin e tij, dhe meqënëse lidhur me temën unë e ezaurova botëkuptimin tim, nuk kam për të shkruar më mbi këtë temë (ca gjëra më duhet ti mbaj për vete).

----------


## qoska

Nese duhet te shprehim botekuptimin tone ne kete teme ja ku eshte i imi:
"Nje program mund te manipulohet(crakohet) pasi eshte thjesht arkitektura, apo duhet ta quaj funksionaliteti, qe te jep mundesine kete."

Kjo rrjedh nga fakti, sic eshte permendur me siper, nje programues nuk mund te jete perfekt ai ben gabime dhe keto duhen testuar dhe per momentin e vetmja menyre efektive eshte te krijohet ambienti i testimit deri ne nivelin me te ulet. Problemi eshte qe kjo hap rruge per te bere keto manipulime!
Nje zgjidhje do te ishte krijimi i dy lloj kompjuterash atyre qe te lejojne te kesh kete funksionalitet ose jo?! Por a m und te percaktohet kush do ta perdori kete funksionalietet apo jo eshte i nje parameter i papercaktuar.

Per sa i perket replikes se kostoja e harxhuar ne thyerjen/modifikimin e programeve eshte kosto e tepruar, them se nuk qendron pasi biznesi me fitim prures ne kohet tona eshte siguria dhe ka te njejten mos themi me shume qarkullim te ardhurash me krijimin e programeve!

Per ti rene shkurt a mund te krijojme programe te pathyeshme pergjigja eshte evidente: "JO!"(jo si fakt se nuk mund te shkruhet, qe ska lidhje me arkitekturen e permendur nga Josif, por nga fakti se e njejta arkitekture te jep mundesine te kthehesh mbraphst ose te "emulosh" nje gje te marre si te mirqene nga programuesi me dicka tenden.

Josif,
persa i perket arkitekturave Von Newman ka dhe nje arkitekture tjeter fatkeqesisht te paperfunduar qe do te kishte sjelle kompjuterin "e vertete" paralel qe sot po tentohet te arrihet nga disa modele te "quantum computers".
gjithsesi nuk do te thote qe ne arkitekturat e sotme ti je i detyruar ta besh publike gjendjen fillestare te programit tend, kjo eshte nje zgjedhje e programuesit!

Se fundmi, dua te theksoj dicka qe Neritani e merr te mireqene per mua nuk ka ndarje ndermjet nje modifikuesi programesh dhe nje prorgramuesi sepse ne fund te fundit te dy bejne te njejten gje ndryshojne gjendjen e makines sipas interesit te tyre ne nje moment te caktuar.
Dallimi eshte tek njohurite/nivelin qe ata perdorin, i cili do shume pune te perfeksionohet kohet e sotme per shume arsye.

----------


## josif

> ... prere per arsye hapesirash ... 
> 
> 
> gjithsesi nuk do te thote qe ne arkitekturat e sotme ti je i detyruar ta besh publike gjendjen fillestare te programit tend, kjo eshte nje zgjedhje e programuesit!
> 
> 
> ... prere per arsye hapesirash ...


pershendetje,

a mund te me japesh nje program ku gjendja fillestare te mos jete publike.
me publike nuk synoj te theksoj 'protection levelin', por vete gjendjen fillestare te programit. p.sh. : gjendja fillestare e shume programeve gjendet ne exe-te e dhena per egzekutim prej kompanive.

p.s.: mendoj se duhet ta kesh kekuptuar kete pike. sipas 'teorise se kompjutimit' nuk ka programe pa gjendje fillestare, egzekutimi duhet te filloje diku ??

----------


## Agron_ca

Neritan, je duke luftuar në drejtim të gabuar.

Mbrojtja e programeve bëhet me programin deri në një nivel të mundshëm teknik e cila nuk është e kënaqshme. Mbrojtja duhet të bëhet me ligj.

Çka duhet të bësh ti në programin tënd është të mbledhësh të dhëna për përdoruesit ilegal të programit për ti prezentuar në gjyq.

Disa prej informatave për identifikimin e përdorusit ilegal është MAC adresa e kartelës së rrjetit dhe profili i tij.

Mos u ofendoni me paditurinë time, por dua të dijë se cili është programi yt. Qenka fjalor apo? Si e ka emrin dhe ku e ka web faqen?


//Agroni

----------


## Neritan Hyso

Meqenese kjo kollone ka te beje me programimin, debati natyrshem zhvillohet brenda kontureve te programimit (edhe mbi subjektin e mbrojtjes). Nje diskutim  mbi mbrojtjen ligjore, jo vetem do ishte i pavend ketu, por do ishte pa vend edhe ne kontekstin e realitetit Shqiptar.
Fjalorin tim mund ta shkarkosh ne www.intein-nt.com

Meqe e shkela fjalen per te mos shkruar mbi kete teme, po e shkel me te dy kembet duke e plotesuar me nja dy detaje praktike mesazhin tim te meparshem.
Konkretisht, une flisja per nje funksion te ruajtur brenda nje bitmapi, te cilin programi e ngarkonte ne memorje per ta ekzekutuar.



```
HRESULT	FunksionIntim (LPCWSTR wzText, DWORD dwCount)
{
	
};

void	FunksioniPasues ()
{
};

// Per ta ruajtur funksionin FunksionIntim nje nje file (psh.) 
// mund te shkruanim dicka te tille:

PBYTE	pb1 = (PBYTE)FunksionIntim,
	pb2 = (PBYTE)FunksionPasues;
DWORD	dw = 0;

WriteFile (
	hFile,		// e kemi krijuar me pare me CreateFile()
	(void*)pb1,	// adresa ku fillon blloku ne memorje qe duam te ruajme
	PtrToUint(pb2  pb1),		// numri i byte-ve qe duam te ruajme
	&dw,		// numri i byte-ve qe u shkruan faktikisht
	NULL		// LPOVERLAPPED
	);
```


Tani le te supozojme se ne nje fare menyre e kemi ngarkuar ne memorje kete bllok byte-sh (qe perfaqesojne funksionin) dhe kemi nje pointer pByte qe shenon tek ai, si mund ta therrasim funksionin? Ne nje veshtrim te pare mund te duket si dicka qe kerkon ti besh duart pis me assembler, por faktikisht eshte dicka qe mund te realizohet fare lehte ne C



```
typedef	  HRESULT  (TFunksionIntim*)(LPCWSTR, DWORD);
TFunksionIntim	*pfnFunksionIntim = (TFunksionIntim)pByte;

// Ne kete pike mund ta therrasim funksionin tone si me poshte:
pfnFunksionIntim (Ltekst, 6);
```

C-ja merr persiper futjen e argumentave ne stack dhe transferimin e fokusit te procesorit ne funksionin tone (i cili natyrisht nuk eshte me pjese e exe-se).

E gjitha kjo funksionon per bukuri nese funksioni yne FunksionIntim nuk therret ndonje funksion tjeter. Ne rast se nga brendesia e FunksionIntim therriten funksione te tjere (qofte te shkruar nga ne, qofte te OS-se), adresat e ketyre funksioneve i duhen dhene funksionit FunksionIntim me ane te nje argumenti qe mund te jete nje pointer ne nje structure pointerash ne keta funksione.

Thelbi i gjithe kesaj eshte ky: Njerezit nuk mund t'i lexojne dot programet (ne asm) me sy te lire, por ekzistojne nje mori tool-sash qe te ndihmojne ne kete proces. Megjithate keto "tool-sa" jane ne gjendje te lexojne/interpretojne vetem instruksione qe gjenden si pjese e nje file ne nje format standart (psh. PE qe perfshin *.exe, *.dll). Nese ne e ruajme ndonje funksion nje nje file tjeter (psh. brenda nje bitmapi), tool-sa te tille nuk pine shume uje.

Para ca ditesh degjova ne lajme se BE-ja ka ndermend t'i vere nje tjeter gjobe Microsoft-it per shkak se ky i fundit nuk publikon "te perbrendshmet" (the internals) e OS (cka i ve ne pozita "jo te barabarta" prodhuesit Europiane te sofwereve, te cilet me sa duket kane vene ne levizje BE-ne). 

Pyetja qe me lindi ne koke (duke pare ne kete kollove vete-besimin e admirueshem te disave mbi mundesine e leximit te c'do programi ne asm, madje edhe te programeve qe me "vetedije" perpiqen ta sabotojne kete proces), se perse valle prodhuesit Europiane te softwereve nuk i pervishen leximit ne asm te "Windows binaries", por i "qahen" BE-se?

----------


## Uke Topalli

eshte qe programi te shperndahet falas, perndryshe nuk ke mundesi te garantuar per mbrojtje (sic e ka kuptuar edhe microsofti). Spekulimet e tipit: 
"neqoftese dikush i qaset programit me mjete (tools) tjera (cracking tools) do t'ja bllokoj kompjuterin"
nuk pijne uje, sepse shum shpejt do te duheshe te paguash demshperblime te medha ne gjyq. Neqoftese deshiron te perfitosh nga programi atehere caktoja cmimin real ne menyre qe te jet e palogjikshme, nga aspekti ekonomik, te humbet koha ne piratimin e programit. E cmimi real varet edhe nga tregu ku e plason produktin (100 dollar ne Shqiperi nuk e kan peshen e njejte sikur 100 dollar ne SHBA). Si perfundim do ta parashtroj nje pyetje:

- Perse eshte pirateria me e perhapur ne vendet e pazhvilluara?

Pergjegjja do te jap indikacion se si te zhduket ky "krim"

----------


## Uke Topalli

> ...
> Para ca ditesh degjova ne lajme se BE-ja ka ndermend t'i vere nje tjeter gjobe Microsoft-it per shkak se ky i fundit nuk publikon "te perbrendshmet" (the internals) e OS (cka i ve ne pozita "jo te barabarta" prodhuesit Europiane te sofwereve, te cilet me sa duket kane vene ne levizje BE-ne). 
> 
> Pyetja qe me lindi ne koke (duke pare ne kete kollove vete-besimin e admirueshem te disave mbi mundesine e leximit te c'do programi ne asm, madje edhe te programeve qe me "vetedije" perpiqen ta sabotojne kete proces), se perse valle prodhuesit Europiane te softwereve nuk i pervishen leximit ne asm te "Windows binaries", por i "qahen" BE-se?


Nuk e di se sa je i njohtuar me Samba, ose Evolution ose produkte te tilla te cilet nuk jane produkte te Microsoftit por ofrojne funksionalitet te ngjajshem ne pikepamjen e funksionimit ne rrjeta (Samba eshte te mundeson te futesh Linux serverin i cili paraqitet si server skedaresh ne rrjete te bazuar ne Microsoft ose ne klient ia mundeson casjen Windows serverave, evolution eshte klient per email i cili mund ti caset edhe exchange serverit). Meqenese microsofti eshte prodhues komercial i sofware-it i motivuar nga profitet ai tenton te krijon nje mvarshmeri te plote nga produktet e tyre. Me fjale tjera duhesh ms serverin, dhe ms klientin dhe ms office etj. Gabimi te cilin ms e ka bere eshte se protokolet e rrjetes duhet te jene publike e jo te mshehta, ne kete menyre mundesohet konkurenca fer dhe produkti me i mire do fitoj. Po qe se protokoli mbahet i mshehte konkurenca e drejte nuk eshte e mundshme dhe monopoli krijohet. Ketu eshte esence e gjobimit te MS nga EU. Pra nuk ka lidhje me mbrojtjen nga thyerjet e mundshme. 
Teoria jote se me maskimin e funksioneve brenda skedareve tjere (besoj se more si shembull bitmap) eshte naive.

----------


## Neritan Hyso

Nuk desha te bej polemika rreth faktit a duhen apo s'duhen publikuar implementimet e OS-se, une thjesht pyeta se nese eshte praktikisht e mundur leximi i instruksioneve (ne asm) te softwereve, atehere edhe debati i mesiperm nuk do kishte sens (ne mos kushdo, te pakten kompanite kryesore (qe kane te punesuar njerez boll te ztote) do mund t'i deshifronin te gjitha te "fshehtat" e OS-se pa pasur nevoje per souce-code).

Zhvendosja e ndonje funksioni nga exe-ja ne nje bitmap, nuk eshte nje teori, por thjesht nje shembull qe me erdhi ne mendje ndersa shkruaja ate mesazh. Shembull qe tregon se me pak fantazi mund te besh pothuajse c'do gje, dhe nuk eshte nevoja as per asembler, mbasi edhe gjuhe te tilla te nivelit te "larte" si C-ja jane boll te afta per te te lejuar te "shprehesh" c'do ide, gje qe me "tool-sa" te tille si OllyDbg as qe mund te imagjinohet.

----------


## lonely_lion

Hera e fundit qe shkruaj ne kete teme... Te pakten Admine lereni kete shkrim per ca dite ! Per Nerin dhe per te gjithe ata qe duan te dine si funksionon Libraria Standarte e Windows API !

Ne kete forum ( do te jesh i rregjistruar ) 



```
http://forums.accessroot.com/
```

Kerko tek Tutorialet kete artikull " Weakness of API .... " dhe do te kuptosh se ajo qe beson eshte e gabuar !

Neri ! Ta kam shkruar njehere, por mbase se ke lexuar se e kane fshire postimin !

Nuk mund te shkruash jo ti po as nje funksione te ndryshme nga ato qe permban API ( mbase s'jam shprehur qarte, por thelbi eshte qe cdo gje qe do te shkruash ti do te njihet kompilohet ose i kalohet sistemit qe ta interpretoje me anen e funksioneve te tij te njohura dhe ne rastin tone Windows API ) ... sepse perndryshe lejimi i shkrimit te funksioneve te ndryshme ose shumellojeshme do te krijonte anarshi totale te nje OS !

p.s.
me fal qe s'kam kohe te mjaftueshme tani dhe respekte si programisti shqiptar me i zote qe njoh !

----------


## qoska

Neri,

fantazia e programuesit eshte e bukur por siguria eshte komplet tjeter objekt bisede e lidhur dobet me programuesit.
Nese nuk e ke kuptuar cfare do te thote te lexosh gjithcka ne asm po ta shpjegoj:
"Do te thote qe asm eshte shtresa mbi te cilat te gjitha po e theksoj te gjitha komandat e procesorit duhet te kalojne para se te ekzekutohen! Cka do te thote eshte se cfaredo lloj gjeje qe it fantazon eshte e prekshme nga kjo gjuhe edhe pse ti e enkripton a ku di une"

Sic eshte thene me lart mbrojtja eshte legale pasi nuk ka mjet tjeter!
Prandaj kane lindur dhe koncepte si "Shareware".

Persa i perket kompanive te medha qe "nuk arrijne te deshifrojne kodin e Micorosft" lexo ligjet njehere dhe shiko se si Samba, nje nga shembujt e marre me siper, ka bere pikerisht kete! Problemi qendorn a eshte e justifikueshme kostoja per ta bere kete?! 
Pergjigja, eshte JO sepse ne kemi krijuar tregjet te cilat duhet te garantojne konkurrence te ndershme dhe ketu bazohet dhe ceshtja kundrejt Microsoft, e cila po te mos mbeshtetej nga USA do te kishte rene me kohe per vete praktikat qe ka ndjekur. Pra, te mbeshtesesh praktikat e Microsoft duke i quajtur te tjeret te paafte nuk eshte e lehte, pasi duhen marre parasysh konteksti qe ne kete rast eshte fizibiliteti ose ana legale e arritjes se disa gjerave!

Gjithsesi seicili ka bindjet e veta dhe kjo eshte liria e mendimit dhe verpimit qe duhet te na lejoje ky treg; rregullat e te cilit shkelen nga Microsoft.

Tani,
ti thuash njerit programuesi me i zote shqiptar me duket pak e lehte ne princip pasi te krahasosh programuesit eshte pak e veshtire ne ditet tona per vete fushat e gjera te cilat kjo perfshin.

Me te mira.

P.S. Te gjithe kemi ankesa ndaj moderimit te ketij nenforumi por heh kur s'ke ci bem s'ke ci ben dhe kjo eshte nje nga "buget" me serioze te lirise se mendimit :P !

----------


## Uke Topalli

Sikur ne procesin e zhvillimit te software-it ashtu edhe ne zgjedhjen dhe implementimin e mekanizmave qe mbrojn software-in nga kopjimi/perdorimi i pautorizuar, premisat fillestare jane esenciale per dizajn te mire. Si duket Neritani, ne tentimin e implementimit te mekanizmit mbrojtes (ose zhvillimin e konceptit) niset nga nje premise e cile mua me duket shume e gabueshme dhe nje tjeter e cila eshte paksa me pak e gabueshme. Me lejoni te elaboroj edhe pse keto nuk jane aq ngusht te lidhura me praksen e programimit por me teper me logjiken e thjeshte.

-Nga shkrimet e Neritanit une mare pershtypjen se ai ka nje mendim nencmues per aftesite intelektuale te personave te cilet thyejne programet komerciale. Perderise as une nuk kam mendim te larte per vlerate e tyre morale, sa i perket aftesive intelektuale thyeresit jane zakonisht mjaft te afte me nje etje te madhe per zgjedhjen e problemeve dhe me nje dembeli te theksuar kur vie deri te shkrimi/krijimi i programeve. Sic eshte treguar mijera here deri tani: betejen do e humbas ai i cili nuk e respekton armikun per aftesite me te cilat (armiku) disponon.
   Kjo eshte premisa kryesore e cila do te vendos se sa i sukseshem do te jet mekanizmi mbrojtes. Nqs sypozon se thyeresit nuk jane te afte intelektualisht atehere patjeter do te deshtosh.

-Nje gje tjeter qe del nga postimet e Neritanit eshte sypozimi se thyerresit do te perdorin mjete (tools) speciale, prandaj nese e zhvillon nje mekanizem mbrojtes i cili e pamundeson casjen e ketyre mjeteve problemi zgjidhet. Edhe kjo eshte premise e gabuar. Se pari per shkak se mjeti me i perdorur nuk eshte mjet special por thjesht nje editor hexadecimal, se dyti nuk mund te parashikohen te gjitha zhvillimet e mundeshme ne kete fushe. Pra mekanizmi mbrojtes i cili zhvillohet sot dhe e kryen funksionin e vet ne menyre te parashikuar mund te mos funksionoj te nesermen.

----------


## Neritan Hyso

Së pari unë nuk mendoj se kategoria e punës (apo në mënyrë më të përgjithshme aktiviteti njerëzor) ka ndonjë lidhje me zotësinë (me intelektin mund të ketë njëfarë lidhje meqënëse disa aktivitete kërkojnë një angazhim më intensiv të mendjes se disa të tjerë)  brenda cdo aktiviteti (dhe brenda cdo disipline të një aktiviteti) ka hapësira për të zhvilluar  zotësinë.

Mbas gjithë sa kam shkruar (dhe kam lexuar) në këtë temë, si dhe duke vënë re diferencën e madhe që kemi mbi disa pikëpamje, e vetmja gjë e sigurtë (me sa duket) është se një forum ndoshta nuk është mënyra më e mirë për të shpalosur gjithë sa dimë mbi këtë subjekt (mbasi unë jam i sigurtë se përtej reagimit emocional, kjo materie nuk është edhe aq subjektive sa të lejojë një diferencë kaq të madhe pikëpamjesh).

Gjithësesi, ndonëse rriskoj të bëhem i mërzitshëm, e shoh me vend të sqaroj nja dy gjëra (të paktën ashtu si i di unë).

Së pari nuk je i detyruar të përdorësh API-n (me gjithë weaknes e tij)  të paktën në disa situata specifike (sic është mbrojtja) mund të krijosh funksionet e tua.
Natyrisht gjithcka në fund të fundit ka për tu përkthyer në instruksione makine (jo ne assembler). Sidoqoftë këto instruksione makine nuk mund të lexohen me sy të lirë, por nëse me anë të një debugeri apo disasembleri shnërrohen në assembler, atëherë (me shumë vështirësi) mund të lexohen.
Gjithësesi disasemblerat apo debugerat janë projektuar për të lexuar file në format standart, asnjë prej tyre nuk është në gjendje të lexojë psh. një file propietary. 

Instruksionet e makinës (në rastin e familjes x86 të procesorëve) nuk kanë të njëjtën gjatësi (nr bytesh)  ka instruksione që janë vetëm 1 byte, si dhe ka instruksione që mund të shkojnë mbi 10 byte. Nëse nuk di me saktësi se tek cili byte fillon një bllok instruksionesh është thjeshtë e pamundur ta lexosh/interpretosh atë (me cfarëdolloj mënyre). Pikërisht ky është roli i file-ve në format standart  të cilat  inkorporojnë gjithë informacionin e nevojshëm se në cilin byte (brenda files) fillon secili funksion (si dhe cili byte përfaqëson portën hyrëse të programi  funksion main()).

Naytryrisht  herët a vonë (pavarësisht nga teknika e përdorur) cdo funksion do përfundojë në memorje, si dhe procesori do jetë adresuar saktë në fillim të tij (në këtë pikë një debuger ka për ta disasembluar  saktë në asm bllokun e byte-ve që përfaqësojnë funksionin), por ky moment mund të zgjasë vetëm një faksion të sekondës (psh. 1 të miliontën e sekondës) dhe gjithësesi ndodh diku vonë gjatë ekzekutimit të programit.
E gjitha kjo do të thotë se  e vetmja mënyrë për të deshifruar një funksion të tillë, është ta ekzekutosh të gjithë programin hap mbas hapi (duke bërë step-into cdo call apo jmp, ja, jb, ejt) dhe natyrisht mbas cdo debug-step të përqëndrohesh (dhe të shpenzosh një pjesë të mirë kohe) mbi instruksionet asm që shfaqen  dhe një kohë e tillë mund të jetë ekstremisht e gjatë (përgjithësisht programet janë shumë më të mëdhenjë nga ajo cka shkruan autori i tyre falë përfshirjes së instruksioneve të librarive apo platformave me të cilat këto aplikacione krijohen).

Gjithë sa kam shprehur unë gjatë kësaj kollone mund të përmblidhet në këtë:
* Leximi i programeve në asm është një proces shumë i vështirë (prandaj ekziston interesi për souce-code). 
* Programe apo tool-sa të ndryshëm tentojnë ta lehtësojnë këtë proces.
* Ekzistojnë teknika për ta sabotuar ndihmën që të ofrojnë këto software, duke i detyruar (personat e interesuar) në një lexim/kuptim të të gjithë programit në asm  sipërmarrje kjo shumë e vështirë dhe afatgjatë, deri në atë pikë sa mund tja kalojë edhe autorësimit të softwerit origjinal (në kuptim të vështirësisë dhe kohëzgjatjes)  duke humbur motivimin praktik që qëndron mbas krakimit.

Përfundimisht, mendoj se për një forum NUK ka vend shprehja fjalët i merr erra  ajo cka ne shkruajmë ngelet. Secili merr atë që i nevojitet (mbasi e filtron më parë përmes filtrit të eksperiencës së tij).

----------

