Hacker.journal.nr.203.Luglio.2010

Post on 15-Jul-2015

197 views 0 download

Transcript of Hacker.journal.nr.203.Luglio.2010

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 1/32

N° 203

www.hackerjournal . i t 2 E n o  P u B B l i c i t  à

s o l o  i n f o r m  a z i o n i  e   a r t i c o l i 

HACKER JOURNAL N° 203 - MENS - ANNO 10 - E 2,00

criPto

› messaggi

 al sicuro su

iphone

eventi

› hackit 0x0D:

Fight

control

B u c h i am o  F ac e B o o k 

Implemen tare 

Il “forse cerca vI…” 

dI GooGle

Programmazione

› ingegneria

Del soFtware

open source

p r o Gr ammar e  p e r  l’I p ad 

ccorso dIproGrammazIone In

quarta parte

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 2/32

laboratorio@hackerjournal.itQuesto indirizzo è stato creato

per inviare articoli, codici, spuntie idee. E’ quindi proprio una

sorta di ”incubatoredi idee”.

posta@hackerjournal.itE’ l’account creato per

l’omonima rubrica che èricomparsa nelle pagine della

rivista. A questo indirizzo dovete

inviare tutte le mail che voletevengano pubblicate su HJ.

redazione@hackerjournal.itQuesto è l’indirizzo canonico.Quello con cui potete avereun flo diretto, sempre, conla redazione, per qualsiasi

motivo che non rientri nelle dueprecedenti categorie di posta.

In qusto numro 203 abbiamo un programmaquantomai ricco ch vd in blla vidnza un

articolo ch prnd di mira l dbolzz insitnl più popolar social ntork: Facbook, già alcntro di molt polmich, nl rcnt passato, prqustioni di sicurzza privacy.Continua poi il nostro corso di C, ch rapprsntaormai una crtzza acquisita ch, dopo unaprima part torica, si sta avvnturando nimandri più squisitamnt tcnici. Ci trràcompagnia ancora pr qualch numro.La palma di articolo più stuzzicant sptta prò aqullo ddicato alla distanza di Lvnshtin, ovvroa com implmntar la nota unzion “ors

crcavi…” dl motor di ricrca Googl.Infn un assaggio di programmazion con SDK priPad. Abbiamo crato un simulator di gradimntoch, praltro, pott scaricar sul sito HJ nllaszion donload.Insomma anch in qusto numro c’è molta carnal uoco… buona lttura buon hacking a tutti.

 Altair

Sommario 

 Anno 10 - N.203

Luglio 2010 Editore (sede legale) 

 WLF Publishing S.r.l.Socio Unico Medi & Son S.r.l.

via Donatello 71 - 00196 RomaFax 063214606

Realizzazione editoriale Progetti e promozioni Srl

redazione@progettiepromozioni.com

Printing  Grafche Mazzucchelli S.p.a - Seriate (BG)

DistributoreM-DIS Distributore SPA

via Cazzaniga 2 - 20123 Milano

Hacker JournalPubblicazione quattordicinale registrata

al Tribunale di Milano il 27/10/03con il numero 601.

Una copia: 2,00 euro

Direttore ResponsabileTeresa Carsaniga

redazione@hackerjournal.it

 WLF Publishing S.r.l. - Socio Unico Medi & Son S.r.l. è titolare esclusivodi tutti i diritti di pubblicazione. Per i diritti di riproduzione, l’Editore sidichiara pienamente disponibile a regolare eventuali spettanze per quelleimmagini di cui non sia stato possibile reperire la fonte.

Gli articoli contenuti in Hacker Journal hanno scopo prettamentedivulgativo. L’Editore declina ogni responsabilità circa l’uso im-

proprio delle tecniche che vengono descritte al suo interno. L’in-vio di immagini ne autorizza implicitamente la pubblicazione anche

non della WLF Publishing S.r.l. - Socio Unico Medi & Son S.r.l.

Copyright WLF Publishing S.r.l.Tutti i contenuti sono protetti da licenza Creative Commons

 Attribuzione-Non commerciale-Non opere derivate 2.5 Italia:creativecommons.org/licenses/by-nc-nd/2.5/it

Inormativa e Consenso in materia di trattamento dei dati personali (Codice Privacy d.lgs.

196/03)

Nel vigore del d.lgs. 196/03 il Titolare del trattamento dei dati personali, ex art. 28 d.lgs.

196/03 è WLF Publishing S.r.l. - Socio Unico Medi & Son S.r.l. (di seguito anche “Società”,

e/o “WLF Publishing”), con sede in via Donatello 71 Roma. La stessa La inorma che i Suoi

dati verranno raccolti, trattati e conservati nel rispetto del decreto legislativo ora enunciato

anche per attività connesse all’azienda. La avvisiamo, inoltre, che i Suoi dati potranno essere

comunicati e/o trattati nel vigore della Legge, anche all’estero, da società e/o persone che

prestano servizi in avore della Società. In ogni momento Lei potrà chiedere la modifca,

la correzione e/o cancellazione dei Suoi dati ovvero esercitare tutti i diritti previsti dagliartt. 7 e ss. del d.lgs 196/03 mediante comunicazione scritta alla WLF Publishing S.r.l.

e/o al personale Incaricato preposto al trattamento dei dati. La lettura della presente

inormativa deve intendersi quale consenso espresso al trattamento dei dati personali.

4 NewS

8 Messaggi al sicuro su

Iphon, quasi pr gioco

10 HackIt 0x0D

Fight Control

12 La Posta di HJ

14 Buchiamo Facbook

17 Distanza di Lvnshtin

Implmntiamo il ors

crcavi di Googl

20 Programmar pr iPad

23 Inggnria dl sotar

opn sourc

36 Corso di programmazion

in C, quarta part

editoriale

attacco a

faceboook

Copertina:Daniela Festa ldfesta@libero.it

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 3/32

NeWS

 A

pprofttiamo di questaterza pagina, dedicataagli argomenti di attualità,

per trattare un tema cheorse non è strettamente legatoall’hacking ma che è certamenteconnesso con il mondodell’editoria e, quindi, tocca, inqualche modo, anche HackerJournal: il uturo della cartastampata.

O meglio il non uturo. Inatti,l’avvento sul mercato di numerosidispositivi che in qualche modo

implementano la lettura dei testidigitali, iPad e Kindle su tutti mai concorrenti si stanno acendosotto. Sembra che l’editoriavoglia convergere su questi nuovidispositivi. C’è un entusiasmocontagioso, quasi irrerenabile, peril momento assolutamente poco

congruo ai numeri reali.Condenast ha provato a realizzareuna versione speciale per iPad

della sua rivista GQ. Risultato?360 copie vendute, più o meno…Ovvero nulla.Certo siamo agli albori. C’è chiè pronto a giurare che il uturoè questo, però qualche dubbiorimane.Non è difcile credere chel’entusiasmo degli editori perquesti nuovi terminali sia anchegenerato da una situazionecontingente: le riviste vendonosempre meno e i costi di edicola,stampa e distribuzione si portanovia più del 50 per cento dei

guadagni. Rendere disponibile lapropria rivista su un dispositivoelettronico signifca annullarequesti costi, incrementare quindii guadagni (orse), sicuramenteavere dei punti di pareggio moltopiù bassi e abbordabili.Insomma l’editoria staripiegando su se stessa,preoccupandosidi spendere menoe limitare i costiaspettando segnali daluturo.E chissà che l’iPad, il

Kindle o chi per essi nonsiano, oltre che una sceltaconveniente sul breve, unasoluzione lungimirante sul lungoperiodo.Solo il tempo ci dirà chi haragione. Il rischio a parere di moltiè che nel giro di pochi anni lacara vecchia edicola diventi soloun ricordo, magari riconvertita inattività più remunerative.

Dove va a fnire

l’editoria?

yHACKER JOuRNAl 3

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 4/32

Più arresti nel digitale

NeWS

y4 HaCker Journal

I pimi qtt msi d2010 h tt gist dcis icmt dgisti di pcdimtigidizii i cti dcimiità digit i divsiPsi. e’ qt mg d

ppt s siczz diF-Sc tiv pimpt d’.nt cm hbby, it 2003 i mw è divtt v ppi bsissctt d cimii cpc di gmi pftti. Tttvi, tsmzi d mwd “psstmp” ii ttività cimi pdivsi i h ptt’st dgi ti dgittcchi. ni i csi i ci

qst ps s sttmt pcsst, stz s sttqsi mi di cd.“l zid ch si ccpdi siczz imtic s z di pizi, msg csttmt tità i mtiscpt cs didgii s cyb cim”, hdichit Mi Hyppö,rspsbi di lbti

di ricc di F-Sc.“Sim sddistti di vdch i st ctibt siti tità gidizii spim ch i cti sti cd ppsti sg di

cmbimt md dit i cimi i”.e’ d scs mz cd smp 20i di cc di adGzs, cp di bd di cimii imticicpv di sssiimpsssst di dti didci di miii di ctdi cdit d ct digdi mgzzii micTJ Mxx d ti ptivdit gi Stti uiti. Sittt d stz più

d mi pcit p cs di cimi imtic.Gzs i mmbi ds bd si s ifttii sistmi di tticzidi gisti di css diivditi ttvs cssi wi-f. e’ sttcssi istmp miiidi ct di cdit.T gi ti csi tvi d2010, cd 5 idi cc d sct

rg uit cic di rSbmim, is Jilsi, di cimii imtici dm di hc DMt.I esti, ’t dmigi di vis ap, atBi, è stt cdt

2 i 7 msi.ot 70 mmbi di bd di cimii imticidditi phishig, sstti stti i rmigzi cbzic tità ss.Csidd ch rssi è smp stt vistcm i pdis di cybcimii, i cti svippippi pticmticggiti.“I cimi i è più bsiss st d ischi”,

h ggit Hyppö.“l ctt d pt dz d’di è s qsti di tmp spim ch tizi disti cd divgsmp più cmi”.P mggiippdimti sgisvippi d stt dsiczz imtic pim pt d 2010 èpssibi vd i vid:“Mbi Ph Scity”,“Cim d Pishmt”

“Tgtd attcsd opti a”,’idiizz www.ytb.cm/FScnws.

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 5/32y

HaCker Journal 5

La nuova ricerca rilasciato da Dasient

