Newsgroup: it.comp.lang.delphi
Titolo: Usare DEBUG sotto DELPHI

Ciao a tutti, 
innanzitutto scusate se ciò che scrivo in qualche modo è inesatto e si
scontra con i presupposti sui quali si basa Delphi che non conosco a fondo.
Vorrei poter utilizzare il DEBUG di DOS per poter effettuare delle
operazioni di lettura e scrittura del boot sector del HARD-DISK, per poter
cambiare il SERIALE DEL VOLUME HARDDISK. Pensavo di utilizzare il DEBUG
che gira sotto dos e che è presente in ogni sistema Windows.
In particolare dalla linea di prompt DOS si apre il debugger scrivendo
DEBUG seguito da enter, apparirà un trattino -, dal quale posso inviare le
diverse istruzioni che mi interessano.
Il problema è come inviare le istruzioni da delphi direttamente
all'applicazione DEBUG aperta. In maniera tale che il DEBUG non sia
visibile all'utente.
Chiedo a qualcuno se è possibile. Avevo visto di sfuggita tempo fa una
tastiera visrtuale da qualche parte che con il click del mouse simulava la
pressione di un tasto. 
Forse il problema è davvero complicato, ma se si potesse aprire una
finestrina di DOS col debug e ShellExecute credo si potrebbero risolvere
molti problemi. Anche legati alla modifica in linguaggio macchina di
eseguibili, compresa la possibilità di inserire chiavi di utilizzo di
patch .EXE che girano sotto DOS.
Ciao
--- posted by geoForum on 
http://www.delphiedintorni.it

 operazioni di lettura e scrittura del boot sector del HARD-DISK
il debug serve per tracciare l'esecuzione dei programmi, non ha niente a che 
vedere con l'accesso ai settori fisici del disco.
Avalon 

 niente a che vedere con l'accesso ai settori fisici del disco.
correggo: pare ci siano due comandi "L" e "W" per leggere e scrivere 
direttamente sul disco.
Qui trovi un esempio di utilizzo:
http://support.microsoft.com/default.aspx?scid=kb%3Bit%3B76899
io comunque non giocherei con il primo settore del disco, corri il rischio 
di fare seri casini e rendere inaccessibili tutte le partizioni. Ti era già 
stata data una soluzione giorni fa per modificare l'ID di volume della 
partizione, perchè stai cercando di complicarti la vita?
Se parli di "SERIALE DEL VOLUME" dici un nonsense: se intendi l'ID di volume 
usa la soluzione che ti è stata data ; il SERIALE DEL DISCO invece non è 
modificabile perchè sta nella rom del disco stesso che è a sola lettura.
Il debug in ogni caso non accetta script, quindi non è pilotabile in modo 
diretto, salvo creare una console e interagirci con complessi meccanismi di 
handle finestra, simulazione di tasti e roba simile. Meglio evitare sta 
roba.
Avalon 

Matteo Taverna ha scritto:
<super cut>
Dimentica il DEBUG (il DOS e' morto anni fa).
Dimentica di poter fare in maniera semplice con Delphi quello 
che chiedi.
Se proprio sei masochista (e molto avventuroso) documentati sull'
interrupt BIOS 13h. Vedi, per esempio, se FIPS puo' fare quello che 
chiedi.
Se ti serve qualche PC dove fare esperimenti, conosco un paio
di persone insopportabili che sarebbero davvero felici di
provare il tuo programmino ;-)
Ciao.
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ti ringrazio molto...
Correggo Seriale con ID che effettivamente è il termine più appropriato.
VOLUME ID è un ottimo programma, ma purtroppo non può essere distribuito.
Il problema è che nascondere il .exe VolumeID nel programma
significherebbe metterlo su un CD-ROM che verrebbe venduto (circa 50
copie). Se ci fosse un controllo sull'utility venduta qualcuno potrebbe
accorgersene.
Stavo cercando una soluzione ad-hoc ma non sembra cosa semplice.


