View Full Version : Come modificare un programma
Maverick18
16-12-2005, 14:03
Salve, volevo chiedere una cosa che è da diverso tempo che mi passa per la testa. Se io voglio modificare un programma qualsiasi come devo agire ?
Devo procurarmi un disassembler per ottenere il codice sorgente ?
Per esempio se volessi modifcare un programma open-source come mi devo comportare ?
Ciao
alesnoce
16-12-2005, 14:23
Per quanto ne so sugli open source puoi scaricarti direttamente il codice sorgente.
Se per esempio vai alla pagina http://www.bloodshed.net/dev/devcpp.html puoi trovare il link per scaricare il sorgente delphi di dev c++.
Credo che ti basti cercare con google "nomeprogrammaopensource source code download" per ottenere quello che vuoi.
Maverick18
16-12-2005, 14:30
Per quanto ne so sugli open source puoi scaricarti direttamente il codice sorgente.
Se per esempio vai alla pagina http://www.bloodshed.net/dev/devcpp.html puoi trovare il link per scaricare il sorgente delphi di dev c++.
Credo che ti basti cercare con google "nomeprogrammaopensource source code download" per ottenere quello che vuoi.
Grazie per la risposta. :D
Se invece volessi aprire un programma nonn open-source ?
Se invece volessi aprire un programma nonn open-source ? usi un disassemblatore, ma non è facile: già i sorgenti originali sono spesso difficili da leggere per uno che di un certo programma non ne sa nulla, figurati il disassemblato... dipende poi anche da cosa devi fare: per esempio per creare dei crack esiste qualche tutorial in internet (tipicamente su siti "underground" :p) che ti spiega come fare per muoverti in mezzo a un disassemblato del quale poco si capisce; in genere per crakkare un programma si deve modificare la parte del codice in modo tale da non eseguire un JMP o un CALL a qualche routine di protezione; il difficile è appunto individuarla la routine... una volta che l'hai individuata basta che scopri da dove viene chiamata e costituisci il JMP o il CALL con dei NOP.
alesnoce
16-12-2005, 14:42
Qui purtroppo non ti posso essere di molto aiuto.
Ti posso solo consigliare di cercare sul grande google qualcosa sul reverse engineering, ovvero, grosso modo, su come risalire dal risultato(il programma) alle operazioni impiegate per ottenerlo(il codice).
Mi sembra addirittura, ma potrei sbagliarmi, che esistano tool, commerciali quasi sicuramente, che consentono di effettuare operazioni del genere; credo comunque che non basti semplicemente passare in ingresso a questi tool l'eseguibile. Sto però parlando di cose che non conosco, spero ti possa aiutare qualcuno che ne sa più di me.
Ciao
Maverick18
16-12-2005, 15:11
Grazie per l'aiuto ragazzi. :)
Farò come dite.
Io faccio ing informtaica ma finora non mai chiesto queste cose ai prof...ho paura che possano pensare male ;)
Scherzi a parte...durante questi anni di informatica non ho mai sentito parlare di argomenti del genere, per questo mi sono incuriosito.
Quello che cerco è un buon disassembler ma finora non ne ho trovati. Inoltre mi chiedo... i disassembler ti traducono il linguaggio macchina in assembly, no ?
Non penso che esistano disassembler che traducano in C... sarebbe troppo complesso IMHO. :O
rdefalco
16-12-2005, 20:39
No i disassembler generano (salvo quelli specifici, ad esempio per Visual Basic) codice assembly x86 che poi occorre interpretare.
Esistono poi dei tool specifici del linguaggio che a partire da un eseguibile sono in grado di ricostruire i prototipi dei metodi, e questo può talvolta venire utile per identificare le funzioni che interessano.
Non so essere più preciso perché non ho mai provato queste robe. Una volta ho visto un listato assembly x86 ma fra registri EAX, EBX, TEST, JMP ecc ho capito che mi ci voleva un manuale o una guida altrimenti non andavo da nessuna parte...
Quello che cerco è un buon disassembler ma finora non ne ho trovati. Inoltre mi chiedo... i disassembler ti traducono il linguaggio macchina in assembly, no ?
Non penso che esistano disassembler che traducano in C... sarebbe troppo complesso IMHO. :O si, i disassemblatori traducono solo da linguaggio macchina a linguaggio assembly, ma in teoria è anche possibile tradurre il linguaggio macchina in qualcosa di abbastanza simile al codice originale C; i programmi che lo fanno si chiamano decompilatori, ed il loro mestiere non è tutto sommato così complesso come credi grazie al fatto che per certe cose esistono determinate convenzioni; ad esempio, ottenuto il disassemblato di un programma, è abbastanza semplice dividerlo in funzioni sapendo che le funzioni iniziano spesso col loro tipico codice di prologo per creare uno stack frame, cioè
PUSH EBP
MOV EBP,ESP
seguito da una istruzione
SUB ESP,qualcosa
che serve ad allocare nello stack lo spazio per le variabili locali; una volta individuato l'inizio di una funzione, è possibile ricostruire i vari tipi di statements if, while, for, do, eccetera sapendo il "pattern" secondo il quale il compilatore che ha generato quel programma assembla quegli statements; a un certo punto poi si arriva ad una qualche istruzione RET che ritorna alla funzione chiamante effettuando il cleanup dello stack (il valore di ritorno delle funzioni si trova quasi sempre in EAX).
un consiglio utile che posso darti se vuoi disassemblare il codice di un programma generato da un certo compilatore X, è quello di analizzare il codice assembly generato dallo stesso compilatore di programmi di cui hai anche i sorgenti originali: facendo il confronto tra istruzioni C e istruzioni assembly puoi capire moltissime cose su come ragiona un compilatore ;)
per finire posso anche avvisarti di non fare come molti principianti che pensano che gli eseguibili contengano codice assembly puro... il formato dei .exe è abbastanza complesso ed è abbastanza dettagliatamente documentato da Microsoft nel documento che troverai non ricordo dove in MSDN :p
qualsiasi vero cracker quel documento secondo me deve saperlo a memoria come l'alfabeto, ed è anche bene che se lo tenga in qualche directory a portata di mano.
Maverick18
16-12-2005, 23:47
si, i disassemblatori traducono solo da linguaggio macchina a linguaggio assembly, ma in teoria è anche possibile tradurre il linguaggio macchina in qualcosa di abbastanza simile al codice originale C; i programmi che lo fanno si chiamano decompilatori, ed il loro mestiere non è tutto sommato così complesso come credi grazie al fatto che per certe cose esistono determinate convenzioni; ad esempio, ottenuto il disassemblato di un programma, è abbastanza semplice dividerlo in funzioni sapendo che le funzioni iniziano spesso col loro tipico codice di prologo per creare uno stack frame, cioè
PUSH EBP
MOV EBP,ESP
seguito da una istruzione
SUB ESP,qualcosa
che serve ad allocare nello stack lo spazio per le variabili locali; una volta individuato l'inizio di una funzione, è possibile ricostruire i vari tipi di statements if, while, for, do, eccetera sapendo il "pattern" secondo il quale il compilatore che ha generato quel programma assembla quegli statements; a un certo punto poi si arriva ad una qualche istruzione RET che ritorna alla funzione chiamante effettuando il cleanup dello stack (il valore di ritorno delle funzioni si trova quasi sempre in EAX).
un consiglio utile che posso darti se vuoi disassemblare il codice di un programma generato da un certo compilatore X, è quello di analizzare il codice assembly generato dallo stesso compilatore di programmi di cui hai anche i sorgenti originali: facendo il confronto tra istruzioni C e istruzioni assembly puoi capire moltissime cose su come ragiona un compilatore ;)
per finire posso anche avvisarti di non fare come molti principianti che pensano che gli eseguibili contengano codice assembly puro... il formato dei .exe è abbastanza complesso ed è abbastanza dettagliatamente documentato da Microsoft nel documento che troverai non ricordo dove in MSDN :p
qualsiasi vero cracker quel documento secondo me deve saperlo a memoria come l'alfabeto, ed è anche bene che se lo tenga in qualche directory a portata di mano.
Grazie per l'aiuto. ;)
Appena avrò tempo mi ci dedicherò.
Tra l'altro navigando qua è là ho trovato il sito di un esperto informatico italiano, Flavio Bernadotti, che ha scritto diversi libri su hacking,cracking,programmazione...
I libri sono gratuiti. Non li ho ancora letti ma scommetto che sono fatti benissimo; pensate che il libro su hacking e cracking è composto da più di 1600 pagine!! :P
Ma l'ottimizzazione del codice (per esempio quello di mingw) non influisce in qualche modo nella struttura del codice?
Ma l'ottimizzazione del codice (per esempio quello di mingw) non influisce in qualche modo nella struttura del codice?
Effettivamente ho anch'io questo dubbio... credo però che alcune cose (per esempio, chiamate a funzioni o a DLL) debbano restare intatte, pena il non funzionamento del programma. Quindi probabilmente viene alterato magari il contenuto delle funzioni, o il flusso, ma loro non dovrebbero essere stravolte... dico bene? (E' solo una speculazione... in realtà non conosco troppo approfonditamente l'argomento...) :stordita:
che io sappia qualsiasi ottimizzazione è sempre controllabile dalla riga di comando del compilatore e del linker (o dalle opzioni dell'IDE, che è la stessa cosa), quindi compilatore e linker dovrebbero ottimizzare determinati aspetti solo se il programmatore lo richiede. un esempio pratico: il programmatore vuole che i parametri di una funzione vengano passati nei 4 (o 5) registri general purpose anziché nello stack, in modo da non dover necessariamente creare uno stack frame? allora il programmatore usa la convenzione di chiamata apposita (che non ricordo come si chiama :D), ed è consapevole del fatto che la sua funzione potrebbe non avere i classici push ebp e mov ebp,esp all'inizio.
Grazie per l'aiuto ragazzi. :)
Farò come dite.
Io faccio ing informtaica ma finora non mai chiesto queste cose ai prof...ho paura che possano pensare male ;)
Scherzi a parte...durante questi anni di informatica non ho mai sentito parlare di argomenti del genere, per questo mi sono incuriosito.
e certo, il reverse e` illegale, e` quasi impossibile che ne parlino in un'Universita`. Comunque se e` per scopo didattico, o cultura personale, io non sono contro a questo genere di cose.
Quello che cerco è un buon disassembler ma finora non ne ho trovati. Inoltre mi chiedo... i disassembler ti traducono il linguaggio macchina in assembly, no ?
Non penso che esistano disassembler che traducano in C... sarebbe troppo complesso IMHO. :O
per il reverse, generalmente, servono:
http://www.datarescue.com/idabase/ (disassembler)
Numega Softice (IL debugger)
un editor esadecimale (ce ne sono centinaia)
<OT on>
ti piace l'aereonautica militare? hai lo stesso nick di quello di top gun :)
<OT off>
ti piace l'aereonautica militare? hai lo stesso nick di quello di top gun :) Tom "noi puffi siam così" Cruise!! :rotfl:
Maverick18
18-12-2005, 20:11
e certo, il reverse e` illegale, e` quasi impossibile che ne parlino in un'Universita`. Comunque se e` per scopo didattico, o cultura personale, io non sono contro a questo genere di cose.
per il reverse, generalmente, servono:
http://www.datarescue.com/idabase/ (disassembler)
Numega Softice (IL debugger)
un editor esadecimale (ce ne sono centinaia)
<OT on>
ti piace l'aereonautica militare? hai lo stesso nick di quello di top gun :)
<OT off>
Ehehe
Si gli aerei mi piacciono ma non sono un fanatico ne di Top Gun ne dell'aereonautica. :D
Mi piaceva il nome per questo ho scelto Maverick :O
Grazie per le informazioni.
Comunque secondo me è molto utile capire come funzionano i programmi degli altri. Mi spiego meglio: guardando codice scritto da programmatori in gamba si riesce a migliorare notevolmente le proprie capacità, IMHO; o almeno si capisce in che modo gente esperta lavori.
Ciao
ps. sono molto più alto di Tom Cruise.... almeno ho qualcosa in più di lui :D
Comunque secondo me è molto utile capire come funzionano i programmi degli altri. Mi spiego meglio: guardando codice scritto da programmatori in gamba si riesce a migliorare notevolmente le proprie capacità, IMHO; o almeno si capisce in che modo gente esperta lavori.
Vero, anche io la penso così, ma tieni conto che risalire da un eseguibile ad un codice sorgente bello pulito è pressocchè impossibile... usando dei programmi che fanno questo lavoro il risultato è un po' pietoso, per cui la soluzione migliore secondo me è quella di scaricarsi i sorgenti dei programmi open source... se il tuo fine è solo quello di apprendere e capire come funziona la programmazione è la scelta migliore ;)
Se ti metti a disassemblare ecc. entri in un altro mondo praticamente ;)
vero.
Maverick18, se il tuo scopo è quello di migliorare il modo in cui programmi, posso darti un consiglio? spulciati il codice di Diamond Crush :D
fek ci sta guidando bene: il codice che ci fa scrivere mira alla massima semplicità e linearità, senza contare che è quasi totalmente privo di commenti, cosa che mi piace moltissimo: non puoi sapere quanto odio quelle righe verdi che interrompono il codice e mi confondono rendendo difficile la lettura :mad:
i commenti vanno scritti solo se il codice non può in nessuna maniera autoesplicarsi, e in tal caso bisogna sempre fare attenzione che non ci sia qualcosa che non va a livello di eleganza e di correttezza concettuale.
inoltre il codice di Diamond Crush è di facilissima comprensione anche per chi non ne ha mai letto grazie agli identificatori esplicativi (BTW, forse tutto sommato VICIUS aveva ragione sulla notazione ungherese :D) e scritti esclusivamente in inglese; il checkstyle di Ant poi è una vera manosanta. ;)
Maverick18
19-12-2005, 10:44
vero.
Maverick18, se il tuo scopo è quello di migliorare il modo in cui programmi, posso darti un consiglio? spulciati il codice di Diamond Crush :D
fek ci sta guidando bene: il codice che ci fa scrivere mira alla massima semplicità e linearità, senza contare che è quasi totalmente privo di commenti, cosa che mi piace moltissimo: non puoi sapere quanto odio quelle righe verdi che interrompono il codice e mi confondono rendendo difficile la lettura :mad:
i commenti vanno scritti solo se il codice non può in nessuna maniera autoesplicarsi, e in tal caso bisogna sempre fare attenzione che non ci sia qualcosa che non va a livello di eleganza e di correttezza concettuale.
inoltre il codice di Diamond Crush è di facilissima comprensione anche per chi non ne ha mai letto grazie agli identificatori esplicativi (BTW, forse tutto sommato VICIUS aveva ragione sulla notazione ungherese :D) e scritti esclusivamente in inglese; il checkstyle di Ant poi è una vera manosanta. ;)
Va bene. Ci darò un'occhiata. :D
jappilas
19-12-2005, 11:59
Mi spiego meglio: guardando codice scritto da programmatori in gamba si riesce a migliorare notevolmente le proprie capacità, IMHO; o almeno si capisce in che modo gente esperta lavori.
questo se la gente esperta e' anche gente che tiene in considerazione l' eventualita' che altri abbiano a leggere il loro codice...
ps. sono molto più alto di Tom Cruise.... almeno ho qualcosa in più di lui :D
non e' che ci voglia molto per essere piu' alti di tom cruise credo... e' un metro e 60... :D
fek ci sta guidando bene: il codice che ci fa scrivere mira alla massima semplicità e linearità, senza contare che è quasi totalmente privo di commenti, cosa che mi piace moltissimo
anche a me... :)
Grazie per le informazioni.
Comunque secondo me è molto utile capire come funzionano i programmi degli altri. Mi spiego meglio: guardando codice scritto da programmatori in gamba si riesce a migliorare notevolmente le proprie capacità, IMHO; o almeno si capisce in che modo gente esperta lavori.
sul fatto che sia utile guardare il codice scritto da altri sono piu' che d'accordo. Ma che sia istruttivo farlo in codice assembly, su questo non sono d'accordo. Su sourceforge.net e freshmeat.net c'e` un mare di codice e programmi di ogni tipo ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.