PDA

View Full Version : Chiarimenti EOF?


Andrea993
28-06-2010, 18:29
Per quello che so l'end of file (EOF) è un carattere che indica la fine del file.
Vorrei che qualcuno me ne parlasse specificatamente e mi spieghi a cosa serve, il carattere usato ecc.

Vi chiedo questo perchè devo sviluppare un programma, nel quale, una volta sviluppato e compilato, voglio aprirlo con un editor esadecimale e inserire il carattere di EOF all'inizio del file in modo che non venga eseguito finchè il carattere di EOF non verrà successivamente rimosso con un editor esadecimale.

Spero abbiate capito, anche se sembra un azione inutile vi assicuro che vi ho trovato un utilità....

pabloski
28-06-2010, 19:02
l'EOF non è un carattere, almeno non più

in passato, nel dos, all'epoca delle telescriventi, ecc... il carattere ascii 26 era l'end of file e veniva onorato

oggi puoi benissimo mettere un eof in un file ma nessun programma bloccherà la lettura del file solo perchè c'è quel codice

l'eof oggi è una notazione simbolica usata in C e altri linguaggi per indicare la condizione di raggiunta fine di un file e nulla più

non c'è modo di usare l'eof per creare file illegibili

Andrea993
28-06-2010, 19:05
Grazie per il chiarimento...allora come posso modificare con un editor esadecimale per far sì che il programma non venga eseguito, senza riscontrare errori e rallentamenti?

Rsk
28-06-2010, 19:21
Grazie per il chiarimento...allora come posso modificare con un editor esadecimale per far sì che il programma non venga eseguito, senza riscontrare errori e rallentamenti?
Non è più semplice una textbox dove richiedi una password e, se corretta, il programma viene avviato?

Andrea993
28-06-2010, 19:28
No non è questo il punto...il mio caso richiede che per forza il file venga bloccato o avviato tramite una modifica a livello esadecimale...

pabloski
28-06-2010, 19:37
Grazie per il chiarimento...allora come posso modificare con un editor esadecimale per far sì che il programma non venga eseguito, senza riscontrare errori e rallentamenti?

se parli di eseguire allora stiamo parlando di programmi e non di file qualunque

se devi evitarne l'esecuzione puoi benissimo cambiare con un editor esadecimale le prime istruzioni dell'eseguibile e mettere un jump che punta ad un blocco di codice che visualizza un messaggio ed esce oppure esce soltanto

ma esattamente qual'è l'obiettivo?

Andrea993
28-06-2010, 19:59
Il jump sarebbe perfetto ma non ho idea di come farlo...
Sottolineo, però che non sto programmando sotto intel o amd

pabloski
28-06-2010, 20:14
Il jump sarebbe perfetto ma non ho idea di come farlo...
Sottolineo, però che non sto programmando sotto intel o amd

jump è solo per dire salto, poi ogni architettura di processore lo implementa tramite istruzioni sue

gli intel lo chiamano jmp, arm li chiama bne, beq, ecc...

sostanzialmente si tratta di modificare l'eseguibile, quindi conoscere il formato dell'eseguibile, l'entry point, ecc...

ovviamente bisogna conoscere a menadito l'assembly

ma la soluzione potrebbe essere mille volte più semplice....non so sotto windows, ma sotto i sistemi unix ( linux e macos compresi ) puoi semplicemente togliere i permessi d'esecuzione all'eseguibile....ovviamente chiunque abbia la capacità di cambiare i permessi può risettare quello di esecuzione

Andrea993
28-06-2010, 20:31
Il problema è che sto lavorando sotto symbian...
grazie a tutti per l' aiuto. Non conosco i comandi del processore symbian e questo mi blocca

fero86
28-06-2010, 21:03
soluzione stupidissima: potrebbe funzionare il modificare a casaccio i primi tot bytes del file (salvando gli originali da qualche parte) in maniera tale da renderlo illeggibile e quindi ineseguibile? poi per ripristinarlo basterebbe riscriverci i bytes corretti.