Credevo fosse tutto molto più semplice...
Grazie per l'aiuto, FIPS davvero interessante. Bisognerebbe provare a
modificare soltato l'ID del disco per vedere se si creino dei problemi seri.
Sicuramente un'operazione rischiosa.
Grazie e Ciao


 Stavo cercando una soluzione ad-hoc ma non sembra cosa semplice.
Non e' cosa semplice perchè, di fondo, cambiare il volume-id dell' HD non è
una procedura di ordinaria amministrazione: molti software si legano a
quello per uno schema di protezione anticopia.
Ergo, ti suggerisco di cercare strade pià "praticabili" che tentare un hack
di questo tipo per eludere uno o più software quali i firewall.
-- 
Morde. 
(email fittizia, non sono contattabile)
ICLDweb: 
http://www2.samatel.com/icld/

Grazie,
Ma č davvero cosě complesso andare a sostituire gli 8 byte del Volume-ID ? 
Qui sotto la locazione dove inizia, esattamente alla 0x48 troviamo ID per
una partizione NTFS. Nell'esempio dato da Microsoft 14 A5 1B 74 C9 1B 74 1C.
Physical Sector:Cyl 0, Side 1, Sector 1 
00000000:EB 52 90 4E 54 46 53 20 -20 20 20 00 02 08 00 00 .R.NTFS ........
00000010:00 00 00 00 00 F8 00 00 -3F 00 FF 00 3F 00 00 00 ........?...?...
00000020:00 00 00 00 80 00 80 00 -4A F5 7F 00 00 00 00 00 ........J.......
00000030:04 00 00 00 00 00 00 00 -54 FF 07 00 00 00 00 00 ........T.......
00000040:F6 00 00 00 01 00 00 00 -14 A5 1B 74 C9 1B 74 1C ...........t..t.
00000050:00 00 00 00 FA 33 C0 8E -D0 BC 00 7C FB B8 C0 07 .....3.....|....


 Ma è davvero così complesso andare a sostituire gli 8 byte del Volume-ID ?
Effettivamente io non lo vedrei poi così complicato...
proprio recentemente ho scritto un software - con D7 - VFillZero (che 
immaginazione per il titolo :-)  ) che scrive zero byte per byte ma tempo 
addietro mi ero fatto una piccola interfaccia grafica che sfogliava di 
settore in settore l'hard disk e potevo modificare i dati visualizzati...
ho usato le API
V.

ovviamente il tutto sotto win, ma forse la tua esigenza è di lavorare col 
Dos
in questo caso io mi ero trovato bene con il C++ 5 di Borland utilizzando, 
se ricordo bene,  la funzione Dos BiosDisk
V.

 significherebbe metterlo su un CD-ROM che verrebbe venduto 
