# Shkenca > Informatikë dhe Internet > Arti i programimit >  A mund të disasemblohet vallë çdo program?

## Neritan Hyso

Kam krijuar nje program te vogel ne asm, i cili po the shkruhej ne C (ne fakt s'mund te shkruhet dot), s'do ishte me shume se 8-9 rreshta.

Programi therret vetem nje funksion te jashtem "MessageBox()", dhe implementon nje skeme teper te thjeshte kodimi te teksteve te MessageBox-it (meqenese nuk perdor asnje API te jashtem, dhe eshte teper i vogel per te pasur nje skeme me komplekse), e megjithate, Debuger-i (OllyDbg) nuk eshte ne gjendje ta dis-asembloje pjesen derrmuese te programit, dhe edhe pjesen qe arrin ta dis-asembloje, ne nje pjese te mire te saj e dis-asemblon gabim.

Jam kurioz te shon nese eshte ndokush ne gjendje ta komentoje kete program as 1kb, i cili ka vetem 43 komanda asm (duke perfshire edhe ato qe deklarojne variabla).

----------


## cunimartum

> 00400190: A4                 movs        byte ptr es:[edi],byte ptr [esi]
>   00400191: 02 00              add         al,byte ptr [eax]
>   00400193: 00 00              add         byte ptr [eax],al
>   00400195: 00 00              add         byte ptr [eax],al
>   00400197: 00 00              add         byte ptr [eax],al
>   00400199: 00 00              add         byte ptr [eax],al
>   0040019B: 00 00              add         byte ptr [eax],al
>   0040019D: 00 00              add         byte ptr [eax],al
>   0040019F: 00 00              add         byte ptr [eax],al
> ...


Po me doli koha nga fundjava do ta riasembloj me MASM   me fjale te ndryshuara ...
Cheers

----------


## edspace

Neritan, 

Ti mbase je i interesuar për një përgjigje praktike për programin që ke shkruar, por nga ana teorike/filozofike përgjigja është Po, çdo program mund të zbërthehet në assembly. Arsyeja për këtë përgjigje është e thjeshtë. Të gjitha gjuhët e makinave dhe programeve janë degë të të njëjtës pemë, trungu i së cilës përbëhet nga gjuha e logjikës, gjuha e mendjes së njeriut. Për aq kohë sa ekzistojnë fjalorët, çdo gjuhë e makinës mund të transformohet apo përkthehet në një gjuhë tjetër pa humbur logjikën/kuptimin e ndërthurur në gjuhën origjinale. 

Në rastin konkret, për të kaluar nga gjuha e makinës në gjuhën assembly, do përdorim të njëjtin fjalor që mundësoi ndërtimin e makinës.

----------


## Neritan Hyso

Eshte e vertete qe nje program (source-code) ne cfaredo gjuhe programimi mund te perkthehet ne gjuhe makine, por e kunderta nuk eshte e gjithmone e vertete (ne fakt nuk eshte asnjehere e vertete per te gjitha gjuhet e programimit me perjashtim te asemblerit), dhe ne disa raste nuk eshte e mundur as te rikthehet (disasemblohet) ne asembler (domethene te disasemblohet ne menyre korrekte).

cunimartum mund ta asembloje programin qe ai kujton se ka dis-asembluar, mbase edhe mund t'i ndryshoje tekstet (kjo eshte per t'u pare), dhe kjo nuk perben ndonje cudi te madhe, pasi programi eshte tmerresisht i vogel. Por nese do ta ekzekutoje hap-mbas-hapi programin tim me nje debuger, do vere re se ka nje mosperputhje midis komandave (dhe aksioneve te tyre) ne programin tim, dhe instruksioneve ne asm te versionit te tij te dis-asembluar, apo per ta thene ne menyre me te drejtperdrejte, versioni i tij eshte dis-asembluar gabim, pra ne te ka komanda qe nuk ndeshen ne programin tim, dhe anasjelltas, ne programin tim ka komanda qe nuk figurojne ne versionin e tij.