Andrea993
29-06-2010, 00:43
Buona idea ma siamo sicuri che poi non escano messaggi di errore?

cionci
29-06-2010, 08:34
Potresti ad esempio scrivere il file all'interno del tuo eseguibile, sempre il che il SO lo permetta. Ti lasci un buffer di memoria allocato ed inizializzato staticamente all'interno del tuo eseguibile grande quanto la massima lunghezza del file. Ogni volta sovrascrivi quella parte dell'eseguibile con il numero file.
Tra l'altro puoi sbizzarrirti anche in codifiche varie ;)

eraser
29-06-2010, 08:50
l'eseguibile è di Windows o Linux? Se è Windows è semplicissimo, basta che sostituisci l'MZ all'inizio del file con mz e hai risolto. Il file non parte piu

Edit: leggo ora che non stai sviluppando sotto Amd o Intel, quindi deduco che sia un caso particolare. Semplicemente sostituisci i primi bytes all'entrypoint (o il primo, dipende da quale istruzione usi) con un return. L'esecuzione termina lì

cionci
29-06-2010, 09:19
Anche io aveov letto male :(
Il problema dei compilatori odierni è che sono troppo intelligenti, se metti un controllo banale su un stringa che è sempre vero loro ti tolgono completamente la stringa e il controllo.
Con cosa sviluppi ?

tomminno
29-06-2010, 10:31
No non è questo il punto...il mio caso richiede che per forza il file venga bloccato o avviato tramite una modifica a livello esadecimale...

Non fai prima a scrivere un file anche vuoto da qualche parte, la cui presenza venga controllata dal tuo eseguibile?
Se sviluppi con Qt potresti provare qualcosa con le risorse qrc (una immagine tutta di 0), anche se non ho idea di come funzionino su Symbian.

Ma su Symbian ci sono editor esadecimali?

A che scopo un blocco del genere?

lovaz
29-06-2010, 11:32
#ifdef?

Andrea993
29-06-2010, 12:05
LConoscete rompatcher?
E' un programma che permette di modificare a livello esadecimale gli eseguibili contenuti nella rom.
Io devo far si che il programma parta all'avvio del cellulare solo quando da rompatcher si sceglie di abilitare il suo avvio

tomminno
29-06-2010, 12:38
LConoscete rompatcher?
E' un programma che permette di modificare a livello esadecimale gli eseguibili contenuti nella rom.
Io devo far si che il programma parta all'avvio del cellulare solo quando da rompatcher si sceglie di abilitare il suo avvio

Scusa la domanda ma hai i sorgenti del software?
Perchè se non li hai è inutile modificare il binario andrai incontro soltanto a crash dell'applicativo.

Andrea993
29-06-2010, 12:40
Ma devo svilupparlo io il software.......

tomminno
29-06-2010, 12:44
Ma devo svilupparlo io il software.......

E allora a che ti serve rompathcer?
Non puoi utilizzare un banale file di configurazione?
La prima cosa che fai è controllare il valore di una variabile se false il tuo programma esce senza fare niente.

Andrea993
29-06-2010, 13:09
Voglio scegliere se il programma si avvii o meno tramite rompatcher poichè deve essere posizionato in autorun nel cellulare

tomminno
29-06-2010, 13:24
Voglio scegliere se il programma si avvii o meno tramite rompatcher poichè deve essere posizionato in autorun nel cellulare

Non capisco la differenza.
Il programma si avvia legge il suo file di configurazione e decide se continuare o meno l'esecuzione. Che sia in autorun o meno non vedo il problema.

Ryuzaki_Eru
29-06-2010, 13:43
Non vedo perchè complicarsi la vita in questo modo. Come ha detto tommino, un semplice file di configurazione risolve il problema. A prescindere che sia messo in autorun o meno.

Andrea993
29-06-2010, 14:10
Mi serve con rompatcher..quindi come posso fare?

wingman87
29-06-2010, 14:18
Hai provato la soluzione che ha proposto fero86?

Andrea993
29-06-2010, 14:39
x ora sto raccogliendo idee...è da provare

tomminno
29-06-2010, 14:39
Mi serve con rompatcher..quindi come posso fare?

Inglobare una risorsa di tipo immagine tutta nera, e la vai a modificare con rompatcher, se il software trova un pixel non nero si auto termina. Metodo abbastanza barbaro, ma per lo meno non vai ad intaccare il codice.
Anche se su Symbian un eseguibile deve essere firmato digitalmente per poter essere messo in autorun. Una eventuale modifica binaria comprometterà la firma e quindi l'eseguibilità? Sinceramente non ne ho idea.

Ancora non capisco perchè con rompatcher, non mi risulta che ci sia niente che obblighi ad usare questa strada.

cionci
29-06-2010, 14:47
Non hai ancora detto gli strumenti che usi per sviluppare il tuo programma, perché qualcosa si può fare anche direttamente da codice..

fero86
29-06-2010, 14:47
poi un giorno Andrea993 ci spiegherá a che diavolo serve tutta sta cagnara, cosi finalmente potremo dirgli qual era il modo corretto di ottenere il risultato. :mbe:

tomminno
29-06-2010, 15:03
Non hai ancora detto gli strumenti che usi per sviluppare il tuo programma, perché qualcosa si può fare anche direttamente da codice..

Direi che se vuole sviluppare per Symbian senza sputare sangue il Nokia Qt SDK uscito or ora è l'unica soluzione praticabile.
Carbide + Symbian SDK è veramente l'ambiente di sviluppo più terrificante che esista.

cionci
29-06-2010, 15:30
Io mi riferivo ad una funzione in C++ scritta in un sorgente a parte, compilata senza ottimizzazioni, poi linkata a tutto il progetto. In questa funziona si esce dal progetto comparando una stringa costante ad un'altra. Se non si ottimizza il compilatore tradurrà tutto pari pari.
Nel sorgente principale c'è una funzione che va a modificare l'eseguibile ad un determinato offset inserendo una costante stringa diversa a seconda se si vuole o meno far partire l'eseguibile.
Basterà quindi trovare nell'eseguibile l'offset della costante stringa con un editor esadecimale, poi usare questo offset nella funzione che va a modificare l'eseguibile. Ricompilare e a runtime poter determinare a piacere se l'eseguibile debba partire o meno.

Andrea993
01-07-2010, 01:46
è possibile invece scrivere in un allocazione di memoria in esadecimale così che se l'allocazione di memoria è diversa il programma non venga eeguito?? se sì come faccio???

cionci
01-07-2010, 08:48
Un piccolo esempio in C:

main.c:
#include <stdio.h>

int main()
{
int i;
test();
for(i = 0; i < 10; ++i)
printf("Ciao");
}

test.c:

#include <stdlib.h>
void test()
{
char *s = "ciao";
if(strcmp(s, "xxxx"))
exit(0);
}

gcc -c -O0 test.c -o test.o
gcc -O3 main.c test.o -o main.exe

In questo modo se vai a vedere con un editor esadecimale, modificando la parola "ciao" in "xxxx" il programma viene eseguito. La modifica la puoi fare automaticamente in main.c (sempre che il SO ti consenta di sovrascrivere una parte di un eseguibile in esecuzione), andando prima a compilare l'eseguibile con un offset generico, poi individuando l'offset della parola da modificare nell'eseguibile e andandolo ad inserire in main.c. Ovviamente dopo devi nuovamente compilare. Cambiando un semplice valore l'eseguibile risultante dovrebbe essere identico al precedente, tranne che per quel valore, quindi l'offset è ancora valido.
Ci sarebbero anche altre alternative alla ricompilazione, ad esempio inserendo un pattern particolare come offset. Questo pattern particolare lo ricerchi con un hex editor e lo modifichi con l'offset corretto.