???
Stai cercando di modificare il numero di serie del volume di chi acquista
il tuo software?


 Dimentica il DEBUG (il DOS e' morto anni fa).
DEBUG è un'ottima utility, comunque, con la quale si possono scrivere dei
piccoli .COM d'utilità.  Certo, per cose più complesse, meglio dotarsi di
un buon assemblatore (vedi nasm, ma ormai con il masm di MS si è in grado
di scrivere in maniera quasi procedurale).


 Effettivamente io non lo vedrei poi così complicato...
Avete ragione entrambi.
La complessità cui mi riferisco non è tanto nell'andare a scrivere 8 byte
su una locazione fisica dell'hd quanto nelle conseguenze del fare questa
scrittura.
Una forzatura potrebbe causare reazioni non considerate a priori da parte
di sofware particolari (antivirus, firewall, progs protetti, ecc)
Un mio programma, ad esempio, se cambia il volume HD si blocca perche'
pensa di trovarsi su un'altra macchina e quindi la licenza d'uso sarebbe
stata infranta..


Credo che potrebbe risolvere il mio problema.
Anche sotto windows...
Esiste per caso una routine potresti postare senza difficoltà... ? Se si
te ne sarei davvero grato.
Grazie e Ciao :-D


 te ne sarei davvero grato.
devo cercare, stasera ci do un'occhiata
so che per accedere al disco avevo utilizzato l'API CreateFile() e cambiati 
alcuni parametri della funzione stessa
poi con WriteFile() ci scrivevo sopra settore per settore
immagino tu debba utilizzare una sorta di SEEK per spostarti di byte in byte
se lo riesco a trovare te lo posto ma cmq non dovrebbe essere difficile 
scriverlo (se ci sono riuscito io...)
V.


Vedi questa unit in Delphi:
http://www.efg2.com/Lab/Library/Delphi/IO/DejanMaksimovicAlfa32.zip
Non sono sicuro funzioni su tutte le versioni di Windows.
Ciao
ACSH
-- 
Il più grande sbaglio nel progettare software
a prova di stupido è sottostimare l'enorme
ingegnosità degli stupidi. 

 devo cercare, stasera ci do un'occhiata
niente, ho spulciato tutti gli hd ma chissà dov'è finito...era un progetto
incompleto...magari l'ho chiamato prova (pessima abitudine, molto
confusionaria ma tant'è...)
comunque io penso che ti basti:
accedere al disco con CreateFile()
leggere il settore che ti interessa con ReadFile() e caricarlo in memoria
sostituire i byte nel buffer
sovrascrivere il settore con quello modificato con WriteFile()
altrimenti dovresti usare SetFilePointer per spostarti direttamente nel
disco ma personalmente preferisco la prima opzione
Ciao
V.

http://www.efg2.com/Lab/Library/Delphi/IO/DejanMaksimovicAlfa32.zip
Grazie :-)


il tuo software?
No, praticamente la persona che lo ha commissionato deve creare un'utility
per fini aziendali che permetta di scegliere il seriale del HD.
Anche io personalmente ne ignoro a fondo l'utilità, ma credo che la
persona che me l'ha chiesto sappia bene cosa va a fare, almeno spero...


Grazie davvero, 
Giŕ l'informazione data č davvero utile....


 Già l'informazione data è davvero utile....
la completo per quanto mi è possibile:
var
  hFile: THandle;
  MyDrive: AnsiString;
  MyDevice: Array[0..5] of Char;
  MyBuffer: Array [0..511] of Char;
  BytesRead: DWord;
  BytesWritten: DWord;
begin
  MyDrive := '\\.\A:';
  StrPCopy(@MyDevice, MyDrive);
  hFile :=  CreateFile( MyDevice,GENERIC_READ OR
GENERIC_WRITE,FILE_SHARE_READ OR
FILE_SHARE_WRITE,NIL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0 );
  { leggi i settori sequenzialmente in un ciclo }
  ReadFile(hFile, MyBuffer, SizeOf(MyBuffer), BytesRead, nil);
  { modifichi MyBuffer come vuoi e lo riscrivi su disco }
  WriteFile(hFile, MyBuffer, SizeOf(MyBuffer), BytesWritten, nil);
  CloseHandle(hFile);
end;
Ovviamente ottimizza, è un pezzo di codice dei miei vari esperimenti
Ciao
V.

Thanks :-)


 Ma è davvero così complesso andare a sostituire gli 8 byte del Volume-ID ? 
No.  Il problema vero è perché vuoi farlo.


Ho implementato quanto detto in DEBUG, però in NTFS windows blocca
l'accesso al boot sector... Bisognerebbe scrivere un programmino che giri
a livello inferiore e dargli il run prima del riavvio di windows.... Poi
si autocancella.... Penso che VolumeID faccia la stessa cosa, vedi
necessario riavvio per partizioni NTFS....
Oppure dare un boot da floppy ... ma è più macchinoso....


