Tiens ..douce coïncidence, justement je viens de lancer un sujet qui a provoqué un certain nombre de visites, et moultes tergiversations au sujet de l'utilisation des Shellcodes (Truc de dingues au passage et pas à la portée du premier KCC venu , rien compris ) et ou FIRACE a parlé de ce système que je ne connaissais pas non plus
http://www.purebasic.fr/english/viewtop ... 39#p520539
Bien que très intéressant, le fait que ça se perde selon certaines manips reste quand même gênant
En tout cas merci de ton très bon tuto
A.D.S : Associer des méta-données à un fichier exécutable
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: A.D.S : Associés des méta-données à un fichier exécutabl
je ne vois pas ce qui est compliqué. Teste le code figurant dans le premier message.Kwai chang caine a écrit :Bien que très intéressant, le fait que ça se perde selon certaines manips reste quand même gênant
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: A.D.S : Associés des méta-données à un fichier exécutabl
Il y a un code en Purebasic qu permet de lister les ADS, un code qui avait été repris du forum english et adapté,
le sujet original ici:
http://www.purebasic.fr/french/viewtopi ... =6&t=10964
Je l'ai légèrement modifié, je le met ici:
le sujet original ici:
http://www.purebasic.fr/french/viewtopi ... =6&t=10964
Je l'ai légèrement modifié, je le met ici:
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
;
;}
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: A.D.S : Associés des méta-données à un fichier exécutabl
Pour une fois que j'ai pas dit que c'était compliquéfalsam a écrit :je ne vois pas ce qui est compliqué. Teste le code figurant dans le premier message.Kwai chang caine a écrit :Bien que très intéressant, le fait que ça se perde selon certaines manips reste quand même gênant
J'ai pas parlé de complexité, juste que le fait du passage FAT, ZIP ou autres joyeuseries fasse perdre tes petits, c'est quand même gênant.
C'est pourquoi, je n'ai pas adopté cette méthode pour la mémorisation de mon bit, qui reste quand même peu fiable dans le cas de manipulations fréquentes des fichiers.
Bien que dans mon cas mon bit n'est pas une importance primordiale...mais ça pourrait être le cas
Maintenant encore une fois cette méthode pour la mémorisation d'un 0 ou 1, c'est un peu une pelleteuse pour ramasser les cerises
Mais c'est vrai que c'est tres bien de savoir que ça existe, et de l'utiliser dans certains cas
@NICO
Cool ton code, justement ça pourrait permettre de savoir si tu as perdu quelque chose lors de manips de dossiers complets de fichiers censés contenir et garder leur ADS
Re: A.D.S : Associés des méta-données à un fichier exécutabl
Merci Kwai chang caine, à l'époque (Window XP) tu pouvais lancer directement un exe écrit en ADS, plus possible maintenant et heureusement. Les ADS sont particuliers du fait que lorsque tu charges des datas, ceux-ci ne sont pas pris en compte pour la taille du fichier, donc parfait pour dissimuler des données Tu peux aussi écrire des ADS sur des dossiers de mémoire.
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: A.D.S : Associés des méta-données à un fichier exécutabl
Je viens de m'apercevoir que tu avais lancé le sujet en 2010, eh ben !!
C'est dommage que Bilou y ai pas pensé du début pour la FAT32, parce qu'elle reste encore pas mal utilisée, pour son age, mémé est encore vaillante de nos jours
Merci NICO, ça fait toujours plaisir de te lire, trop rarement à mon gout
C'est dommage que Bilou y ai pas pensé du début pour la FAT32, parce qu'elle reste encore pas mal utilisée, pour son age, mémé est encore vaillante de nos jours
Merci NICO, ça fait toujours plaisir de te lire, trop rarement à mon gout
Re: A.D.S : Associés des méta-données à un fichier exécutabl
Merci mais je ne programme quasiment plus; je m'amuse avec de l'arduino, j'ai acheté récemment un Adeept Remote Control Smart Car Kit (voiture directionnelle avec télécommande inclus et cartes arduino). Avec une pince (gripper) que j'ai monté sur la voiture. Ainsi il peut déplacer la voiture et choper des objets (mais la pince est fragile et très peu puissante, je viens d'en commander une nouvelle.