(http://blog.dasient.com) indica che in

base al campione da loro esaminato,

1,3 milioni di annunci maligni sono

 visualizzati ogni giorno, il 59 per cento

di essi rappresenta drive-by download ,

seguito dal 41 per cento di alsi sotware

di sicurezza conosciuti anche come

scareware.

Inoltre il vettore di attacco, noto come

malvertising , è sempre più di tendenza

come una tattica scelta per i numerosi

attacchi maligni.

La ricerca mostra inoltre altri interessanti

risultati:La probabilità che un utente sia inettato

da un malvertisement è due volte

maggiore durante un week-end e la

durata media di un malvertisement è di

7,3 giorni;

Il 97% dei siti web della lista Fortune

500, una lista annuale compilata e

pubblicata dalla rivista Fortune che

classifca le 500 maggiori imprese

societarie statunitensi misurate sulla

base del loro atturato, sono ad alto

rischio di essere inettati con malware a

causa di partner esterni (quali i ornitori

di widget javascript, le reti pubblicitarie e

 / o ornitori di sotware pacchettizato).Il rischio è così alto, perché il 69%

di essi utilizza Javascript esterni per

 visualizzare porzioni dei loro siti e il 64%

di questi siti utilizza applicazioni web

obsolete. Le conclusioni della ricerca

sono anche supportate da un altro

rapporto pubblicato di recente da Google

Security Team, secondo cui il also AV

rappresenta il 50 per cento di tutti i

malware inviati tramite annunci.

MPAA“fa a ga”a aamaLa MPAA (Motion

Picture Association o

 America - Organizzazioneamericana dei produttori

cinematografci) ha chiesto,

con un documento ufciale

reso pubblico dal Comando

Centrale degli Stati Uniti e

che può essere visionato

all’indirizzo: http://

torrentreak.com/static/

pirated-movies-in-iraq.PDF,

di prendere provvedimenti

nei conronti dei soldati

impegnati in Iraq che,

per qualsiasi ragione, per

 vedere programmi e prodotti

televisivi e cinematografci,utilizzino DVD contraatti

o fle reperiti a mezzo

BitTorrent.

Evidentemente la scelta di

utilizzare materiale piratato

è, in questo caso, dovuta

a situazioni contingenti,

come la difcoltà di

approvvigionamento di

materiale originale in unterritorio devastato dalla

guerra.

Il Comando Centrale

degli Stati Uniti ha inoltre

sottolineato come non sia

possibile negare l’accesso

a determinati mercati alla

truppe, si parla soprattutto

di DVD contraatti, e

neanche proibire tale

 vendita, dal momento che è

regolata dalle leggi locali in

materia.

Inoltre, le orze armate

aermano che il downloadillegale è in qualche modo

una conseguenza delle

carenze dell’industria

cinematografca, incapace

di rendere accessibili le

 vie di distribuzione legali

all’estero.

1,3 Milioni di Annunci dAnnosivisti ogni giorno

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 6/32

NeWS

Mca hpstt i“rpt Mcas micc:pim timst

2010”, ch vidzi cm wm uSB ppsti ipicip mw ivmdi. I td d spmmst ch gi gmti

tiizzti dgi spmm -mi vi mtissimd zi zi, ddv spm ch pmvdipmi scstici i ivd Ci d t ziisitich è i mt. ltizi gt i tmti ti ivti vti d2010 s stti i picipigmti p i istti“dgti” d icch swb, mt i sv csd gi Stti uiti spit mggi pt dgi

url mvi. l miccsi dispsitivi di stgpttii si s dimstt picip micci mw.l izii atr si spsizit pim tzpst dt ’mpi disi dzi di dispsitiviimvibii, picipmtdiv uSB. u si diTj psswd-stig

cmpt cssifc dipimi ciq. T qsti sicsi dwd gici,pgmmi idsidti gichi stw chccg dti sttistici imd im. a dizdgi stdi pssti, disi di qst miccsi è ivt mg i

ttt i md. Mt itssi d spm imgstbii, gi gmti tiizzti’ggtt d -mivi tvmt dzi zi. u didti picipi msi dqst timst è qch vd Ci, C dSd Vitm spit mggi qtità di spmgt i dipmi scstici,ch pmv ’cqistdi dcmti ctttip cmpv ’idità

icpi dtmitiimpighi. Sigp, Hgkg i Gipp vttssi cczii di spmgt i mssggi di tifcd stt di csgdi mssggi idicd pssibi pbm gt ziità di ftig

pvtiv d pst.Mca h it ivt chTidi, rmi, Fiippi,Idi, Idsi, Cmbi,Ci Bsi vt qtità più vtdi izii mw dispm. Qst zii hspimtt sigifctivcscit di Itt gi

timi ciq i mcdi cspvzz tiv siczz. Gi ggssistt i picipi vtidi cc p “dg” icch ttt s Itt.I tmti di Hiti d Cis i cim ’c (n. 1 n. 2, ispttivmt). I itid t d pt di Tyt,’app iPd sttimd fi nCaa dcmpit ivsiti dibst sttits sg t. Sttd tcic

dmit mipzi dimti di icc, i cimiiimtici cti dtiizz itich gicdi cssifczi d pgip stt i tmii diicc più qti gidi tfc s siti wb mvi.C b i 98%, gi Sttiuiti ist spit mggi pt di vi urlmvi pim timstd 2010. l’m qtitàdi vi url mvi csd gi Stti uiti è dvt

’biczi di mti sviziWb 2.0 divsi, mggipt di qi vg itid biczii gi Sttiuiti. P qt igdi imt 2%, Ci h spitti i 61% mt iCd h spitti i 34%.

y6 HaCker Journal

Avaza wm usB

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 7/32

y

Secondo uno studio realizzato da CAESS (Center or Automotive

Embedded Systems Security) e presentata ad Oakland durante il

simposio IEEE sulla sicurezza e la privacy a cui hanno partecipato

i ricercatori delle Università statunitensi di Washington e San

Diego, l’elettronica sempre più sofsticata delle auto ne metterebbe

a rischio la sicurezza. Secondo questo studio molte automobili

possono essere manomesse connettendo un computer alla porta

per la diagnosi elettronica (OBD) e agendo in remoto da un altroPC. Le modifche indotte con l’intervento del Pc possono avere

conseguenze disastrose: impossibilità di usare i reni, disabilitati

tramite la centralina dell’ABS, spegnimento del motore mentre si

sta guidando, blocco delle porte, errate indicazioni sulla velocità

e malunzionamento dei dispositivi relativi alla sicurezza dell’auto.

L’attacco, inoltre, può arrivare per via telematica anche attraverso

la CAN, la rete che collega tutti i dispositivi elettronici dell’auto. Lo

studio può essere scaricato all’indirizzo:

http://www.autosec.org/pubs/cars-oakland2010.pd

yHaCker Journal 7

l’hAcker entrA in Auto

Secondo il rapporto pubblicatoda Kaspersky Lab ‘Inormation

Security Threats in the First

Quarter o 2010’, i prodotti

 Adobe sono diventati il primo

obiettivo per hacker e virus

writer in tutto il mondo grazie alla

loro vasta diusione e alle loro

caratteristiche multi-piattaorma.

Gli utenti dei prodotti Adobe

sono spesso ignari delle minacce

potenziali in cui potrebbero

incorrere aprendo un fle PDF di

origine sconosciuta. Tra le molte

 varietà di exploit che sono state

rilevate, la amiglia Exploit.Win32.Pdka è risultata essere quella più

diusa con una percentuale del

42,97%. Questo exploit srutta le

 vulnerabilità di Adobe Reader e

 Adobe Acrobat.

Sommando Exploit.Win32.

Pdka ed Exploit.Win32.Pidie,

due amiglie di exploit che

colpiscono requentemente i

prodotti Adobe, si raggiunge una

percentuale totale del 47,5%che rappresenta quasi la metà

di tutti gli exploit rilevati. Questi

exploit sono documenti PDF che

contengono codici Javascript che,

ad insaputa dell’utente, scaricano

e lanciano altre applicazioni

malware direttamente da Internet.

Il rapporto evidenzia inoltre che

molti utenti di prodotti Adobe

non hanno ancora installato le

patch progettate per rimuovere

le vulnerabilità del sotware

rimanendo così esposti a

potenziali attacchi. Tra le prime

dieci vulnerabilità dei sotware piùdiusi rilevate sui computer degli

utenti nei primi tre mesi del 2010,

tre sono stati trovati in prodotti

 Adobe, sei sono stati trovati nei

prodotti Microsot, ed uno è stato

trovato in un prodotto Sun. Le

tre vulnerabilità che colpiscono

i programmi Adobe sono state

trovate nel 23,37%, 17,87% e

15,27% dei computer esaminati,

si tratta di vulnerabilità che

permettono agli hacker di avere il

pieno controllo su un sistema in

modalità remota. Per rimuovere

una delle vulnerabilità nei prodotti

 Adobe, diventata di dominio

pubblico da oltre tre anni, è stata

creata una patch che è rimasta

disponibile per lungo tempo, e ciò

a dimostrazione che molti utenticontinuano a non aggiornare il

loro sotware. Per risolvere questo

problema, il 13 aprile Adobe ha

lanciato un servizio automatico di

aggiornamento che viene eseguito

in background. Gli sviluppatori

sperano che ciò contribuirà a

ridurre il numero di applicazioni

sprovviste di patch, le più ambite

dai i criminali inormatici.

AdoBe sotto tiro

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 8/32y

8 HaCker Journal

chissà quale livello di sicurezza,e non possiamo certo portarciappresso un bel disco cirante,ma è altrettanto vero che unsotware acile, pronto a orire

una ciratura “mordi e uggi”, asempre comodo.

sicurezza a

pochi centesimi

Secret Crypto Wonder Badge siscarica e installa dall’app store,elargendo un modesto obolodi 0,79 euro. Un costo risibile,che orse non dà giustizia allepotenzialità dell’applicazione.Questa, una volta avviata, ci ascegliere quale dei sistemi di

ciratura utilizzare, tra Alpha,

Privacy dei nostri dati? Oh,ci sono molti sistemi perproteggerla, anche se latotale sicurezza non è cosadi questo mondo (e noi lo

sappiamo bene…). Senzacontare che si deve sempretrovare un buon compromessocon la praticità. Prendiamoun comune messaggio ditesto, per esempio: esistonoalgoritmi e sotware in gradodi crittograarlo in modo moltoeiciente, ma di rado hanno lavelocità e l’intuitività necessariaper arlo in tutte le situazioni. Ilteleono ne è un acile esempio:che tragedia crittograare imessaggini scritti in retta euria!

Tuttavia, se utilizziamo uniPhone, una discreta soluzioneviene da Secret Crypto WonderBadge, orribile nome di una“app” altrimenti apprezzabile.Con la scusa di un’interacciagiocosa, questo sotwarereplica in buona sostanza il“disco cirante” di Leon Battista Alberti. Un momento: di cosasi tratta? Conosciuto comeil primo sistema di ciraturapolialabetica, il disco cirantesu descritto nel “De Ciris”attorno al 1467.

Questo dispositivo è compostoda due dischi, uno che riportale lettere dell’alabeto, enumeri, nell’ordine corretto, el’altro con i caratteri mescolatialla rinusa. In questo modoè acile ar corrispondere unalettera “sbagliata” a quellacorretta di una parola. Ora, èben vero che non si tratta diun sistema crittograico con

riptouna app

he oren sistema

rittografoold-style,

ma efientee pre

divertente

 Riccardo Meggiato redazione@hackerjournal.it

MESSAGGI AL SICUROSU IPHONE, QUASI PER GIOCO

 Il Disco

Cirante rivive

 in chiave

digitale, grazie

 ad una app per 

 iPod Touch

e iPhone che

 lo srutta a

dovere.

crittografa/aile

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 9/32

più esperti, a volte non vienein mente che una sequenzasconclusionata di numeripuò nascondere, in realtà, unmessaggio…

crittografia

via email

Una volta eettuata la codifcadel testo, la utilizziamodirettamente dove necessarioo, volendo, la inviamo al nostrocontatto via e-mail. Per arlo,basta toccare direttamentel’icona a orma di e-mail eprocedere come indicato.Il destinatario ottiene cosìil messaggio cirato e, per

eettuare la decodifca, gliè sufciente utilizzare unacopia di Secret Crypto WonderBadge, sruttando i dati cheaccompagnano la missivaelettronica. Decodifcare unmessaggio con questo sotware,del resto, è un gioco da ragazzi:dopo aver toccato il simbolo dellucchetto, è sufciente toccarela voce Decode e inserire la

sequenza di numeri, toccandoinfne su Engage. Siamo benconsapevoli che il livello disicurezza oerto da questoprogramma per iPhone non è

certo comparabile con sistemicrittografci avanzati, tuttaviaesistono inormazioni per le qualiè più che sufciente. Insomma,non avremo sempre a che arecon progetti bellici top-secret oguerre cibernetiche no? Scherzia parte, calcoli alla mano, SecretCrypto Wonder Badge, con isuoi tre set di corrispondenze,consente la bellezza di 2700diverse combinazioni: davveroniente male.Nel caso, per una appdall’interaccia più seriosa, e

con una tecnologia un flo piùefciente, ci possiamo rivolgerea CryptoMail. Sviluppato dallanota ReynoldTech, è un sotwareche, come il nome a intuire, èdedicato alla posta elettronica,anche se la macchinositàdei comandi ne limita un po’l’immediatezza. Del resto èdisponibile gratuitamente, quindiprovarlo non costa davvero nulla.

Bravo e Charlie. Fatto questo,eccoci davanti al mitico cirario,in versione iPhone.Giriamo i dischi selezionandola corrispondenza desiderata

tra lettere e numeri e, per inire,tocchiamo il lucchetto centrale. A questo punto tocchiamo, inbasso, su Encode. Si apre unainestra di testo dove scrivereil messaggio da cirare. Perrendere ancora più complessaun’eventuale decirazione daparte di estranei, e come delresto avviene con alcuni deipiù noti sistemi crittograici,le parole non possono essereseparate dal classico “spazio”. Al suo posto, comunque, c’èun più che valido “trattino”.

Una volta inserite le paroledesiderate, tocchiamo in basso,su Engage, ed ecco ottenutal’agognata stringa crittograata.

Una serie di numeri che, purnon mettendoci al riparo daglicritto-analisti più scaati,ore una discreta protezionecontro occhi troppo curiosi.Senza contare che, anche ai

yHaCker Journal 9

 Nessuno spazio, in nome

della massima sicurezza! Il 

trattino, inatti, garantisce una

 stringa continua di numeri, più

difcile da decirare.

Una volta impostata la

corrispondenza tra i due

dischi, si crea un vero e

 proprio sistema crittografco

 personalizzato.

Quale oscuro messaggio è

 nascosto in questa sequenza

di numeri? Scoprirlo è molto

acile e veloce, se si ha la

 giusta chiave crittografca!

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 10/32

eventi

y10 Hacker Journal

di penelope.di.pixel  redazione@hackerjournal.it

HackIt 0x0D

FIgHt control

l

’it dist Hmtig sisvgà qst’ rm i 2-3-4 gi.chm di sgi

svipp di qst vt, hi si dii i di vit it disi/divisiizzt ib di szh stit ptih sii,ti tgih pttiidi gi piti dimtv.

iL teMA

Fight ct: mpd m d t

tmp p tv ivt stmti spzi disistz. D pbmtihsqisitmt tgihm pti, p2p, pivy,sizz, t p HackIT0X0D sigif h itgsis tmi m s, v,sm, si tw piv p di ib, q fi pdttiv. I tm è d tt m smp.

i Luoghi

St p s sti

ttistih isih, sà icSa l T spit tgii piti d mtig: qti di cs D’ Pzzit Pt Mmm, Tti Mts, vhivi imms vd dvsà pssibi sti td mpggi... ttsi.l t, qt p, è giàpt.

 ah s p Hmtig sbb pbm:i t sii, mttdisim vi mptz,

isttt s stt td z.Iti iii dippzi si s ivsvti i cSo Sti, ’ss.Fsb i Ft Psti,itid ggimtpit, sti psidi ttivism piti si msptttt ps h isimdist v p dp vit ’vt.

WArM up

cm p ’dizi 2009, hqst’ imt mwm p: si di iti dippdimt h stis tpp di vviimt mtig, ’id di pisi ivg i titi. F gi

ackmgL’appuamo p l’omadcal hackmg èfssato quest’anno per il 2Luglo a roma

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 11/32y

Hacker Journal 11

ttivti di wm p, i Bgslbh f pi mggigizz Sti dibttiti siDrM, tt di dti i t svizitgstiti, P2P, tiizz spvd f shig si tw.l tà di chimi, Fisi Mtmti d Spiz, hspit iti s stw pbbizii i mbit sitif,fsf mit’ stwib, is tshw. l t

nix, i s smii s timsh Fsb.e ofi nti h FtPsti si imt i bti di bisti DYI tt di ssi vd i di pit fii. P tsiggiti s pgmm: http://it.hmtig.g

iL pre

hAckMeeting

Sbt 15 mggi si svg if Fiz i p-hmtig,gdsi D It Y Tsh: t gii ddit t diiggi wshp, iti pstzii, i i stttit it“W wi sviv?”.u st piti pis dv tgi it tt mbiti,gigi gdig, bs m 0,t iit t i vbb ptt sgi mgi.

 Hackmeeting si 

 svolgerà quest’anno a

 Roma il 2-3-4 luglio.

Si tratta di un evento

ormai decennale che

 guida il visitatore

 all’interno dei temi 

della diffusione/ 

condivisione orizzontale

e libera conoscenza.

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 12/32

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 13/32

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 14/32

g/me

y14 Hacker Journal

di Massimiliano Brasile redazione@hackerjournal.it

BuchiamoFaceBook

ttg

T f Feb?

E me be

etw

Diciamocelo: nolenti

o volenti i socialnetwork sono unsuccesso planetarioche prescinde dalla

qualità e quantità di cose scritteuori e dentro. Facebook (FB) èorse il enomeno più clamoroso,per la crescita continua di personeconnesse da tutto il mondo e ienomeni di aggregazione cheraccolgono individui fsicamente eculturalmente distanti.Ma FB è pur sempreun’applicazione sotware e cometale soggetta a bug, alle di

sicurezza e anomalie. Vediamo cosasi rischia quindi a utilizzarlo e acomunicare al social network oto einormazioni personali. 

hack di un inviTo

Può capitare che se usiamo datempo internet abbiamo diversiindirizzi e-mail che nel tempo

abbiamo dato ad amici, colleghi,

parenti e così via e che quindinon tutti si siano sincronizzati conl’ultimo account che stiamo usandocome ufciale, ad esempio suGmail. Disgrazia vuole che qualcunocon cui desideriamo assolutamentediventare amici su FB ci inviil’invito proprio su un accountche vorremmo chiudere, ma nonpossiamo. Potremmo provaread aggiungere il nostro amico alnostro proflo FB cercandone nome,cognome e-mail. Ma potremmoanche ottenere centinaia di risultati,o nessuno perché magari ha scelto

uno pseudonimo e non i dati reali.Perdiamo quindi la possibilità diagganciarlo al nostro network dovesiamo registrati con un indirizzodiverso? Per nulla, basta un minimodi hacking.L’URL che ci ha inviato FB viae-mail ha un ormato simile aquesto:http://www.acebook.com/p.php?i=XXXXXXXXX&k=YYYYYYYYYY&r&v=2

Dove XXXXXXXXX rappresenta

l’ID su FB dell’utente che ciha contattato. Con questainormazione possiamo raggiungeredirettamente il suo proflo su FBsostituendolo all’indirizzo sottohttp://www.acebook.com/profle.php?id=XXXXXXXXXUna volta aperto, clicchiamo su“Add as Friend” e dopo essere statiaccettati dal nostro amico possiamocestinare il vecchio invito. Laprotezione è eettivamente debole,trasmettendo all’esterno del socialnetwork un identifcativo privato.Restano tuttavia le diese interne

basate sull’autenticazione dei dueutenti coinvolti. 

crack dElla

password

Qualcuno si aspetterà di venirea sapere prima o poi che ci siauna grave alla di sicurezza omagari grazie a una mano data

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 15/32y

Hacker Journal 15

da Microsot, siano state lasciate

delle vulnerabilità intrinsecheche permettono di accedereliberamente agli account di FB.Invece senza troppe speculazioni,è stato realizzato un piccolo toolscritto in Java che a il suo doverealla vecchia maniera, con un brute-orce.Può utilizzare vocabolari di parolegià pronte ed è gratuito. Si chiamaFacebooz (http://acebooz.goldeye.ino) e gli occorre solamente unJava Runtime-Environment perunzionare localmente. Si inseriscel’e-mail della vittima, si carica il

dizionario che si vuole utilizzaree lui parte, incurante delle pausegenerate dalla controensiva di FBche allungheranno i tempi, ma si sache la pazienza è la virtù dei orti!Questo per ricordare che unapassword non è mai troppocomplicata! Ed è bene usare anchei caratteri più strani creando paroleo rasi senza senso.

conTrollo

di un accounT

Esistono poi metodi più rainatiper sconvolgere la tranquillità diun utente FB, che basano l’attaccosui cookie che sono generati manmano che utilizziamo il socialnetwork per prendere contattocon gli altri utenti. In pratica puòessere realizzato un vero sniingdi credenziali d’accesso da remotobasandoci sulle inormazioniche FB ci permette di otteneresulla vittima. Il risultato inale

può essere quello di prendereil controllo di un account su FB

senza conoscere la password di

accesso e senza che la vittima sene accorga.Per avere i cookie ogni metodo puòandare bene: sniando il traico, XSS, social engineering, ARPPoison-Sniing. Basta loggarsi inFB con il proprio account e sniarei propri cookie o raccoglierne dinuovi man mano che entriamo incontatto con l’obiettivo.

 Alla ine avremo raccolto i datinecessari da dare in pasto aun tool abbastanza potentechiamato FBController (http:// 

my.opera.com/quakerdoomer/ blog/bcontroller-v3-0-acebook-

 FBController 

 somiglia

 molto ai 

tool dei 

 black-hat,

 ma l’autore

 precisa che

 non viene

eettuato

 alcun crack 

dell’account.

 Passando

un fle che

contiene i cookie

 FBController 

 riesce a serrare

 i suoi attacchi 

 mirati.

Sempliceed efcace,

 Facebooz utilizza

 il meccanismo

di errore di FB

 per tentare più

volte di accedere

 all’account;

 l’utilizzo dei 

dizionari permette

di tarare l’attacco

 sulla vittima.

 In questo esempio viene mostrato come è possibile

 avviare una chat al posto della vittima.

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 16/32y

16 Hacker Journal

control-utility-version-3-0).Tramite questo strumento èpossibile prendere il controllo diqualunque account ad esempioper controllarne la lista degliamici online o avviare unaconversazione come ossimoquell’utente e soprattutto inviare

e ricevere messaggi al suo posto.

E’ possibile vedere la cronologiadelle conversazioni passatedell’utente vittima con I suoiamici a prescindere cheessi siano online o oline,eettuare “Poke” ai suoi amicie modiicare i parametri relativialla Privacy.Nella versione 3.0 di FBControllerviene poi inserito il Facebook

Nexus Explorer (attualmente inbeta), che unzionando come unmotore di ricerca, permette diindividuare utenti di FB a partiredalle liste di amici, restituendoil numero di salti necessari araggiungere gli utenti trovati. InFB esiste una unzionalità simile

chiamata “Mutual riend” cheviene però limitata a un solosalto, mentre con Nexus non cisono limiti (nella beta attuale illimite è temporaneamente a unocomunque).

Il unzionamento è moltosemplice: basta deinire l’IDdi partenza e un ID obiettivo,oltre a indicare la proonditàdella ricerca che si intende

raggiungere. Per ogni nuovo IDraggiunto vengono estratte leliste di amici e possono partirenuove ricerche in modo ricorsivo.Questo quindi negando diatto il controllo di FB sullerelazioni, la chiave centraledel unzionamento dei socialnetwork.

conclusioni

Questa piccola panoramicavoleva soltanto mostrare alcunedelle debolezze inevitabili di unsocial network come FB.

E ricordando che nel campo degliOS, il progressivo aermarsi diWindows come sistema desktopè coinciso con l’aumentoesponenziale di virus e attacchidiretti verso questa piattaorma,assisteremo molto presto alpropagarsi di minacce serie

che unzionano grazie alle APIdei social network e riesconoa inettare molte più vittime,spesso poco esperte e quindi piùvulnerabili, in brevissimo tempo.

 Agli amministratori di retel’arduo compito di ar conciliareinormazione e prevenzione degliutenti per i quali si è responsabili. Alle riviste come la nostra quelladi suonare campanelli di allarme.

 In questo esempio viene mostrato come sia possibile

 alterare i settaggi scelti dalla vittima in merito alla

 protezione della privacy 

 Nexus è un plugin molto efciente che riesce a

 ricostruire la rete di connessioni che potrebbero

 legarci a un utente veramente distante da noi.

g/me

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 17/32

Ir/mi

DistanzaDi Levenshteinimplmmo l for

crc d Googl

Guido Camerlingo AKA Guizwww.guiz.it/

yHacker Journal 17

Il “orse cercavi” di Google è unaunzionalità della ricerca moltocomoda nel caso di “errori” dibattitura o semplice dubbio. Vediamo come riprodurla per le

ricerche dei nostri siti. L’algoritmo diricerca della parola ipoteticamentecorretta si basa sulla distanza diLevenshtein anche nota come ‘EditDistance’.

La dIstanza dILevenshteIn

La distanza di Levenshtein è il nume-ro di modifche elementari necessarieper trasormare una stringa A in B.Le modifche sono:Sostituzione di un carattereCancellazione di un carattere Aggiunta di un carattereMettiamo caso che nella nostra ricer-ca scrivessimo erroneamente linxu.Per trasormare “linxu” in “linux”

sono necessarie n modifche. Que-sta n è la distanza di Levenshtein.

La distanza quindi saràLevenshtein(‘linxu’,’linux’)Minore è il numero che esprime que-sta distanza maggiore sarà l’attinen-za tra le parole.Per ar unzionare il tutto abbiamobisogno di un enorme dizionarioitaliano: ne ho estrapolato uno ab-bastanza completo eseguendo un‘merge’ di diversi dizionari.Il problema è che dovremmo esegui-

re il test per ogni parola presente neldizionario. Il che diventerebbe moltopesante poiché, avendo circa 145000parole, ci sarebbero 145000 distanzeda calcolare.La soluzione consiste nell’eettuareun primo fltro nella selezione delleparole; quindi utilizzare un database(nel nostro caso MySQL) per estrarresolo le parole che hanno una lun-ghezza pari alla parola cercata ± unvalore numerico a nostro piacimento,

per esempio 1.Quindi estrapoleremo dal database- nel caso di linxu = 5 char (caratteri)- tutte le parole che hanno lunghezzadi 4,5,6 e le conronteremo con ladistanza di Levenshtein.Per velocizzare ulteriormente l’estra-zione dal dizionario indicizziamo icampi “parola” e “lunghezza parola”.

Il nostro

dIzIonarIo

Il nostro dizionario è composto da143770 parole. I campi del databasesono organizzati così:N_REC_ID - Progressivo del recordC_PAROLA - ParolaN_CHRLEN – Intero che rappresentala lunghezza della parolaE’ disponibile un dump del databasecon le 143770 parole al seguenteindirizzo ( Oltre al SQL è in CSV,TXTe XLS):

L’lgrimi ricrcll prlipicmcrr ib lli iLi,im cmfi.

ir

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 18/32y

18 Hacker Journal

http://www.guido8975.it/index.

php?ctg=6&id=67

Atto pratico

Questo script si basa su 3 fle:con.phpSolito fle di confgurazione e con-nessione al databasericerca.phpFile della ricercaproc.phpFile dell’algoritmo

File conf.php <?php

$server=”localhost”;

$user_n=”root”;$password=”password”;$db_name=”dizionario”;$connessione = mysql_

connect($server, $user_n,$password)

or die(“Connessione nonriuscita: “ . mysql_er-ror());

mysql_select_db($db_name, $connessione)

or die (“Errore nellaselezione del database.”);?>

File ricerca.phpLa parola è inserita,in questa pa-gina a scopo illustrativo in unavariabile $rRic a cui possiamoassegnare invece di ‘linxu’ i datiprovenienti da un POST con $_POST[‘nomecampopost’].<?php

include ‘proc.php’;$rRic = trim(‘linxu’);if(!empty($rRic)) {$rRicRes = “”;

$rRicArr = explode(“

“, $rRic);foreach ($rRicArr as

$j) {$rRicRes .=

LevWord($j).” “;}$rRicRes = substr_

replace($rRicRes ,””,-1);}if($rRicRes <> $rRic){

echo “Forse cercavi: “.$rRi-cRes;}

//Ricerca vostro sito//Qui aggiungerete la

 parte di codice per effet-

tuare la ricerca nel vostrosito.?>

File proc.php

Qui è presente la unzione che calco-la la distanza di Levenshtein. Modi-fcando la variabile $rSrcDis, che dideault è a 1, possiamo aumentare lospettro di ricerca della parola nel db.Maggiore è il numero maggiore saràlo spettro di ricerca.<?phpfunctionLevWord($SearchPostWord){

include ‘conf.php’;$rSrcDis = ‘1’;$SearchPostWordLen =

strlen($SearchPostWord);$query_rch = “SELECT *

FROM italiano WHERE N_CHRLEN in (“.($SearchPostWordLen$rSrcDis).”,”.$SearchPostWordLen.”,”.($SearchPostWordLen+$rSrcDis).”) “;

$result_rch = mysql_query($query_rch, $connes-

sione);

$rWordLevDst = -1; while($row_rch = mysql_

fetch_array($result_rch)){$rLevDst = leve

nshtein(strtolower($SearchPostWord), strtolower($row_rch[‘C_PAROLA’]));

if($rLevDst ==0) {

$rWord =$row_rch[‘C_PAROLA’];

$rWordLevDst= 0;

break;}

elseif($rWordLevDst < 0 ||$rLevDst <= $rWordLevDst) {

$rWord =$row_rch[‘C_PAROLA’];

$rWordLevDst= $rLevDst;

}}if(!empty($rLevDst)){

return $rWord;}else{ return$SearchPostWord;}

 mysql_close();}?>

ConCLusIone

L’esempio completo è disponibile sulsito http://www.guido8975.it/index.php?ctg=6&id=67 .Dove sono dispo-nibili sorgenti e dump del database.I sorgenti scaricabili sono anchecommentati. Un esempio del unzio-namento è implementato in http:// www.geek-blog.it/ nella ricerca.

ir/mi

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 19/32

CYBERENIGMA HACKER JOURNAL 204

Diciamoci la verità, la crittograa ci ha un po’ stuati. Sarebbe il caso di divertirci con qualcosa di nuovo.

Durante le cinque parti nora pubblicate del corso di programmazione in C abbiamo dato alcune denizioni relative ai rischi

connessi all’utilizzo di determinate metodologie di sviluppo dei nostro sotware in C.

Per ogni argomento analizzato abbiamo poi corredato la spiegazione con alcuni spezzoni di codice esemplicativo. Obiettivo

del Cyber Enigma di questo numero è pertanto lavorare con i sorgenti oerti in tutte le parti del Corso nora pubblicate.

LA SFIDA:

Newbie: Individuare il codice e per ogni blocco vulnerabile individuato spiegare la problematica.

Mid: Correggere il codice vulnerabile acendo uso delle nozioni apprese durante la lettura del Corso.

Esperti: Scrivere almeno un exploit capace di sruttare eventuali vulnerabilità presenti nel codice presentato in tutte le parti

nora pubblicate del Corso.

Guru: Realizzare un exploit per ogni singolo sorgente vulnerabile pubblicato.

Inviate tutto a cyberenigma@hackerjournal.it specicando come oggetto della mail il livello(newbie/mid/esperti) ed il numero della rivista del cyberenigma risolto. I migliori saranno

pubblicati in questa pagina e sul sito www.hackerjournal.it!

SOLUZIONE CYBER ENIGMA HJ 203

La data di nostro interesse in ormato GG/ 

MM era ricavabile a partire dal numero della

rivista (203), da cui ottenevamo 20 Marzo che,

sommando 10 giorni, diveniva 30 Marzo.

Per l’anno andavano mosse alcune

considerazioni relative ai suggerimenti indicati,

vediamoli uno per uno:La data dell’evento di nostro interesse (giorno,

mese ed anno) è ben più che in evidenza in

questo numero.

La data in ormato GG/MM era, come visto,

riconducibile al numero della rivista. All’anno ci

arriviamo tra poco

Dalla luna alle stelle sono sempre presenti e

prime in tutto, malgrado non acciano la dieta

sono in peretto peso orma. Meglio non arle

arrabbiare che diventano di uoco e se in cattiva

compagnia anche assassine!

Con questo suggerimento ci rierivamo alle

molecole di idrogeno (H), primo elementochimico della tavola degli elementi, il più

abbondante e leggero nell’universo ed

altamente inammabile.

Ma noi siamo ortunati, in questo caso sono

tenute per mano dalla chiave della vita,

ssandosi l’un l’altra come dinanzi uno specchio

insieme ad un amico che spesso è talmente

generoso da regalare a tutti diamanti.

Questo ci aceva intuire che l’elemento di nostrointeresse oltre che idrogeno dovesse contenere

anche Carbonio (C) e che la congurazione

molecolare dovesse essere simmetrica e

separata dall’ossigeno.

Un’esigenza siologica di ogni animale (uomo

compreso) rappresenta una buona chiave di

lettura per questo Cyber Enigma.

Il sonno!

L’oggetto di discussione ormai è da tempo in

disuso.

 A questo punto una ricerca su Wikipedia con

chiave “30 Marzo” con gli elementi appena

evidenziati dai suggerimenti ci doveva ar

rifettere su questo evento:

1842 - L’anestesia attraverso l’uso dell’etere

viene usata per la prima volta in una operazione

chirurgica dal dottor Craword Long (cit.

Wikipedia).

L’etere dietilico come anestetico è ormai in

disuso da un bel po’... ma osserviamo la sua

ormula: CH3-CH2-O-CH2-CH3.

Notate nulla ? Congurazione simmetrica e

molecole di idrogeno in coppia con il Carbonio.Prendiamo quindi in considerazione il numero di

queste, l’ossigeno come separatore (eliminando

quindi le O dal testo crittato) e scriviamo la

chiave come: 3223.

 A questo punto consideriamo la stringa crittata

e la relativa chiave ed applichiamo quindi una

traslazione di -n caratteri:

F G T Y H N N R Q Q P D Q G U W H V K C C C V R

3 2 2 3 3 2 2 3 3 2 2 3 3 2 2 3 3 2 2 3 3 2 2 3

C E R V E L L O N O N A N E S T E T I Z Z A T O

Complimenti a Luca M. da Roma, l’unico ad

aver risolto questo Cyber Enigma alla data distampa del presente numero (5 Luglio 2010).

Cosa aspetti ad iscriverti sul nostro orum ?

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 20/32

Programmazione/medio

y20 Hacker Journal

di Massimiliano Rinaldi  redazione@hackerjournal.it

Con l’avvento dell’iPad Apple ha dato una

rispolverata al suo strumento di sviluppo,l’SDK (Sotware development kit) giuntoalla versione (stabile) 3.2.2 per Snow Leo-pard.

La versione 3.2.2 può essere scaricata all’indirizzohttp://developer.apple.com/iphone/index.action biso-gna però sottoscrivere il programma di sviluppo checosta 99 dollari all’anno e che consente di compilare iprogrammi per distribuirli e venderli sull’Apple Store.L’idea di sviluppare dei nuovi progetti per iPad potrebberisultare in questo momento particolarmente convenienteperché lo store italia ( e anche quello statunitense del

resto) non è così aollato di programmi come lo è lo store

dedicato all’iPhone e quindi le possibilità di arsi notare evendere aumentano sensibilmente.In questo articolo ad esempio vedremo come srutta-re una delle unzioni più spettacolari dell’iPad, ovverol’accelerometro che permette il riconoscimento dell’orien-tamento dell’iPad lungo gli assi X, Y, Z, ovvero in unambiente tridimensionale, tanto caro agli sviluppatori 3D,in cui muoversi liberamente.L’accelerometro può essere utilizzato convenientementenei videogiochi per spostare gli oggetti rilevando l’incli-nazione del dispositivo. Tipico l’utilizzo come volante neigiochi di guida. Orientandolo a destra o sinistra si può

p il tblt appl è stt pc lctsul ct c ss uv stut svlupp. V c utll.

ProgrammarePer iPad

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 21/32y

Hacker Journal 21

programmare un’auto afnché sterzi a destra o a sinistraseguendo proprio l’inclinazione dell’iPad.

Al lAvoro

Per il nostro esempio non partiremo da un progetto cosìcomplesso come un videogioco ci limiteremo a programmareuna sorta di misuratore del gradimento dei HJ.Si tratta prevalentemente di un gioco, vogliamo inattiprogrammare una mini applicazione che, scuotendo l’iPad,visualizzi un numero random compreso tra 1 e 100, natural-mente il tutto condito da un grafca “Hacker Journal”.Prima di tutto lanciamo XCode (è l’applicazione con l’icona aorma di martello che sormonta una A blu stilizzata) selezio-niamo il template che a al caso nostro:File>New Project>View-based Application

Si tratta di una semplice applicazione che può essere utilizza-ta con classi del tipo viewController e che personalizzeremoalla “bisogna”.

Chiamiamo il nostro progetto con un nome particolarmenteevocativo “Scuoti” per ortuna non si tratta di uno dei tantisimulatori di peti già in commercio su Apple Store altrimenti,seguendo la stessa vena ispiratrice, il nome sarebbe statomolto più greve.In questo modo verrà creata una cartella Scuoti al cui internotrovano spazio tutti gli elementi base da personalizzare.

Progetto “scuoti”

Lanciamo l’eseguibile Scuoti.xcodeproj che si trova all’internodella cartellina (icona blu con la A stilizzata). All’interno della fnestra che si è aperta, diamo un’occhiata,sulla sinistra nella colonna Groups e Files, agli elementi pre-senti, in particolare alle classi all’interno della cartella Classes.Il primo fle che andremo a modifcare èScuotiViewController.h, scriviamo il seguente codice modif-cando in parte quello già esistente:#pt <UiKt/UiKt.h>

@ntfc ScutVwCntll : UiVwCn-tll <Uiaccltdlt> {

iBoutlt UiLbl *lblNuCsul;

}

@n

Passiamo quindi al fle ScuotiViewController.m, dove aggiun-geremo, al codice esistente, queste ulteriori righe di codice:- (v)vwdL {

[sup vwdL];Uiacclt *cclt =

[Uiacclt shacclt];[cclt stdlt:slf];[cclt stUptintvl:(1.0f

/10.0f)];

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 22/32y

22 Hacker Journal

Programmazione/medio

}- (v) cclt:(Uiacclt *)cclt acclt:(Uiaccltn*)ccltn{

nt nuCsul;nuCsul = n() % 100 + 1;f (ccltn.x > 1.5 ||

ccltn.y > 1.5 || ccltn.z >

1.5) {[lblNuCsul

stTxt:[NSStn stnWthFt:@”%”,nuCsul]];

}}

PersonAlizzAzione

del codice

Come potete notare dal codice, abbiamo impostato il nume-ro casuale da 1 a 100 ma basta agire sulla stringanumeroCasuale = random() % 100 + 1;cambiando 100 con 50 per avere un’escursione di numeri

casuali che vanno da 1 a 50.Nella stringa successiva abbiamo scritto che se viene rileva-to un movimento maggiore di 1,5 sui tre assi (x, y, z) si attivala unzione acceleration. Anche in questo caso la sensibilità di risposta può esserevariata semplicemente cambiando il valore 1,5 nella stringadi codice:

f (ccltn.x > 1.5 || ccltn.y >1.5 || ccltn.z > 1.5) {

l’interfAcciA

Ora non resta che personalizzare l’interaccia e collegarlaal codice che abbiamo appena scritto per rendere tutte leunzioni (a dire il vero l’unica che abbiamo previsto, ovvero ilcambio di numero a seguito di scuotimento) operative.

Nella cartella Resources selezioniamo ScuotiViewController.xib e clicchiamo due volte su di essa per aprire lo strumentodi personalizzazione grafca, ovvero Interace Building.Personalizziamo a piacimento. Nel nostro caso abbiamo inse-rito il logo di HJ e la copertina semplicemente importando da

Tools>Library

delle Image View, ovvero degli spazi all’interno dei qualivisualizzare delle immagini. Per vedere l’immagine all’internodella Image View occorre inserirla nella cartella Scuoti (quel-la del progetto) e quindi trascinarla all’interno della cartellaResources. A questo punto è selezionabile da:

Tools>Inspector>Images View Attributes>Image

L’elemento ondamentaledella nostra applicazione, aldi là di tutti gli abbellimentiè la Label che dobbiamoimportare nella nostra inter-accia e quindi:SelezionareInspector>Label Connec-tions.Trascinare New Reeren-cing Outlet su File’s Owner(come da immagine). Sele-zionare ibNumeroCasuale(come da immagine). A que-

sto punto l’applicazione èpronta. Laanciamo Build an Run e vediamo il risultato. Unapiccola avvertenza, il simulatore di iPad/iPhone, purtropponon è in grado di simulare gli eetti dell’acceleratore, quindiper accertarvi del corretto unzionamento dell’applicazioneoccorre caricarla sull’iPad e are tutte le verifche del caso.

codice sorgente

Il fle sorgente di questa applicazione può essere scaricatoall’indirizzo www.hackerjournal.it nella sezione download.

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 23/32

programmazione/facile

yHaCker Journal 23

Ingegneria del software

Negli ultimi decenni la Object Oriented Pro-gramming (OOP) è diventata il paradigmadominante all’interno del mondo dello svi-luppo del sotware, grazie al suo approcciosistematico che modella la realtà come un

insieme organizzato di oggetti. Se fno a poco tempo a cisi rieriva alla OOP per indicare solamente un paradigmadi programmazione, oggi il signifcato è mutato e descrivel’intero processo di sviluppo del sotware, abbracciandoquindi i problemi studiati dall’ingegneria del sotware.

STRATEGIE ORGANIZZATIVE

L’ingegneria del sotware è una disciplina inormaticache studia il processo di sviluppo del sotware, cercan-do di determinare valide strategie organizzative per larealizzazione di programmi di qualità. Erroneamente sipotrebbe pensare che la creazione di un sotware con-sista solamente nella scrittura e nella compilazione dicodice; generalmente, invece, il processo che porta allarealizzazione di un sotware è complesso e si suddivide innumerose attività. Esistono molteplici modelli di processodi sviluppo del sotware (Waterall, a spirale, V-Cycle,...)

l’d stw èu dst hstud ssd svu dstw sdd stbt.

open sourcetutti dierenti nella struttura, ma simili nelle attività cheli compongono.

I mOdEllI

Consideriamo un modello semplifcato, composto daquattro asi: Analisi, Progettazione, Implementazione e Verifca.La ase di Analisi consiste nell’individuazione dei requi-siti che il progetto sotware deve soddisare; l’analistastudia il dominio applicativo al fne di comprendere aondo il problema che il sotware dovrà risolvere.

La ase di Progettazione si concentra principalmente suquattro grandi aree: le strutture dati, l’architettura delsistema, le interacce e i componenti.L’ Implementazione è la ase di scrittura del codice ed èl’attività che generalmente richiede la minor percentualedi lavoro rispetto alle altre tre.La ase di Verifca consiste nel collaudare il sistemarealizzato, al fne di trovare errori e di verifcare che glioutput siano quelli previsti.

Gli ingegneri del sotware ricorrono all’utilizzo di stru-menti e tecniche che assistono tutte le asi di crea-zione del sotware, a partire dalla modellazione delsistema, per arrivare alla consegna del prodotto fnito(ma sul quale è quasi sempre necessario eettuare

manutenzione). Questi strumenti sono chiamati tool diC.A.S.E (Computer-Aided Sotware Engineering) e sidierenziano in base all’attività cui anno da supporto;esistono strumenti per la modellazione del sistema, perla pianifcazione del progetto sotware, per l’analisi deirischi, per la programmazione, per la gestione della do-cumentazione e tanti altri ancora. Il costo spesso moltoelevato di questi strumenti ha portato il mondo Open-Source a produrre una grande quantità di sotware,alcuni di ottima qualità, per l’assistenza al lavoro dell’in-gegnere del sotware. La flosofa del Free Sotware hainoltre contribuito notevolmente al miglioramento di tali

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 24/32

programmazione/facile

y24 HaCker Journal

pratiche ingegneristiche, attraverso il consolidamento

del concetto di collaborazione: i team di sviluppo nonsono più ristretti ad una limitata cerchia di persone,ma gli sviluppatori sono moltissimi e sparsi in tuttoil mondo. Questo ultimo tema è stato sinteticamentearontato da Eric S. Raymond nell’ormai amosissimoscritto “La cattedrale e il bazaar” dove vengono trattealcune importanti conclusioni, indiscutibilmente aavore del sorgente aperto. Come osservato poco a,i team di sviluppatori non sono più ristretti e delimi-tati in ase di pianifcazione, non c’è più una gestionepiramidale del processo di sviluppo del sotware; oragli sviluppatori sono tutti sullo stesso livello, si trova-no all’interno di un grande bazaar dove possono arele loro proposte e dove queste ultime possono essereaccettate, modifcate, aggiornate. La crescita del

numero di programmatori, porta ad un incremento diidee e di novità, le release si susseguono velocemen-te una dopo l’altra, avorendo il progresso del sistemasotware.

GlI STRumENTI

L’approccio OpenSource è quindi qualcosa di radi-calmente innovativo ed originale, qualcosa che nonsegue le classiche regole dell’ingegneria del sotwa-re. Lo sviluppo di sotware OpenSource è più rapido(“release early, release oten” osserva Raymond) edè spinto dalla passione e dal divertimento dei pro-

grammatori (lo stesso Linus Torvalds ammette di averiniziato a scrivere il codice del kernel di Linux “just orun”). Volgendo nuovamente l’attenzione agli stru-menti dell’ingegneria del sotware, il punto di rieri-mento per il mondo OpenSource è senza dubbio lacommunity Tigris.org (www.tigris.org), che si proponedi essere un grande repository di sotware ed ideelegate alla sotware engineering. Molti sono i progettiattivi hostati, alcuni ancora in ase di studio iniziale,altri già stabili e con un buon numero di release allespalle; tra i progetti più utilizzati e per questo più notisi segnalano ArgoUML e Subversion.

ARGO uml

 ArgoUML è un sotware che consente di assistere laase di Analisi del sistema sotware che si intende re-alizzare utilizzando il linguaggio di modellazione UML.UML (Unifed Modeling Language) è una notazionegrafca utilizzata per descrivere le caratteristiche diun progetto sotware e per assistere le asi di analisidel sistema. Attraverso il disegno di diagrammi UMLè possibile modellare il sistema, cercando di pro-durne un’ottima astrazione. Non essendo possibilearontare in questo approondimento le specifchedel linguaggio UML, i lettori sono invitati a visitareil sito dell’Object Management Group (www.omg.org) e l’homepage www.uml.org. ArgoUML, scritto in

Java, ore un ottimo supporto per il disegno di questidiagrammi e inoltre è dotato di qualche unzionalità inpiù, che anno di questo sotware uno strumento indi-spensabile per l’ingegnere del sotware OpenSource.

Tigris.org è una

comunità di mediedimensioni, sviluppata

 sui valori dell’open

 source e incentrata

 sullo sviluppo di 

 strumenti migliori per 

 lo sviluppo del software

collaborativo.

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 25/32

Tra le caratteristiche più evidenti vi è la possibilità di

generare automaticamente codice Java (o C++ attraver-so l’utilizzo di un plugin) a partire dai Class Diagram (or-ward engineering) ed è anche possibile eettuare l’ope-razione contraria di reverse engineering (dai fle .classai diagrammi). Subversion è un sotware per il controllodelle revisioni che si propone come valido rimpiazzo peril più amoso CVS. Un “version control system” consen-te di tenere traccia delle modifche che vengono eet-tuate ad un fle (tipicamente un fle sorgente, ma nullavieta di utilizzarlo per gli scopi più disparati) da uno opiù utenti in maniera trasparente e consente di risalireall’interno dell’albero delle modifche nel momento in cuis’intenda tornare ad una versione precedente di quantoprodotto. Lo standard de acto per i sistemi di controllodelle revisioni è il sotware CVS (www.cvshome.org), ma

sulla sua scia sono apparsi diversi progetti alternativi,che sruttano la popolarità e il modello di CVS, propo-nendo soluzioni perezionate.

SubVERSION

Uno di questi è Subversion, che è stato progettato, fndalla prima versione, come sistema collaborativo perutenti remoti; ciò ha consentito di ottenere un ottimosupporto sia dal lato client che dal lato server, elimi-nando le imprecisioni di CVS, inizialmente pensato peril lavoro in locale. La sintassi dei comandi Subversionè pressoché equivalente a quella in CVS e di conse-guenza lo switch tra i due sistemi viene ulteriormentesemplifcato. Un’altra grande dierenza tra i due sistemiconsiste nelle possibilità, in Subversion, di eettuareun versionamento direttamente su di un’intera direc-tory, operazione impossibile in CVS; questa eature ha

una grande rilevanza in quanto consente di ottenere unapproccio maggiormente modulare allo sviluppo delsistema.

lE GuI

Come per CVS, anche per Subversion è disponibile unagrande quantità di GUI che permette di gestire il versio-namento con pochi clic del mouse. Ai neofti non con-sigliamo comunque di afdarsi alle interacce grafche,solo apparentemente più intuitive; esse sono spessocaotiche e colme di comandi. Sia CVS che Subversionpossono essere utilizzati produttivamente da linea dicomando, anche conoscendo i pochissimi comandiprincipali.

yHaCker Journal 25

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 26/32

programmazione/difcile

Giovanni `m0le`Federico - giovanni@m0le.itFabio `BlackLight` Manganiello - blacklight@autistici.org

y26 Hacker Journal

CORSO

DI PROGRAMMAZIONE

IN Clinguaggi La gesione della memoria è n

aspeo crciale. Disporre di srmeni in gradodi manipolare ed indicizzare i dai raai dalCalcolaore in memoria cosiisce na conoscenzadi primaria imporanza per il neoprogrammaore.

Parte IV

L’intera quarta parte di questocorso sarà pertanto destinata a ciò,introducendo un tipo di dato nuovo,di ondamentale rilievo per tutto ilnostro percorso: stiamo parlando,

naturalmente, dei puntatori. Non ci stancheremomai di ricordarvi che i luoghi ideali per gli appro-ondimenti legati a questo corso di programma-zione restano il orum della rivista raggiungibile

all’indirizzo www.hackerjournal.it ed il canale#hackerjournal su irc.azzurra.org. Fatevi sentire!

PuNtAtORI

Inauguriamo l’inizio di questa quarta parte delcorso di programmazione in C con la seguente,importantissima:

intero, reale) contenuto al loro interno.In inormatica molto spesso si ha però a

che are con collezioni di dati, ovvero og-getti contenenti al loro interno più elementi,dello stesso tipo (Denizione 1 - HJ 200) odi tipi eterogenei.

Diamo pertanto la seguente:

DEFINIZIONE 23PUNTATORE

Deniamo ed identichiamo con il nome“puttre” una variabile il cui valore è

un indirizzo di memoria.La dichiarazione di un puntatore avvieneattraverso l’utilizzo di un appositooperatore unario rappresentato dalcarattere asterisco (*) nella orma <tip>

*<puttre>.

Evitando di percorrere una strada piena di inutiliormalismi risulterà sicuramente più semplicecomprendere concettualmente il signicato deipuntatori ricordandosi cosa accade in memoria

nel momento in cui si inizializza un determinatovalore. Sembrerà diatti lapalissiano asserire chequando si eettua una dichiarazione del tipo “intn = 10” si sta assegnando ad una ben specicalocazione di memoria il valore “10” (di tipo intero). Appare lecito quindi domandarsi, ora che granparte dei concetti di base della programmazionein C sono chiari, se esiste un modo attraverso ilquale rierirsi a quella specica zona di memoria.

Una risposta esauriente e unzionale la si ritrovanell’utilizzo dei puntatori; in altri termini (ma non gliunici) essi orono un meccanismo decisamentefessibile per trattare indirizzi di memoria sotto-orma di “etichette” (e quindi variabili) e non solo.Comprendere ed usare correttamente i puntatoricostituisce non solo l’obiettivo di questa quartaparte, bensì un attributo cruciale che caratterizzail linguaggio stesso e le possibilità applicative. Purnon sapendolo, abbiamo già incontrato puntatoriquando abbiamo parlato di vettori e di unzioni(vedremo tra poco perché) e li incontreremo nuo-vamente quando introdurremo le strutture. Con-sideriamo il seguente esempio attraverso il qualepotremo capire meglio il concetto di puntatore:

#include <stdio.h>

int main(){

int n = 10;

int *ptr = &n;

print(stdout, “Il valore di n: %d\n”, n);

print(stdout, “Indirizzo di n: %p\n”, &n);

print(stdout, “Il valore di ptr: %p\n”, ptr);

print(stdout, “Indirizzo di ptr: %p\n”,

&ptr);

return 0;

}

Compiliamo ed osserviamo l’output:$ gcc point.c -o point$ ./pointIl valore di n: 10Indirizzo di n: 0x71254e2ecIl valore di ptr: 0x71254e2ecIndirizzo di ptr: 0x71254e2e0

Con questo elementare sorgente abbiamo sem-

plicemente collocato in memoria due variabili:la prima è “n”, di tipo intero e con valore 10, laseconda è un puntatore a quest’ultima. Osser-viamo il comportamento dello stesso nelle righedell’output evidenziate. L’indirizzo della va-riabile “n” in memoria è 0x7fff1254e2ec mentre il suo valore, come ci aspettavamoavendolo assegnato a mano, è “10”. La si-tuazione per quanto concerne il puntatoreè invece diversa: notiamo che esso possie-de un indirizzo proprio (0x7fff1254e2e0) ma il valore di quest’ultimo è esattamentel’indirizzo di memoria della variabile punta-ta (n), ovvero, di nuovo, 0x7fff1254e2ec.Questo comportamento è del resto quello

che prevedevamo in base alla denizionepocanzi data di puntatore. A questo punto, avendo memorizzato all’internodella variabile “ptr” l’indirizzo di memoria dellavariabile “n”, possiamo accedere al suo valoreutilizzando ’pertre di idirezie dere-

ferimet (*). Espandiamo pertanto il sorgenteanalizzato ed osserviamo il suo comportamentodurante l’esecuzione:

#include <stdio.h>

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 27/32y

Hacker Journal 27

int main(){

int n = 10;

int *ptr = &n;

print(stdout, “Il valore di n: %d\n”, n);

print(stdout, “Indirizzo di n: %p\n”, &n);print(stdout, “Il valore di ptr: %p\n”, ptr);

print(stdout, “Indirizzo di ptr: %p\n”,

&ptr);

print(stdout, “Valore puntato da ptr: ¬

%d\n”, *ptr);

return 0;

}

Da cui l’output sarà:

$ ./pointIl valore di n: 10Indirizzo di n: 0x731bc32ecIl valore di ptr: 0x731bc32ec

Indirizzo di ptr: 0x731bc32e0 Valore puntato da ptr: 10

Intuire il meccanismo di azione di quantoappena espresso è acile. Rierendoci alla celladi memoria contenente il valore di “n” attraversoil suo puntatore abbiamo stampato a video ilcontenuto della stessa. Semplice, no ? Dichiarazione di un puntatore a intero

ARItMEtICA DEIPuNtAtORI

 Abbiamo già detto nel corso della terzaparte che la dichiarazione di un array in C sitraduce in un puntatore al primo elementodel vettore. Da qui pertanto riprendiamo inconsiderazione per un attimo il sorgentecon il quale ci siamo lasciati nel numeroprecedente:

1. #include <stdio.h>

2. #include <stdlib.h>

3. int main()

4. {5. int i;

6. int *miovettore;

7. miovettore = (int*) ¬

malloc(10*sizeo(int));

8. or (i=0; i < 10; i++) {

9. print (stdout, “Elemento ¬

n.%d: “, i+1);

10. scan (“%d”, ¬

&miovettore[i]);

11. }

12. or (i=0; i < 10; i++)

13. print (stdout, “L’eleme ¬

nto n.%d vale %d\n”, i+1, miovettore[i]);14. }

Di nostro interesse sono le righe 6 e 7 nelle qualiabbiamo dichiarato un puntatore di tipo intero“miovettore” ed a questo abbiamo riservatoattraverso l’apposita unzione mc(), cheanalizzeremo tra pochissimo, uno spazio dimemoria idoneo a contenere 10 valori di tipointero, moltiplicando quest’ultimo numero perla dimensione di un intero attraverso la unzionesizef() (anche questa oggetto di analisi a bre-ve). Sostanzialmente abbiamo denito un rry in modo diverso dalla classica assegnazionevista nella terza parte del corso. Ci aspettiamo,

per quanto detto allora e ripetuto in queste pagi-ne, che le 10 locazioni di memoria assegnatecontengano ognuna un elemento del vettore,così come espresso dal ciclo che le stampatutte come per qualsiasi altro array alle righe12, 13 e 14. Proviamo quindi a riscrivere tuttoil programma lavorando direttmete sugi

idirizzi di memri utilizzando le appositeoperazioni aritmetiche spendibili sui puntatori. Ilsorgente nuovo sarà quindi:

1. #include <stdio.h>

2. #include <stdlib.h>

3. int main()

4. {

5. int i;

6. int *miovettore;

7. miovettore = (int*) malloc(10*sizeo(int));

8. or (i=0; i < 10; i++) {

9. print (stdout, “Elemento n.%d:

“,¬ i+1);

10. scan (“%d”, (miovettore + i));

11. }

12. or (i=0; i < 10; i++)

13. print (stdout, “L’elemento n.%d ¬

vale %d\n”, i+1, *(miovettore+i));

14. }

Prestiamo particolare attenzione alle righe 10 e13 (evidenziate).

Nella prima abbiamo sostituito l’istruzionescf (“%d”, &mivettre[i]); con scf

(“%d”, (mivettre + i));. Il motivo è semplice. Ricordandoci che un array,come più volte detto, non è altro che un punta-tore rierito alla prima locazione del “blocco dimemoria” che dovrà contenere tutti i valori dellostesso analizziamo passo per passo il compor-tamento della riga 10 tenendo bene a mentequanto espresso alla riga 7. Torniamo all’esem-pio della cassettiera visto nello scorso numeroed immaginiamo la riga 7 come un “alegname”al quale stiamo chiedendo di costruire una cas-settiera con 10 tiretti. Il primo di questi tiretti saràquello reerenziato dal puntatore “miovettore”.

 Alla riga 10, a prima vista, si potrebbe pensaredi star sommando un intero (i è una variabilecontatore del ciclo or denito alla riga 8 cheva da 0 a 9) ad un puntatore e quindi ad unindirizzo di memoria. Mai nulla di tanto errato!In questo caso, inatti, assistiamo alla più con-creta testimonianza della capacità di controllodella memoria da parte del C attraverso banalioperazioni aritmetiche eseguite direttamentenella memoria del Calcolatore. La scrittura (mi-

 vettre + i) sta inatti a signicare “avanzadi i posizioni rispetto all’indirizzo di partenzareerenziato dal puntatore”. Essendo un vettoredi interi ogni “posizione” costituirà 4 byte,pertanto: “miovettore + 0” si rierirà alla prima

posizione dell’array entro cui andremo a scrivereil valore preso da tastiera attraverso la scf() (che ricordiamo essere una unzione isicur,il perché lo lasciamo scoprire a voi), “miovettore+ 1” si rierirà all’indirizzo di “miovettore” piùquattro byte (e quindi alla seconda posizionedell’array, il secondo cassetto per intenderci),“miovettore + 2” sarà “miovettore” + otto byte(terza posizione, terzo cassetto) e via di seguito. Alla riga 13 ccedim agli elementi del vettorecon la medesima aritmetica, stavolta antepo-nendo l’operatore di indirezione visto primaattraverso il quale indichiamo di volerci rierireal valore dell’indirizzo di memoria contenuto dalpuntatore e non all’indirizzo stesso.

Compiliamo ed eseguiamo il nuovo programmaper testare che, eettivamente, l’output ed ilunzionamento dello stesso risulti immutato:

$ gcc point2.c -o point2$ ./point2Elemento n.1: 1Elemento n.2: 2...Elemento n.10: 10L’elemento n.1 vale 1L’elemento n.2 vale 2

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 28/32y

28 Hacker Journal

...

L’elemento n.10 vale 10

Per rendere maggiormente chiaro e vericatoquanto appena espresso, proponiamo un’ulte-riore riscrittura del programma modicando lariga 13 da fpritf (stdut, “l’eemet .%d

 ve %d\”, i+1, *(mivettre+i)); fpritf

(stdut, “Idirizz #%d eemet: %p\”,

i+1, (mivettre+i));.Osserviamo con attenzione l’output:

$ ./point3Elemento n.1: 1Elemento n.2: 2Elemento n.3: 3

...Elemento n.10: 10Indirizzo #1 elemento: 0x601060Indirizzo #2 elemento: 0x601064Indirizzo #3 elemento: 0x601068Indirizzo #4 elemento: 0x60106cIndirizzo #5 elemento: 0x601070Indirizzo #6 elemento: 0x601074Indirizzo #7 elemento: 0x601078Indirizzo #8 elemento: 0x60107cIndirizzo #9 elemento: 0x601080Indirizzo #10 elemento: 0x601084

Notate nulla ? Il distacco tra un indirizzo relativoad un elemento e l’altro è di esattamente 4 byte,

come volevasi dimostrare. Dovrebbe essereora maggiormente chiaro per il lettore “cosaaccade” in memoria all’atto di dichiarazione edinizializzazione di un array e di una variabile, maquesti dettagli potevamo scoprirli solo una voltaintrodotti i puntatori... tutto sommato, inizia atornare utile conoscerli, no ?

PuNtAtORI APuNtAtORI

La domanda appare quasi scontata arrivati aquesto punto del corso: è possibile puntare

ad un puntatore ? La risposta è naturalmenteaermativa ed abbastanza intuitiva. Conside-riamo il seguente sorgente esemplicativo edosserviamo l’output dopo averlo compilato:

#include <stdio.h>

int main(){

int n = 203;

int *p1 = &n;

int **p2 = &p1;

print(stdout, “Il numero di questa rivista

e’ il %d (senza puntatore)\n”, n);

print(stdout, “Il numero di questa rivista

e’ il %d (con puntatore a n)\n”, *p1);print(stdout, “Il numero di questa rivista

e’ il %d (con puntatore a p1)\n\n”, **p2);

print(stdout, “Indirizzo di n: %p\n”, &n);

print(stdout, “Indirizzo di p1: %p\n”,

&p1);

print(stdout, “Indirizzo di p2: %p\n\n”, ¬

&p2);

print(stdout, “Valore di p1: %p\n”, p1);

print(stdout, “Valore di p2: %p\n”, p2);

return 0;

}

$ gcc ptop.c -o ptop$ ./ptopIl numero di questa rivista e’ il 203 (senzapuntatore)Il numero di questa rivista e’ il 203 (con punta-tore a n)Il numero di questa rivista e’ il 203 (con punta-tore a p1)

Indirizzo di n: 0x7c37242ecIndirizzo di p1: 0x7c37242e0Indirizzo di p2: 0x7c37242d8

 Valore di p1: 0x7c37242ec

 Valore di p2: 0x7c37242e0

Per quanto elementare, questo sorgente hauna notevole rilevanza didattica. Il valore delpuntatore “p2” è l’indirizzo del puntatore “p1”.Rierendoci a “p2”, quindi, identichiamo nonil valore di “p1” bensì ’idirizz prpri delpuntatore “p1”. Utilizzando una dppi idi-

rezie (**) il meccanismo è quindi lo stessoapplicato nora ai puntatori ma ripetuto duevolte. In prima istanza interroghiamo l’indirizzoreerenziato da “p2” (il suo valore), attraversoquesto “saltiamo” a quell’indirizzo dove adaspettarci è un ulteriore puntatore il cui valore sirierirà ad una zona distinta di memoria (quella di

n). In denitiva:1. Accediamo in memoria all’indirizzo 0x7ff-

fc37242d8 (quello di p2 ).2. Leggiamo il valore contenuto dal puntatorep2 in questa zona (0x7fffc37242e0 ).3. Accediamo in memoria all’indirizzo 0x7ff-

fc37242e0.4. Leggiamo il valore contenuto in questa zonache scopriamo essere p1 (0x7fffc37242ec ).5. Accediamo in memoria all’indirizzo 0x7ff-

fc37242ec.6. Leggiamo il valore presente in questa zona:

203. Torneremo sui puntatori a puntatori a breve

in quanto questi rappresentano la modalitàattraverso la quale è possibile gestire il passaggiodi puntatori a parametri nelle unzioni. In questasede deve essere necessariamente detto che èinoltre possibile, attraverso i puntatori, rierirsi astrutture dati che ne contengono altri al loro inter-no, ma per questo il lettore dovrebbe conoscerecosa siano le strutture dati e come manipolarle,concetti abbastanza avanzati che, non potendobrevemente esplicare in queste pagine, deman-diamo alle parti conclusive del corso.

PuNtAtORISENZA tIPO

Spesso può essere utile utilizzare puntatorisenza tipo, contenenti ovvero un indirizzo dimemoria generico, non legato ad una partico-lare tipologia di dato. Per dichiararli la sintassi èvoid *puntatore;.

 Vediamo un semplice esempio:

#include <stdio.h>

int main(){

int n = 44;

void *ptr = &n;

int *ptr2 = ptr;

print(stdout, “Valore di ptr:\t %p\n”, ptr);

print(stdout, “Valore di ptr2:\t %p\n”,

ptr2);

return 0;

}

$ gcc point4.c -o point4$ ./point4 Valore di ptr: 0x733a6d2dc Valore di ptr2: 0x733a6d2dc

Come visibile dall’output dell’applicativo, l’indi-rizzo restituito dal puntatore non cambia, indipen-dentemente dal tipo utilizzato. Torneremo a breve

su questo aspetto illustrando come e dove puòessere utile adottare simili meccanismi.

ALLOCAZIONEDINAMICA DELLA

MEMORIA

Usando i puntatori è possibile allocare dinami-camente dello spazio in memoria.Questa è una possibilità molto utile, ricordando

programmazione/difcile

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 29/32y

Hacker Journal 29

 Altra cosa da notare è il cast esplicito a int*

usato per il valore di ritorno in quanto malloc()ritorna un puntatore alla memoria allocata comevoid*, ovvero come tipo generico che va poi“specializzato” attraverso un operatore di cast(Puntatori senza Tipo). La maggior parte deicompilatori C non obietterà se questo cast nondovesse essere utilizzato, ma i compilatori C++sono più restrittivi su queste cose, consideranoambiguo il cast implicito da void* e ritornerannoun errore. Per completezza è quindi semprebuona norma “castare” il valore di ritorno dimalloc(). Una volta allocato in questo modo, ilvettore può essere acceduto come si arebbecon un normale vettore statico:

or (i=0; i < n; i++) {print (“Valore %d: “, i+1);

scan (“%d”, &array[i]);

}

Un’altra unzione molto utile nell’ambito dell’allo-cazione dinamica della memoria è rec().Tale unzione consente di modicare la dimen-sione di un’area di memoria allocata al volo,prende come parametri il puntatore all’area dimemoria da modicare e la sua nuova dimen-sione. Così come la malloc() ritorna un puntatorea void* che punta alla nuova area di memoria.

int i, value, size = 0;

int* array = NULL;

do {

print (“Inserisci un nuovo valore nell’array “

“(-1 per terminare): “);

scan (“%d”, &value);

i (value == -1)

break; // Esce dal ciclo

i ((array = (int*) realloc( array, (++size)* ¬

sizeo(int) )) == NULL) {

print (“Problema atale nella riallocazione,

¬ esco\n”);

exit(-1);

}

array[size-1] = value;

} while (value != -1);

print (“Sono stati inseriti %d elementi:\n”,

size);

or (i=0; i < size; i++)

print (“%d\n”, array[i]);

ree(array);

che nora abbiamo imparato solo come allo-

care della memoria staticamente (al momentodella dichiarazione di una variabile diciamo im-plicitamente quanto è grande, ad esempio unavariabile int o char avranno la stessa dimensio-ne pressata sulla macchina su cui andiamo acompilare il codice, mentre quando dichiariamoun array dichiariamo anche la sua dimensione).Non è comunque sempre possibile sapere inanticipo quanto spazio in memoria si vuoleallocare nel proprio programma. Si pensi adesempio a un sotware che richiede l’immis-sione di dati in una quantità dipendente da unavariabile inserita dall’utente o una unzione chelegge un’intera riga da le o da standard inputsenza conoscerne a priori la dimensione.

In casi come questi l’uso di array statici aperdere fessibilità al programma, o peggio puòcausare problemi di overfow nel caso in cuila quantità di dati letta sia maggiore di quellaprevista nel buer. Si usa allora in questi casi lacosiddetta allocazione dimic, prevista in Cdalla unzione mc() e dalla sua duale free().La unzione malloc() prende come parametrola quantità di memoria che si vuole allocare(N.B. in byte) e ritorna un puntatore a vid* che può essere salvato nel puntatore di propriointeresse. Nel caso in cui la quantità di memoriarichiesta non può essere allocata, la malloc() ri-torna NULL. È sempre buona norma controllareil valore di ritorno di malloc() per assicurarsi che

non ci siano stati errori e non compromettere inquesto modo la stabilità del programma usandopuntatori non correttamente allocati.Il seguente codice richiede all’utente quantevariabili intere vuole inserire e ritorna un arrayallocato dinamicamente via malloc() contenentequel numero di elementi:

int n, *array;

print (“Numero di variabili che l’array dovra’contenere: “);scan (“%d”, &n);

i ((array = (int*) malloc( n*sizeo(int) )) == NULL)

print (“C’e’ stato un errore irreversibile nell’al-locazione”);elseprint (“Allocazione avvenuta con successo”);

Si noti innanzitutto che per allocare n variabiliintere la malloc() vuole come argomento n *sizeo(int). Questo perché l’argomento della mal-loc() deve essere il numero di byte da allocare, enoi vogliamo che siano allocati n byte moltipli-cati per la dimensione in byte di una variabile int(generalmente 4 byte).

Si noti che la malloc() in questo spezzone dicodice non viene mai richiamata, mentre invecealla prima chiamata del ciclo la realloc() vienechiamata su array che è ancora un puntatorea NULL. Questo è un comportamento moltointeressante di realloc(): se viene richiamatasu un puntatore a NULL non ancora allocato,inatti, alloca automaticamente quella zona dimemoria, operando come una comune malloc().

noTa

Tutte e fuzii prese i esme (mc(),

rec(), free()) si pss usre ptt

di icudere ’heder stdib.h ’iizi de

cdice (#icude <stdib.h>).

PuNtAtORI EfuNZIONI

L’uso dei puntatori è indispensabile qualora sivogliano rendere le modiche operate a variabilipassate come argomento di una unzione ope-

MALLOC() ED HEAPDue paroline sul modo incui opera malloc(). Le variabiliche abbiamo imparato a dichia-rare nora, semplici o vettoriali, ven-gono allocate a basso livello su unazona di memoria chiamata stack (osul segmento data nel caso di variabiliglobali). Ogni unzione ha il suo stack,quindi il main() avrà il suo e ogniunzione dichiarata nel programmaavrà uno stack diverso da quello delmain(). Lo stack di una unzione vienecreato al momento in cui la unzione èrichiamata, sono piazzate dentro tutte

le variabili e gli array dichiarati all’ini-zio della unzione, e viene distrutto(deallocato dalla memoria) quando launzione termina.Usando la malloc() invece la memoriaviene allocata in una zona chiamataheap, generalmente molto grande(proprio per permettere l’allocazionedinamica senza problemi) e condivisada tutte le unzioni del programma.Questo vuol dire che, se tale spazioin memoria non viene esplicitamentedeallocato, rimane lì marcato come“occupato” anche quando la unzioneche l’ha allocato è terminata, oppure

lo spazio stesso non serve più.

RICHIAMOTEORICO

7

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 30/32y

30 Hacker Journal

rative al di uori della unzione stessa.

Si pensi ad esempio a una unzione che, presicome argomenti due variabili intere, scambii valori contenuti in esse (ovvero il valore di adiventa il valore di b e viceversa). Una prima im-plementazione che viene in mente è la seguente(usando una variabile di appoggio):void swap (int a, int b) {

int tmp = a;

a = b;

b = tmp;

}

Una volta invocata questa unzione, ci ritrove-remo di ronte ad una sorpresa: lo scambio,materialmente, non viene eettuato al di uori

della unzione. Questo perché abbiamo passatoa e b per valore, ovvero abbiamo passato allaunzione i valori di a e b, non le eettive locazio-ni di memoria che contengono queste variabili.Questo signica che quando la unzione vienerichiamata prende i valori che le sono stati pas-sati, li copia in due variabili locali chiamate a e b(che, N.B., sono due variabili diverse da quelledella unzione chiamante, in quanto vengonocreate sullo stack della nuova unzione e hannovisibilità locale alla unzione stessa) ed eettuale operazioni richieste su queste variabili locali.Una volta che la unzione è terminata, anche ilsuo stack viene distrutto, e con quello vannoperse anche le modiche eettuate sulle

variabili. Se vogliamo eettivamente operarelo scambio e are in modo che sia visibileanche alla unzione chiamante, la via è quelladi passare le due variabili non per valore, maper rierimento, ovvero passare alla unzione ipuntatori che identicano le zone di memoriache contengono le variabili. La unzione modi-cherà così direttamente quelle zone di memoria,non copie locali delle variabili, ed i cambiamentisaranno visibili anche al di uori della unzione:

void swap (int* a, int* b) {

int tmp = *a; // tmp contiene il valore puntato

da a

*a = *b; // Il valore puntato da a è uguale al

valore puntato da b

*b = tmp; // Il valore puntato da b è uguale al

vecchio valore di a

}

La unzione verrà richiamata nel seguentemodo:

int a = 2, b = 3;

...

swap (&a, &b);

Si noti che a e b vengono passati per rierimento(la & davanti), a identicare che si voglionopassare non i loro valori ma i loro indirizzi inmemoria. Scritture come queste sono utiliogni qualvolta si vuole che una unzione ritornipiù di un valore. Per denizione, inatti, una

unzione in C ritorna un solo valore. Comeare quindi se si vuole scrivere una unzio-ne che muova il cursore sullo schermo auna posizione (x,y), ritorni al chiamante lecoordinate della nuova posizione (come duevariabili intere) e ritorni 0 in caso di successoe -1 in caso di errore? Una via può esserequella di ritornare un vettore contenente comeprimo elemento il successo o meno dell’ope-razione e come rimanenti due valori le nuovecoordinate, ma è un approccio decisamentepoco elegante in quanto ritorna un’entità inmemoria che, pur contenendo variabili dellostesso tipo strettamente parlando, raggruppaoggetti che sono logicamente non correlati tra

loro. La soluzione migliore è quindi quella dipassare x e y per rierimento alla unzione eare in modo che la unzione ritorni un interoche è il “codice di successo” della unzione,qualcosa del tipo:

int moveToXY (int* x, int* y) { /* codice */ }

...

int ret, x, y;

ret = moveToXY(&x, &y);

Un altro problema molto comune è come

are in modo che una unzione ritorni unarray. Uno è quello di passare l’array allaunzione come puntatore. Dovrebbe ormaiessere chiaro che passando un array ad unaunzione non acciamo altro che passare ilpuntatore al primo elemento e tutte le modi-

che eettuate su di esso e sugli elementi inmemoria successivi saranno visibili anche alchiamante. Vediamo ad esempio una unzio-ne che riempie un array di n elementi

void fllArray ( int *v, int size ) {

int i;

or (i=0; i < size; i++) {

print (“Element n.%d: “, i+1);

scan (“%d”, &v[i]);

}

}

...

int v[3];

fllArray(v,3);

Un altro modo è quello di ritornare direttamentel’array come puntatore, ma attenzione a scrittu-re del genere:

int* oo() {

int v[10];

...

return v;

}

...

int *v = oo();

programmazione/difcile

MEMORY LEAKL’utilizzo della memoria heap può dar luogo a problemi molto seri (espesso anche molto dicili da scovare), specie in grossi progetti, noticome memory leak. Il principio di base è che la memoria allocata va poisempre deallocata. Può capitare di scrivere un enorme loop in cui si alloca dellamemoria dinamicamente, per poi dimenticarsi di deallocare magari un solo byte diquella memoria. Quel loop però legge magari dati da un enorme database venen-do quindi eseguito anche un miliardo di volte. Un byte non deallocato moltiplicatoper un miliardo di iterazioni a quasi un gigabyte di memoria RAM non più usatae marcata come “occupata”, e questo rischia di infuire drammaticamente sulleprestazioni sia del proprio sotware, sia della macchina su cui si a girare. Proble-mi come questi non sono neanche acili da scovare. Ci sono tool appositi comevalgrind che aiutano il programmatore ad individuare eventuali leak, ma anchecosì nella maggior parte dei casi il programmatore, una volta lanciato il suo belprogramma magari di 10000 righe di codice, vede la dimensione della memoria

occupata aumentare drammaticamente, e non riesce generalmente a scovare, senon dopo ore o giorni di debug, la onte del problema. È per questo che bisognastare attenti a deallocare sempre tutta la memoria che si alloca dinamicamente,usando la unzione ree() (nel caso di sopra, una volta che lo spazio occupato daarray non ci serve più chiameremo ree(array)). Il trucco sta nel piazzare subito unaree() dopo la malloc() per evitare di dimenticarsela in seguito e scrivere il codicenel mezzo ra le due chiamate.

RICHIAMOTEORICO

8

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 31/32y

Hacker Journal 31

Scrivendo una cosa del genere il compi-latore (nel nostro caso, ricordiamo, gcc oderivati) darà il seguente warning:

warning: unction returns address o localvariable

Il motivo, arrivati a questo punto, dovrebbeessere ovvio. Abbiamo dichiarato v all’inter-no di oo() come array statico di 10 elementi,quindi v è un oggetto locale a oo() allocatosullo stack della unzione stessa al momen-to della sua creazione e, quindi, distruttoquando la unzione termina. Se eseguissimoquel codice e provassimo a leggere dallaunzione chiamante gli elementi contenutidentro v ci ritroveremmo a leggere valoripiù o meno casuali o nulli. Questo perché

stiamo leggendo da una zona di memoriache è stata deallocata. Il modo per ritornareun array da una unzione è quello di allocaredinamicamente l’array via malloc() o real-loc(). Si è già detto inatti che tali unzioni al-locano dinamicamente lo spazio sullo heap,che è una zona di memoria che non vienedeallocata nché il processo rimane in vitaa dierenza dello stack, quindi quello chec’è lì rimane visibile anche al chiamante. Maessendo il vettore allocato dinamicamentebisogna sempre ricordarsi di deallocarlo dal

chiamante usando la ree() quando

non serve più:

int* oo() {

int *v = (int*) malloc(10*sizeo(int));

...

return v;

}

...

int *v = oo();

...

ree(v);

PuNtAtORI AfuNZIONI

Una caratteristica estremamente potente del Cè quella di poter accedere all’indirizzo di memo-ria di una unzione oltre che di una variabile o diun vettore, attraverso i puntatori, e di passareuna unzione ad un’altra unzione come para-metro o di are in modo che una unzione ritornia sua volta un puntatore a unzione, esattamen-te come si arebbe con una variabile intera o unvettore di char. Diamo pertanto la seguente:

Questo meccanismo garantisce al programmauna fessibilità ed una modularità unica se srut-tata bene. Si pensi ad esempio all’interazionera HTML e JavaScript in un orm del tipo onClick=’unzioneJavaScript()’. A basso livello questascrittura viene gestita come un puntatore aunzione, ovvero qualcosa del tipo se l’evento“click” è vero, allora richiama la unzione punta-ta dall’identicatore “unzioneJavaScript”.

int oo (int n) {

return n;

}

...

int (*p)(int) = oo;

int n = p(3);

Si noti che in questo piccolo esempio ab-biamo dichiarato una unzione chiamata ooche a ben poco (prende come parametro unintero n e lo ritorna), quindi un puntatore a

MEMORY LEAK:

RIMEDILinguaggi più avanzaticome Java implementanonativamente un meccanismo notocome garbage collection, ovvero al-goritmi che operano periodicamentesulla memoria del processo e deallo-cano automaticamente aree non piùutilizzate (ma è anche vero che talilinguaggi non concedono la stessalibertà al programmatore sui processidi allocazione e deallocazione dellamemoria).Qualcosa di molto simile è possibileanche in C usando la libreria nota

come libgc, e usando invece delleunzioni malloc() e ree() della libreriastandard la unzione GC_malloc()specicata al suo interno, ma talelibreria è usata relativamente, inquanto si trasormerebbe in molti casiin una dipendenza aggiuntiva per ilprogramma, che potrebbe limitarne lasua esecuzione su alcune macchine.

RICHIAMOTEORICO

9

unzione p che è di tipo intero (ovvero ritorna

un intero) e prende come parametro un int,e tale puntatore contiene l’indirizzo dellaunzione oo. A questo punto, possiamo richiamare il punta-tore oo esattamente come se richiamassimola unzione oo. Se usati bene, i puntatori aunzione consentono di risparmiare moltocodice e di guadagnare molto in modularità.Si pensi a un esempio di algoritmo molto co-mune nell’intelligenza articiale, che consistenel vericare se un insieme di vincoli su uninsieme di dati è vericato e calcola auto-maticamente i nuovi domini delle variabili inunzione dei vincoli orniti. Immaginiamo chetali operazioni vengano eseguite all’interno di

una unzione.Rimane il problema di come passare i vincoli.Un metodo può essere quello di “hard-codar-li” all’interno della unzione stessa, ma è unmetodo decisamente poco fessibile, in quan-to se cambiano i vincoli dovremo cambiare ilcodice della unzione principale stessa.Un metodo più fessibile è quello di dichiararei vincoli in una unzione separata e passaretale unzione a quella contenente la “logica”vera e propria dell’algoritmo come puntatorea unzione.In tal modo, se cambiano i vincoli dobbiamosolo cambiare la unzione da passare alla un-zione contenente la “logica”, non la unzione

stessa. Se, ad esempio, il nostro insieme didati è un vettore di 4 interi e il vincolo è che ilprimo e il terzo elemento siano diversi, avre-mo una unzione del tipo

int constraint (int *v) {

return (v[0] != v[2]);

}

...

int logic (int *v, int (*c)(int*)) {

i (c(v) == 0) {

print (“Il vincolo non e’ rispettato, la unzio-

ne termina”);

return -1;

} else {

// Codice

}

}

...

logic (v, constraint);

Se volessimo modicare il vincolo di integri-tà, cambieremo semplicemente la unzioneda passare come parametro alla unzionelogic(), senza toccare il codice della unzio-ne logic() stessa.

DEFINIZIONE 24PUNTATORI A FUNZIONI

La scrittura per dichiarare in C un punta-tore a unzione è tipo (*nome_puntatore)(argomenti).

5/13/2018 Hacker.journal.nr.203.Luglio.2010 - slidepdf.com

http://slidepdf.com/reader/full/hackerjournalnr203luglio2010 32/32

Lo scandalo  che ha scosso il mondo! 

IN EDICOLA