Il y a un code en Purebasic qu permet de lister les ADS, un code qui avait été repris du forum english et adapté,
Code : Tout sélectionner
; -------------------------------------------------------------------------------------
; Topic, du code original: http://www.purebasic.fr/french/viewtopic.php?f=6&t=17225
; -------------------------------------------------------------------------------------
; Voici un code qui permet de scanner seulement les streams Alternate Data
;(Ceux qu'on peut créer et modifier), les autres sont réservés à l'OS je crois.
; -------------------------------------------------------------------------------------
; De Nico
; Sept 2010
; Version 1.0
; Fonctionne à partir de Window 2000 (Système de Fichier NTFS)
; -------------------------------------------------------------------------------------
; Mise à jour
; PureBasic 4.61 ->PAPIPP (2012)
; PureBasic 5.61 ->Nico (2018)
; -------------------------------------------------------------------------------------
; --> Compiler en Unicode et Activer la gestion des Threads ! <--
; -------------------------------------------------------------------------------------
; Ce code permet seulement de lister les streams "Alternate Data"
; contenus dans les fichiers ou les dossiers
; -------------------------------------------------------------------------------------
;{- Enumerations / DataSections
;{ Windows
Enumeration
#Window_Main
EndEnumeration
;}
;{ Gadgets
Enumeration
#String_Dossier_Fichier
#Button_Dossier
#Button_Fichier
#ListIcon_Stream
#Button_Scan
#Button_StopperScan
#Button_SupprimerleStream
#Button_OuvrirSansExtraire
#Button_ExtraireEtEditer
#Button_Quitter
#Text_Info
#Button_OuvrirExplorateur
#BarreEtat
EndEnumeration
;}
;}
Global Chemin$
Global NomStream.s,StreamSize.q
Global FinRecherche.l
Procedure ReadStream(CheminDossier_CheminFichier.s)
Protected file_h.i,z.i,*stream.WIN32_STREAM_ID
Protected context.l=0,bytes_read.l=0,bytes_read1.l=0,seek_l=0,seek_h=0,Result.l=0
Protected namesize.l,streamHight.q,streamLow.q
file_h=CreateFile_(@CheminDossier_CheminFichier,#READ_CONTROL,0,0,#OPEN_EXISTING,#FILE_FLAG_BACKUP_SEMANTICS,0)
If file_h<>0
*stream.WIN32_STREAM_ID=AllocateMemory(20)
z=BackupRead_(file_h,*stream,20,@bytes_read,0,1,@context)
While (bytes_read<>0) And Result=0
namesize=*stream\dwStreamNameSize
If namesize>0
*buffer=AllocateMemory(namesize)
BackupRead_(file_h,*buffer,namesize,@bytes_read1,0,1,@context)
NomStream=PeekS(*buffer,namesize/2,#PB_Unicode)
FreeMemory(*buffer)
EndIf
If *stream\dwStreamID=#BACKUP_ALTERNATE_DATA
; streamHight.q=*stream\dwStreamSizeHigh & $FFFFFFFF
; streamLow.q=*stream\dwStreamSizeLow & $FFFFFFFF
streamHight.q=*stream\Size\highpart & $FFFFFFFF
streamLow.q=*stream\Size\lowpart & $FFFFFFFF
StreamSize.q=streamHight<<32 | streamLow
Result=1
EndIf
; BackupSeek_(file_h,*stream\dwStreamSizeLow,*stream\dwStreamSizeHigh,@seek_l,@seek_h,@context)
BackupSeek_(file_h,*stream\Size\lowpart,*stream\Size\lowpart,@seek_l,@seek_h,@context)
FreeMemory(*stream)
*stream.WIN32_STREAM_ID=AllocateMemory(20)
bytes_read=0
z=BackupRead_(file_h,*stream,20,@bytes_read,0,1,@context)
Wend
FreeMemory(*stream)
BackupRead_(file_h,0,0,@bytes_read,1,0,@context)
CloseHandle_(file_h)
EndIf
ProcedureReturn Result
EndProcedure
Procedure.s ParseDirectory(folder.s,id.l=0)
Protected Type.s
If Right(folder,1)<>"\"
folder+"\"
EndIf
If ExamineDirectory(id,folder,"*.*")
If FinRecherche<2
While NextDirectoryEntry(id)
If DirectoryEntryName(id)<>"." And DirectoryEntryName(id)<>".."
;##########################################
StatusBarText(#BarreEtat,0,folder+DirectoryEntryName(id))
If ReadStream(folder+DirectoryEntryName(id))
If DirectoryEntryType(id)=#PB_DirectoryEntry_Directory
Type.s="Dossier"
Else
Type.s="Fichier"
EndIf
AddGadgetItem(#ListIcon_Stream,-1,NomStream+Chr(10)+Str(StreamSize)+Chr(10)+Type+Chr(10)+folder+DirectoryEntryName(id))
EndIf
;##########################################
If DirectoryEntryType(id)=#PB_DirectoryEntry_Directory
ParseDirectory(folder+DirectoryEntryName(id),id+1)
EndIf
EndIf
Wend
EndIf
FinishDirectory(id)
EndIf
EndProcedure
Procedure ParseCheminFichierouDossier(folder.s)
Protected Type.s
If FileSize(folder)=-2
Type.s="Dossier"
Else
Type.s="Fichier"
EndIf
If ReadStream(folder)
AddGadgetItem(#ListIcon_Stream,-1,NomStream+Chr(10)+Str(StreamSize)+Chr(10)+Type+Chr(10)+folder)
EndIf
If Type="Dossier"
ParseDirectory(folder)
EndIf
EndProcedure
Procedure DisableGadgetGroup1(Etat.l)
DisableGadget(#Button_Dossier,Etat)
DisableGadget(#Button_Fichier,Etat)
DisableGadget(#Button_Scan,Etat)
DisableGadget(#Button_Quitter,Etat)
EndProcedure
Procedure DisableGadgetGroup2(Etat.l)
DisableGadget(#Button_SupprimerleStream,Etat)
DisableGadget(#Button_OuvrirSansExtraire,Etat)
DisableGadget(#Button_ExtraireEtEditer,Etat)
DisableGadget(#Button_OuvrirExplorateur,Etat)
EndProcedure
Procedure Thread(lParam.i)
ParseCheminFichierouDossier(Chemin$)
StatusBarText(#BarreEtat,0,"")
FinRecherche=0
DisableGadget(#Button_StopperScan,1)
DisableGadgetGroup1(0)
EndProcedure
Procedure OpenWindow_Window_Main()
If OpenWindow(#Window_Main,200,200,660,460,"Alternate Data Stream SPY",#PB_Window_SystemMenu | #PB_Window_TitleBar)
StringGadget(#String_Dossier_Fichier,10,25,560,25,"",#PB_String_ReadOnly)
ButtonGadget(#Button_Dossier,580,10,60,25,"Dossier")
ButtonGadget(#Button_Fichier,580,40,60,25,"Fichier")
ListIconGadget(#ListIcon_Stream,10,110,640,250,"Nom du Stream",170,#PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
AddGadgetColumn(#ListIcon_Stream,1,"Taille",60)
AddGadgetColumn(#ListIcon_Stream,2,"Type",60)
AddGadgetColumn(#ListIcon_Stream,3,"Chemin",360)
ButtonGadget(#Button_Scan,100,70,175,25,"Scan Alternate Data Stream")
ButtonGadget(#Button_StopperScan,330,70,175,25,"Stopper le Scan")
ButtonGadget(#Button_SupprimerleStream,335,370,145,25,"Supprimer le Stream")
ButtonGadget(#Button_OuvrirSansExtraire,10,370,145,25,"Ouvrir sans extraire")
ButtonGadget(#Button_ExtraireEtEditer,170,370,145,25,"Extraire et éditer")
ButtonGadget(#Button_Quitter,265,405,130,25,"Quitter")
TextGadget(#Text_Info,10,5,520,20,"Vous pouvez glisser-déposer un Fichier ou un Dossier dans la zone de texte ci-dessous")
ButtonGadget(#Button_OuvrirExplorateur,495,370,155,25,"Ouvrir dans l'explorateur")
CreateStatusBar(#BarreEtat,WindowID(#Window_Main))
AddStatusBarField(#PB_Ignore)
EnableGadgetDrop(#String_Dossier_Fichier,#PB_Drop_Files,#PB_Drag_Copy)
DisableGadget(#Button_StopperScan, 1)
DisableGadgetGroup2(1)
EndIf
EndProcedure
OpenWindow_Window_Main()
;{- Event loop
Repeat
Select WaitWindowEvent()
; ///////////////////
Case #PB_Event_GadgetDrop
Select EventGadget()
Case #String_Dossier_Fichier
Files$=EventDropFiles()
Count=CountString(Files$,Chr(10))+1
SetGadgetText(#String_Dossier_Fichier,StringField(Files$,1,Chr(10)))
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_Dossier
Chemin$=PathRequester("Choisissez un répertoire:","C:\")
SetGadgetText(#String_Dossier_Fichier,Chemin$)
Case #Button_Fichier
Chemin$=OpenFileRequester("Choisissez un fichier:","C:\","*.*",0)
SetGadgetText(#String_Dossier_Fichier,Chemin$)
Case #ListIcon_Stream
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
DisableGadgetGroup2(0)
Else
DisableGadgetGroup2(1)
EndIf
Case #Button_Scan
ClearGadgetItems(#ListIcon_Stream)
Chemin$=GetGadgetText(#String_Dossier_Fichier)
If FileSize(Chemin$)<>-1
DisableGadgetGroup1(1)
DisableGadgetGroup2(1)
DisableGadget(#Button_StopperScan,0)
FinRecherche=1
CreateThread(@Thread(),0)
Else
MessageRequester("Info","Choisissez un chemin de Dossier ou de Fichier valide!")
EndIf
Case #Button_StopperScan
FinRecherche=2
DisableGadget(#Button_StopperScan,1)
DisableGadgetGroup1(0)
Case #Button_OuvrirSansExtraire
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
NameStream=StringField(NameStream,2,":")
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
MessageRequester("Info","Dans certain cas, Notepad ne sera pas en mesure d'ouvrir le Stream !"+Chr(13)+"mais vous pouvez toujours faire une Extraction puis ensuite éditer le Fichier ainsi obtenu.")
RunProgram("Notepad.exe",CheminStream+":"+NameStream,"")
EndIf
Case #Button_ExtraireEtEditer
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
NameStream=StringField(NameStream,2,":")
Taille.s=GetGadgetItemText(#ListIcon_Stream,Index,1)
If Taille<>"0"
NomFichier$=SaveFileRequester("Choisissez un emplacement:",NameStream,"*.*",0)
If NomFichier$<>""
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
If ReadFile(0,CheminStream+":"+NameStream)
Longueur.q=Lof(0)
*Buffer=AllocateMemory(Longueur)
ReadData(0,*Buffer,Longueur)
CloseFile(0)
If CreateFile(0,NomFichier$)
WriteData(0,*Buffer,Longueur)
CloseFile(0)
ret = MessageRequester("Erreur","Voulez vous ouvrir ce fichier? " + Chr(10) + NomFichier$, #PB_MessageRequester_YesNo)
If ret = #PB_MessageRequester_Yes
RunProgram("Notepad.exe",NomFichier$,"")
EndIf
Else
MessageRequester("Erreur","Impossible de créer le fichier! " + Chr(10) + NomFichier$ )
EndIf
FreeMemory(*Buffer)
Else
MessageRequester("Erreur","Le Stream n'a pas pu être sauvegardé!")
EndIf
EndIf
Else
MessageRequester("Info","La Taille de ce Stream est de 0 octet, il est inutile de vouloir le sauvegarder!")
EndIf
EndIf
Case #Button_SupprimerleStream
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
NameStream=StringField(NameStream,2,":")
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
Type.s=GetGadgetItemText(#ListIcon_Stream,Index,2)
Message$="Êtes-vous sûr de vouloir supprimer le Stream : "+NameStream+" ?"+Chr(13)+"du "+Type+" "+CheminStream
Resultat=MessageRequester("Attention",Message$,#PB_MessageRequester_YesNo)
If Resultat=#PB_MessageRequester_Yes
If DeleteFile(CheminStream+":"+NameStream)<>0
RemoveGadgetItem(#ListIcon_Stream,Index)
Else
MessageRequester("Erreur","Le Stream n'a pas pu être effacé!")
EndIf
EndIf
EndIf
Case #Button_OuvrirExplorateur
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
RunProgram("Explorer.exe","/e, /Select,"+CheminStream,"")
EndIf
Case #Button_Quitter
CloseWindow(#Window_Main)
Break
EndSelect
; ////////////////////////
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Window_Main
If FinRecherche=0
CloseWindow(#Window_Main)
Break
Else
MessageRequester("Info","Cliquez sur le Bouton Stopper le Scan avant de quitter!")
EndIf
EndSelect
EndSelect
ForEver
;
;}