P.sh. mund ta komentoje cunimartun ne versionin e tij te disasembluar se ne cilin rresht futen argumentat e funksionit MessageBox(...) ne stack, ne cilin rresht realizohet thirrja e funksionit call MessageBox, dhe cili eshte instruksioni qe shenon fundin e programit, d.m.th. instruksioni ret ne fund te funksionit 
main()
{
...
return;
}


Jo per te bere enigmatikun, por mendoj se nje shembull me i thjeshte se ai qe kam implementuar ne kete program do ishte me i pershtatshem per ilustrim. Keshtu qe do ta krijoj ne nje nga keto dite, dhe do ta plotesoj kete mesazh me fragmente kodi te cilat do ilustrojne pikerisht pamundesine TEORIKE per te konvertuar nga gjuha e makines ne asm.

----------


## OO7

Te gjithe programet mund te behen *"disassemble".* Deri me sot nuk ka programe *funksionale* (dmth qe kryejne nje funksion) qe nuk mund te behen dissasemble. Nese do te kishte, te gjitha kompanite do merrnin shembullin e tyre dhe nuk do kishim me programe pirate. Me daljen e Vistes u tha se ishte i *"pathyeshem"* por e kunderta u provua shume shpejt. Nesse programi qe ti ke shkruar ka nje funksion dhe eshte finksional mund te behet *disassemble* pa problem. Skam kohe tani, por ne ditet ne vazhdim mund te merrem ndopak.

----------


## edspace

Neritan, 

Assembly është një përkthim i drejtpërdrejtë (një-me-një) i bashkësisë së komandave që mund të zbatojë një procesor. Pra, çdo komandë që zbaton procesori mund të shprehet në assembly, dhe gjithçka që shkruhet në assembly mund të ekzekutohet në procesor. 

Nëse supozojmë se një program në assembly shndërrohet në një kod makine, por nuk mund të shndërrohet prapë në assembly, atëherë me të njëjtin arsyetim na takon të themi se njeriu ka krijuar një procesor që ekzekuton një komandë e cila nuk mund të shprehet në assembly. Kjo është në kundërshtimin me parimin që thashë më lart, që assembly është përkthim i drejtpërdrejtë i çdo komande që ekzekuton një procesor. 

Siç e tha edhe anëtari më lart, për çfarëdo funksioni që kryen asembleri për të përkthyer assembly në gjuhën e makinës, disasembleri mund të ketë një funksion që rezulton në assembly me të njëjtën llogjikë. Thënë ndryshe, kodi i përkthyer nga disasembleri mund të mos jetë identik me asemblin origjinal, por llogjika apo radha e veprimeve është e njëjtë, radha që ndjek procesori për ta ekzekutuar kodin. 

Ti mbase nuk ke gjetur diasemblerin e saktë, por nëse shkon tek Intel apo AMD dhe u jep një kod makine që ekzekutohet në procesorin e tyre, jam i bindur se ata do jenë në gjendje të disasemblojnë kodin me disasemblerin e tyre që përfshin të gjitha komandat e procesorit.

----------


## josif

Pershendetje,

Dissasemblimi eshte nje proces "ne pergjithesi" i realizueshem, per sa kohe assemblimi eshte nje process qe ka invers.

Kurse teorikisht disassemblimi nuk eshte deterministik:

Wikipedia, Disassembler:

"Disassembly is not an exact science: On CISC platforms with variable-width instructions, or in the presence of self-modifying code, it is possible for a single program to have two or more reasonable disassemblies. Determining which instructions would actually be encountered during a run of the program reduces to the proven-unsolvable halting problem."

Gjithe te mirat,

----------


## Borix

Ideja e dizaseblimit eshte e tille qe cdo kod mund te disasemblohet. Kjo nuk diskutohet, sepse, sic thote edspace, lidhja eshte bijektive. Por, meqenese per cdo program, ose set komandash, mashinat dixhitale e kane te veshtire dallimin midis metadatave dhe te dhenave aktuale, atehere ceshtja e disasemblimit eshte e barazvlefshme me problemin e Turing, sic permend josifi me lart. Kjo e fundit eshte sepse jo te gjitha instruksionet e disasemblerit mund te automatizohen. Dhe pikerisht ketu krijohet ngaterresa midis mos-automatizimit te plote te procesit te disasemblimit dhe problemes se nese cdo program mund te disasemblohet.