di scrivere in maniera quasi procedurale).
Infatti
Procedure TForm1.INVIOIstruzione(TestoISTR:String); 
var x : integer; begin 
// Qui manda :  
if TestoISTR=':' then begin 
keybd_event(Vk_Shift, 1, 0, 0); 
keybd_event(VkKeyScan(':'), 1, 0, 0); 
keybd_event(VkKeyScan(':'), 1,KEYEVENTF_KEYUP, 0); 
keybd_event(Vk_Shift, 1, KEYEVENTF_KEYUP, 0); 
exit;
end; 
// Questa funziona con ENTER per il DEBUG con 28 ???? 
if TestoISTR='$' then begin 
keybd_event(VkKeyScan(#13), 28, 0, 0); 
keybd_event(VkKeyScan(#13), 28, KEYEVENTF_KEYup, 0); 
exit; end; 
for x:=1 to length(TestoISTR) do begin
keybd_event(VkKeyScan(TestoISTR[X]),
MapVirtualKey(VkKeyScan(TestoISTR[X]), 0), 0, 0);
keybd_event(VkKeyScan(TestoISTR[X]),
MapVirtualKey(VkKeyScan(TestoISTR[X]), 0), KEYEVENTF_KEYUP, 0); 
end; 
end; 
procedure TForm1.Button1Click(Sender: TObject); 
begin
winexec('debug',SW_SHOWNORMAL); 
// Qui metti una procedura che attende 300 ms.
Delay (300); 
INVIOISTRUZIONE('- l X 0 0 1'); 
INVIOISTRUZIONE('$'); 
// dove al posto di X devi mettere 
// X=0 floppy A, X=1 disco B, X=2 disco C etc....
// fino a qui va a leggere il boot sector... Poi cambiamenti con istruz. E 
// andrò a risciverlo con l'istruzione w. Nota x NTFS blocca l'accesso !
end;
Per il momento funziona su partizioni non NTFS !


di scrivere in maniera quasi procedurale).
Infatti




procedure TForm1.Button1Click(Sender: TObject); 
begin
winexec('debug',SW_SHOWNORMAL); 




end;

--- posted by geoForum on 
http://www.delphiedintorni.it

Come sopra


 per fini aziendali che permetta di scegliere il seriale del HD.
"per fini aziendali...." questa espressione mi fa pauuuuuuuuura :O
:D


Anche a me... :-D
Credo comunque si tratti di una rete che viene costruita sulla base degli
HD che vi accedono.... Ogni HD ha un suo codice e il sistema .... Arrivo a
capire fin qui...


A prop. leggevo sulla licenza che Delphi non č utilizzabile per pilotare
aerei e missili... etc..
E' sicuramente una bellissima notizia che chi produce strumenti SW e che
una casa come Borland non li metta a disposizione per questo genere di
cose... 
Mi domando perň chi utilizzerebbe delphi per pilotare gli aerei o i
missili ??? :-)


 missili ??? :-)
sarebbe impossibile in ogni caso, visto che aerei e missili non hanno 
Windows "sotto la scocca" :-)
Avalon 

E' vero a tale proposito che la Missione su Marte è in parte fallita a
causa  di una .Dll di Microsoft per pilotare un PIII intel che è crashata
a causa di un virus ?



La missione Apollo 11 è stata gestita da un computer equivalente ad un
Commodore 64.
La missione Pathfinder su Marte è stata gestita da un PC basato su CPU 80386.


 CPU 80386.
per ragioni principalmente di consumo energetico, pare. D'altronde per 
acquisire dati da una manciata di sensori, e muovere 4 motori non ci voleva 
mica un banco di processori in parallelo ;-) Le batterie invece, fonte Nasa, 
erano economicissime batterie che si trovavano in commercio normalmente. 
Pare sia stata una missione molto economica, una vera e propria sfida al 
budget.
Avalon 

 crashata a causa di un virus ?
tutto può essere, ma a me sembra un pò la solita storiella anti-microsoft. 
Quando ti raccontano ste robe, chiedi sempre qual è la fonte, accertandoti 
possibilmente che la risposta non sia "lo ho saputo da un amico di mio 
cuGGino, quello che fa 120 in salita con la Vespa con i pezzi 75, e una 
volta era pure morto" ;-)
Avalon