A.D.S : Associer des méta-données à un fichier exécutable

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
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

Message par Kwai chang caine »

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 8O, rien compris :oops:) et ou FIRACE a parlé de ce système que je ne connaissais pas non plus :wink:
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 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
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

Message par falsam »

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
je ne vois pas ce qui est compliqué. Teste le code figurant dans le premier message.
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%
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par nico »

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:

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
;
;}
Avatar de l’utilisateur
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

Message par Kwai chang caine »

falsam a écrit :
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
je ne vois pas ce qui est compliqué. Teste le code figurant dans le premier message.
Pour une fois que j'ai pas dit que c'était compliqué 8O
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 :mrgreen:
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 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par nico »

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.
Avatar de l’utilisateur
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

Message par Kwai chang caine »

Je viens de m'apercevoir que tu avais lancé le sujet en 2010, eh ben !! 8O
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 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par nico »

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.
Répondre