Me fjale te tjera, nese ti i jep Olly-t nje set te pafundem programesh P, atehere nuk eshte e thene qe Olly te disasembloje cdo program P_i, per i qe tenton drejt pafundesise, sepse Olly *mbase* nuk diferencon midis metadatas se programit tend, dhe te dhenave faktike te programit tend P_i. Megjithate, kjo nuk do te thote se nje program P_i nuk mund te disasemblohet - thjesht, nuk e disasemblon dot Olly. Ketu krijohen iluzioni qe lind edhe pyetje interesante si kjo ne kete teme.

Pra, ketu jam dakord me edspace, ku te keshillon te shkosh tek laboratoret e Intelit, sepse ata duhet ose pritet te kene nje disasembler me te mire se Olly, megjithese per mua ky i fundit mbetet nje nga disasemblerat me te mire te globit.

----------


## cunimartum

Rreshtat qe kam vene me siper jane nxjerre me dumpbin.

Arsyeja pse jane ndryshe nga versioni origjinal eshte sepse ke perdorur jumps ne unaligned offsets. Psh. une shoh call 004001F8 mirepo output i disasembluar e tregon sikur eshte ne mes te nje instruksioni. Kjo sepse disasemblerat vetem sa shohin ku fillon kodi dhe pastaj supozojne qe eshte "contigous" bashkesia e instruksioneve. Mirepo mund te vendosen disa "dead" bytes qe te kryhet jumpi pas atyre. Disasembleri vazhdon ti interpretoj edhe keto dhe qe aty interpreton c'do gje gabim.

Per ta disasembluar duhet perdorur disasemblimi i arbitrary bytes (Nuk mbaj mend nese SoftIce arrin te disasembloj arbitrary bytes). Keto dy jave s'kam kohe por do shkruaj dicka te vogel per te bere pikerisht kete duke perdorur: http://bastard.sourceforge.net/libdisasm.html (nese SoftIce s'mundet) dhe ndryshoj tekstin.

Interesant obfuskimi i bere. Akoma me veshtire per tu zberthyer nese do ishte kriptuar-dekriptuar ne runtime.

Pergjigja e pyetjeve te bera:



> 00400190                    MessageBoxA:
> 00400194 0000                   add     [eax],al
> 00400196 0000                   add     [eax],al
> 00400198 0000                   add     [eax],al
> 0040019A 0000                   add     [eax],al
> 0040019C 0000                   add     [eax],al
> 0040019E 0000                   add     [eax],al
> 004001A0 0000                   add     [eax],al
> 004001A2 0000                   add     [eax],al
> ...


ps. Daemon Tools perdor dicka te tille per te mbrojtur pjeset e kodit qe ruajne regjistrimin, por duke i shtuar edhe kriptim-dekriptim

----------


## Neritan Hyso

Serish jam kurioz te shoh nese cunimartum do arrije dot ta asembloje programin (me tekste te modifikuara apo origjinale, s'ka rendesi)

Mesazhi im (ne vijim) eshte nje shtjellim me i detajuar i mesazhit te Josifit.

Siguria se çdo program mund të disasemblohet, qëndron në supozimin se marrëdhënia midis instruksioneve të makinës, dhe ekuivalentëve përkatës të gjuhës asembler, është një marrëdhënie biunivoke. 
Epo... nuk është tamam kështu.

Sipas dokumentacionit të Intelit, formati i një instruksioni makine është ky:

[Prefix-es] [op-code] [ModR/M] [SIB] [Displacement] [Imediate]

Opcod-i është prezent në çdo instruksion, prefikset janë fakultativ, ndërsa prezenca e fushave të tjera varet nga instruksioni. Opcod-i vetë, mund të jetë 1, 2 ose 3 byte, çka do të thotë se disa instruksione janë vetëm 1 byte (si p.sh. C3  instruksioni RET). Fushat e Prefiksit, Displacement, dhe Imediate mund të jenë deri në 4 byte secila, ndërsa ModR/M dhe SIB janë nga 1 byte, çka do të thotë se një instruksion mund të jetë deri në 4 + 3 + 1 + 1 + 4 + 4 = 17 byte (natyrisht nuk ekzistojnë të gjitha kombinimet e mundshme të këtyre fushave, dhe nuk di nëse ka ndonjë instruksion 17 byte të gjatë, por instruksione deri në 10 byte është e sigurte që ekzistojnë).

Gjithashtu, bashkësia e vlerave numerike (të lejuara) për secilën nga fushat mësipër, nuk është unike. Pra e njëjta vlerë numerike mund të figurojë si op-cod, mund të figurojë si ModR/M, SIB, apo të ndeshet në Displacement apo Imediate.

E gjitha kjo do të thotë se që procesori (apo edhe debuger-i apo disasembleri) të dekodojë saktë një instruksion, ai duhet të dijë se ku fillon ky instruksion. Përndryshe, dekodimi ka për të qenë tjetër për tjetër. Dhe që të gjendet se ku fillon instruksioni pasardhës, është e nevojshme të dekodohet saktë instruksioni aktual, pasi vetëm mbasi të dekodohet (saktë) do merret vesh gjatësia e tij, e për pasojë fillimi i instruksionit pasardhës.

Natyrisht, për të gjitha llojet e programeve ekziston një mekanizëm për ti treguar procesorit se ku fillon instruksioni i parë që ai duhet të ekzekutojë. Më pas, instruksion mbas instruksioni, procesori dekodon, llogarit madhësinë e instruksionit aktual, gjen ku fillon instruksioni pasardhës, e kështu me radhë...

Fakti që instruksionet kanë gjatësi të ndryshme, si dhe fakti që bashkësia e vlerave të fushave që formojnë një instruksion nuk është unike, krijon mundësinë që brenda një instruksioni të gjatë (prej disa byte-sh) të mund të vendosen edhe një apo më shumë instruksione më të vegjël (në kuptimin të shkurtër), dhe gjithçka është OK, pasi rrjedha e ekzekutimi të programit mund ta ri-sjellë sërish procesorin në brendësi të instruksionit të gjatë, konkretisht në fillim të instruksioneve të shkurtër që gjenden brenda tij.

Pra, instruksionet e makinës edhe mund të mbivendosen (d.m.th. i njëjti byte mund të jetë pjesë e dy instruksioneve të ndryshëm), por instruksionet e asemblerit (dhe të çdo gjuhe tjetër) NUK MUND!

Tani, çfarë do të ndodhte nëse një disasembler ideal (imagjinar) do tentonte ti disasemblonte këto instruksione makine?
Kemi dy raste:
	Ose do disasemblonte vetëm njërin nga instruksionet e mbivendosura (ndoshta atë më të gjatin), dhe duke mos mundur ti disasemblojë dot të gjitha instruksionet, jo vetëm që do dështonte në misionin e tij, por duke e humbur fillin, do disasemblonte në mënyrë të gabuar disa instruksione, duke e shtyrë lexuesin e kodit asm në një rrugë pa krye. 
	Ose do ti disasemblonte të gjitha instrukionet (vetëm një disasembler/debuger imagjinar do mund ta bënte këtë) por fakti që instruksionet e asemblerit nuk mund të mbivendosen, do shtronte përpara disasemblerit detyrën (krijuese) për të gjetur një vend për njërin nga instruksionet e mbivendosur, vend që kudoqoftë, smund të jetë aty ku do duhej të ishte. Dhe jo vetëm që programi i asembluar nuk ka për të qenë identik me origjinalin, por sipas të gjitha gjasave as nuk ka për të funksionuar si programi origjinal.

Dhe kini parasysh se nuk po flasim për një program të encryptuar apo që modifikon vetveten. Programi që kemi marrë në shqyrtim është statik, pra do mund të ekzektuohej edhe nga ROM-i.

Në rastin e një disasembleri/debugeri real, atij do ti duhej të zgjidhte midis disasemblimit të gabuar të disa instruksioneve, apo, nëse do ishte ca më inteligjent (siç është OllyDbg me Analysis të aktivizuar), të paktën do arrinte të kuptonte pamundësinë për të disasembluar, dhe thjesht do dorëzohej duke i paraqitur instruksionet e makinës në... gjuhë makine, pra si një varg byte-sh të shprehur në hekzadecimal.

----------------------------------------------------------------------------
Siç thosha në mesazhin e mëparshëm, krijova një program më të vogël dhe më të thjeshtë për ilustrim, sidoqoftë, komentimi i programit rezultoi jo dhe aq didaktik sa e kisha menduar, kështuqë gjykova se shpjegimi mësipër (në nivel teorik) do ishte më i thjeshtë.
Gjithsesi, përveç dy figurave mëposhtë, që tregojnë mënyrën se si OllyDbg e disasemblon programin, përkatësisht duke e disasembluar gabim, apo duke mos e disasembluar fare (me Analysis të aktivizuar), me anë të këtij linku mund ta shkarkoni programin për ta ekzekutuar hap-mbas-hapi me një debuger. Meqenëse ky program është më i vogël dhe më i thjeshtë se ai i mëparshmi, dhe nuk shfaq ndonjë MessageBox(),  e vetmja mënyrë (e dobishme) është ekzekutimi përmes një debugeri (janë vetëm 19 byte instruksione makine)


Disasemblimi mesiper meOllyDbl (Analysis i c'aktivizuar)


Disasemblimi mesiper me OllyDbg (me Analysis - s'i dekodon fare instruksionet)


Bottom Line:
Edhe pse çdo instruksion makine, i marrë më vete, mund të përkthehet në një instruksion asembleri - një sekuencë instruksionesh makine (pra një radhitje e caktuar e tyre) mund të mos përkthehet dot në asembler, pasi këto dy gjuhe kanë karakteristika të ndryshme (instruksionet e makinës mund të mbivendosen, ndërsa ato të asemblerit jo).
Pamundësia e gjuhës asembler për të përshkruar me korrektësi sekuenca të tilla instruksionesh makine, si dhe fakti që instruksionet kanë gjatësi të ndryshme, dhe e vetmja mënyrë për të kuptuar se ku fillon një instruksion, është të dekodosh saktë instruksionin paraardhës, shkakton edhe disasemblimin e gabuar (apo pamundësinë për të disasembluar) edhe të disa nga instruksioneve të tjera (të pafajshëm).

----------


## edspace

Neritan, 

Së pari, shembulli që po jep ti, instruksion përbrenda instruksionit është një shembull i koklavitur prej njeriut sepse përpiluesit/asemblerat nuk prodhojnë kod makine të atillë; s'kanë pse. Megjithatë, sado të koklavitur ta bëjë mendja e njeriut kodin e makinës, makina do ta thjeshtojë në një seri instruksionesh që ekzekutohen në radhë, njëri pas tjetrit. Nëse makina s'do arrinte ta bënte këtë, atëherë nuk do mund ta ekzekutonte programin, apo jo?

Kur procesori arrin ta zbërthejë kodin e makinës instruksion për instruksion, a nuk mund të përkthehet secili prej këtyre instruksioneve në assembly? Pra, thjesht i thua procesorit të regjistrojë cilin instruksion po ekzekuton për çdo cikël (cycle) dhe më pas këto instruksione i kthen në assembly. Sigurisht që ky regjistrim mund të jetë vetëm një prej shumë degëzimeve të mundshme ekzekutimi, por është një shembull i mjaftueshëm për të treguar që zbërthimi është i mundshëm. 

Disasemblerat qe ke provuar ti mbase nuk janë aq të zgjuar dhe tentojnë ta përkthejnë kodin e makinës rresht për rresht duke u ndeshur në problemet që ke përshkruar ti, por një disasembler më i zgjuar, do luante edhe rolin e procesorit, do ndiqte jump-et e do e kuptonte që një instruksion YZ është pjesë e instruksionit më të gjatë XYZ. Në këtë rast do e ndante instruksionin e gjatë të makinës në dy instruksione në assembly, një instruksion të gjatë e një të shkurtër, dukë zhbërë kështu marifetin që kishe bërë ti. 

Besoj se një disasembler i tillë është mëse i realizueshëm (besoj se ekziston në laboratorët e Intel apo AMD) sepse në fund të fundit po bën diçka të ngjashme me përpiluesat; analizon kodin në një gjuhë dhe e kthen atë në një gjuhë tjetër pa humbur kuptimin. Përpiluesi aplikon optimizime për të thjeshtuar/shpejtuar ekzekutimin e kodit (për makinat) ndërsa disasembleri do aplikonte optimizime për ta zbërthyer kodin e për ta bërë më të lexueshëm (për njerëzit).

----------


## P@R4nOi@C_LorD

A eshte e vertete se , duke perdorur kto debugerat (si ky olly) , behen keygenat ,, ose gjenden serialet dhe cracker? Si te mesoj kete gjuhen debugger?

----------


## OO7

Po e vertete eshte, pasi behet disassemble programi mesohet se cfare duhet per tu bere crack apo patch, apo algoritmet e perdorura per krijimin e keygen. Debugging nuk eshte gjuhe por proces per te eliminuar gabiemt (bugs) ne nje program.

----------


## P@R4nOi@C_LorD

U ngatrrova nga shpejtsia , doja te thosha si te mesoj gjuhen assembler?
Kete olly debuger e kam , po sa hap nji exe dalin ca milion shkronja dhe numra qe te cojne doren te X-i i kuq te cepi.

----------


## lonely_lion

Do s'do ti o Neri .... nje winapi do te perdori programi yt !

shiko ketu - figuren bashkangjitur!


Dissasembling ? Kerko me shume ne net dhe do te gjesh se si mund te shkruash nje dissasembler.

----------


## Neritan Hyso

Dua apo sdua unë?
- Kur unë NUK dua që një program të përdorë API, si në rastin e programit të dytë (më sipër), them se programi ka për të ma dëgjuar fjalën.
Megjithatë, jam i sigurt se me fatalitetin letrar mësipër, ke dashur të thuash se: si zor se mund të krijohet një program (i dobishëm), për sistemet e sotme të operimit (në DOS ishte e mundur), pa përdorur API.

Unë NUK kam pretenduar ndonjëherë të kundërtën, madje në mesazhin tim të parë, e kam përshkruar programin (e parë) se përdor vetëm një API: MessageBox().

Kështu që nuk e kuptoj se në çfarë ke dashur të tërheqësh vëmendjen, me 



> shiko ketu - figuren bashkangjitur!


Por ajo që kuptoj nga figura mësipër, është se kodi asm nuk i përket programit tim, por modulit user32 (të paktën këtë thotë OllyDbg në titullin e dritares (në figurën tënde)).

Atë panoramë instruksionesh asm që ke paraqitur në figurë, mund ta krijosh edhe pa e pasur fare programin tim. Mjafton të krijosh një program në të cilin të thërrasësh MessageBox (NULL, Tung!, Shih sa i Vogel jam!, MB_OK | MB_ICONINFORMATION);
Programin e emërton small.exe, e hap me anë të OllyDbg, me F7 (Step Into) hyn brenda implementimit të MessageBoxW, dhe bën Screen-Capture.

Nuk po them që nuk ke përdorur programin tim, por fare mirë edhe mund të mos e përdorje, sepse në çdo rast, ajo çka ke paraqitur nuk i përket programit tim, e për pasojë nuk ilustron që ti ke mundur të dis-asemblosh atë që kam shkruar unë.

Këshillën tënde për të kërkuar në net se si të shkruaj një disasembler, padyshim do ta ndjek ditën kur do vendos të shkruaj një disasembler, edhe pse ka pak gjasa që një gjë e tillë të ndodhë 

Gjithësesi, më duhet të pranoj se ka një evoluim në opinionin ndaj tezave të mia, nga: skemat (dhe ti bashkë me to) jeni shumë naiv, në: me siguri laboratorët e Intelit apo AMD-së duhet të kenë krijuar ndonjë disasembler më të mirë se të gjithë ata që janë në qarkullim, por për ndonjë arsye misterioze nuk duan që Bota ta marrë vesh ekzistencën e këtyre produkteve, edhe pse në këtë mënyrë i mohojnë vetes të ardhurat (dhe lavdinë) që mund të merrnin nga shitja (apo qoftë edhe vetëm reklamimi) i këtyre disasemblerave fantastiko-shkencor.

Dhe të mendosh se atë që nuk e bënë faqe të tëra me tekst, e bënë vetë 19 byte program. Epo... Softwerët: 1  Letërsia: 0.

----------


## Gabeli

Pershendetje Gabeli,

*Te lutem mos posto me informacione te tilla*.

----------


## Gabeli

> Pershendetje Gabeli,
> 
> *Te lutem mos posto me informacione te tilla*.


Informacione te tilla! Une botova zgjidhjen per sfiden e leshuar nga autori i temes. Cfare ka ketu qe nuk shkon? A mund te me japesh nje arsye pse e fshive postimin tim?!

----------


## BHGod

Gabeli,

Ne fakt arsyet kane qene disa, dhe te gjitha ne te mire te forumisteve qe marrin pjese e shikojne kete teme! Gjerat qe nuk shkonin ishin: toni i mesazhit (ne lidhje me integritetin, kujdes me rregullin nr. 10 te Rregullores se Forumit Shqiptar) dhe 'reputacioni' yt si "cracker" i disa programeve (perfshire nje program shqiptar te diskutuar edhe ne kete forum, çka mund te vinte ne rrezik sistemet e forumisteve te tjere, pasi siç mund ta kujtosh, postimi yt permbante edhe nje skede te bashkangjitur).
Nese do kishe nje kopje te postimit tend gjithçka do ishte me e lehte! Do ishe krejt i lire ta postoje ketu, qe te tjeret ta gjykonin.
Mos posto pergjigje per postimin tim, pasi do te fshihet, sepse nuk ka lidhje me temen! Nese ende nuk je i bindur nga arsyet e dhena prej meje, te lutem me kontakto me mesazhe private, ose kontakto perfaqesuesit me te larte te forumit nese kane ruajtur nje kopje te mesazhit tend.
Siç vihet re, fshiva edhe linkun qe kishte shtuar postuesi i pare.

Gjithë të mirat.

----------


## cunimartum

BHGod per mendimin tim ke bere gabim qe e ke fshire pergjigjen.

2 Arsyet e para jane fare te dobta, dhe mesa mbaj mend une postimi ishte i paster.
Per sa i perket "reputacionit" dhe postimeve te meparshme te Gabeli, postimet e tij te tjera s'kane aspak lidhje me kete dhe s'mund te gjykosh ne baze te tyre, sidomos nese as nuk denjon ta kontrollosh skedarin personalisht, "pra meqe nje here, dikur ti postove nje malware edhe kete here po poston malware" -- pa lidhje.
Per me teper qe ne kete teme po flitet per disasemblim dhe thyerje programesh te ndertuara nga po ne vete (Neritani ne kete rast) dhe po ai qe e ndertoi skemen mbrojtese e hedh kete sfide me shpresen qe dikush do harxhoj ca kohe dhe do merret seriozisht; dhe arritjet e dikujt vetem sa i ndihmojne autorit per ta forcuar skemen mbrojtese, perndryshe s'ka pse te kerkoje nga te tjeret te harxhojne kohen e tyre per ta disasembluar. Faktikisht perfitimi teorik nga puna e Gabeli eshte goxha i madh per te tjeret dhe ta hedhesh ne kosh pse nuk arrin te kuptosh qellimin e kesaj teme s'eshte e drejte.


Neritan,
Me fal qe nuk jam pergjigjur per kohe te gjate por vera ketu te ne eshte marramendese. 
Nuk e kam idene si ka arritur Gabeli ta disassembloje por te djelen qe u mundova te shkruaja nje byte-disassembler duke perdorur librarine qe kam vene me siper donte goxha kohe dhe ishte shume pune e merzitshme.
Ka mundesi te me duhet nje skeme mbrojtese me jumps ne unaligned offsets (si ajo qe ke perdorur ti me siper) per procesor ARM (iPHone). Ke ndonje info nese mund te behet ne ARM jumps ne unaligned offsets? para se te lexoj docs te instruksioneve.


Gabeli,
Arrite ta disasemblosh skemen apo thjesht luajte me hex editor derisa e thyeve ?

----------

