Page 1 sur 2

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

Publié : jeu. 12/avr./2018 18:05
par falsam
A.D.S. (Alternate Data Stream) est une technologie apparu en 1993 et utilisable qu'avec des disques formatés NTFS uniquement ce qui est le cas de la majorité des ordinateurs en 2018.

Cette technologie consiste à ajouter un ou plusieurs flux de données à un fichier existant.

Ces flux de données peuvent être de toutes natures (texte, graphique, code exécutable...).

Ces flux sur le disque sont sous la forme application.exe:nomduflux et sont jusqu'à présent invisibles (Presque invisibles :wink: )

C'est ce que nous allons voir avec ce code qui permet de compter le nombre de fois qu'un exécutable est lancé.

Deux petites procédures :

ReadADS(ADS.s) pour lire un flux de données ADS associé à un éxécutable.
WriteADS(ADS.s, Value.s) pour écrire dans un flux de données associé à un exécutable.

Code : Tout sélectionner

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure

Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure

;Read and show number of lauches
NumberofLauches$ = ReadADS("NUMBEROFLAUCHES")

MessageRequester("Number of launches", Str(Val(NumberofLauches$)))

;Write number of lauches  + 1 
NumberofLauches = Val(NumberofLauches$) + 1 
WriteADS("NUMBEROFLAUCHES", Str(NumberofLauches))
Créer un éxécutable avec ce code et lancer le.

La première fois vous aurez la valeur 0 puis au second lancement 1, troisième lancement 2, etc ....

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

Publié : jeu. 12/avr./2018 18:19
par falsam
Vous pouvez déplacer l'exécutable d'un dossier à un autre dossier ou sur un autre support comme une clé USB et tester sur un autre ordinateur, le compteur continuera à s'incrémenter.

Dans mon commentaire précédent, j'ai dit que les flux de données étaient presque invisibles car on peut les lister avec l'utilitaire AlternateStreamView v1.54 de l'éditeur NirSoft.

Image

Site https://www.nirsoft.net/utils/alternate ... reams.html (Download en fin de page)

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

Publié : jeu. 12/avr./2018 18:28
par Ar-S
Court et simple.
Sympa pour faire un exe de demo de soft exécutable x fois par exemple.

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

Publié : jeu. 12/avr./2018 18:42
par falsam
Ar-S a écrit :Sympa pour faire un exe de demo de soft exécutable x fois par exemple.
Ouiiiii

Ce deuxième exemple enregistre deux fluxs associés à l’exécutable.
- Le compteur vu précédemment,
- La date et heure du dernier lancement.

Code : Tout sélectionner

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure

Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure


;Read and show number of lauches
NumberofLauches$ = ReadADS("NUMBEROFLAUCHES")
Time$ = ReadADS("LASTTIME")

MessageRequester("Number of launches", Str(Val(NumberofLauches$)) + " Last run  " + Time$)

;Write number of lauches  + 1 
NumberofLauches = Val(NumberofLauches$) + 1 
WriteADS("NUMBEROFLAUCHES", Str(NumberofLauches))

;Write last time
Time$ = FormatDate("%dd/%mm/%yyyy - %hh:%ii:%ss", Date())
WriteADS("LASTTIME", Time$)

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

Publié : jeu. 12/avr./2018 19:24
par Fig
Très intéressant... :idea:

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

Publié : jeu. 12/avr./2018 22:20
par falsam
Avec cet exemple nous allons stocker le contenu d'une structure dans un flux de données associé à l’exécutable.

Cette structure reprend les variables de l'exemple précédent.

Code : Tout sélectionner

Structure Parameter
  NumberOfLauches.i
  Time.s
EndStructure
Define Setup.Parameter
Et sera sauvegardée dans un objet JSON.

Code : Tout sélectionner

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure

Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure

;Test area
Structure Parameter
  NumberOfLaunches.i
  Time.s
EndStructure
Define Setup.Parameter

;Read and show number of lauches
If ParseJSON(0, ReadADS("SETUP"))
  ExtractJSONStructure(JSONValue(0), @Setup, Parameter)
  MessageRequester("Number of launches", Str(Setup\NumberOfLaunches) + " at " + Setup\Time)
Else
  MessageRequester("Number of launches", "This is your first run")
EndIf


;Write number of lauches +1 and last time 
Setup\NumberOfLaunches + 1 
Setup\Time = FormatDate("%dd/%mm/%yyyy - %hh:%ii:%ss", Date())

If CreateJSON(0)
  InsertJSONStructure(JSONValue(0), @Setup, Parameter)
  WriteADS("SETUP", ComposeJSON(0))
EndIf
Créer un exécutable et lancer le plusieurs fois.

Vous pouvez aussi stocker une map ou une liste chainée.

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

Publié : ven. 13/avr./2018 0:46
par cage
Merci falsam,

Démystifie ce qu'est A.D.S. (Alternate Data Stream) que je ne connaissez pas.
Comme d'habitude, tes explications sont limpides et intéressantes.
Cela m'ouvre des possibilités.

cage

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

Publié : ven. 13/avr./2018 8:27
par Ar-S
Petite précision :
Méfiez vous tout de même. L'ADS n'est pas compatible FAT32.. Donc si vous transférez votre fichier sur un support formaté en Fat32, vous devriez perdre les données en ADS.

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

Publié : ven. 13/avr./2018 9:42
par Zorro
falsam a écrit :[.... des disques formatés NTFS uniquement ce qui est le cas de la majorité des ordinateurs en 2018.

perso, j'ai bloqué sur cette phrase , mais ne trouvant pas de sources indiquant le contraire, je ne fais que de m’étonner de ça ....

considerant le nombre de systemes utilisant LINUX et le systeme Ext3/Ext4/XFS .....
je parle tout aussi bien des systeme sous Ordinateur que sous Tablettes, Telephones Portables....

sans parler des Ordinateurs encore nombreux a tourner sur Fat32 / win XP ... (les distributeurs de billets de Banque )
http://www.phonandroid.com/95-distribut ... atage.html


bref , je ne suis pas sur que cette affirmation soit vrais ....
meme si on se restreint aux ordinateurs possédés par des particuliers (entreprises compris) .. :)


pour l'ADS , je ne connaissais pas .

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

Publié : ven. 13/avr./2018 10:40
par Ar-S
en fait je faisais plus allusion aux cle usb qui sont parfois reconnus uniquement en fat32 dans certains autoradio par ex. mais j'avais aussi zappé que falsam l'avait dit.

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

Publié : ven. 13/avr./2018 12:02
par GallyHC
Bonjour,

Zorro > Falsam avec ça phrase a surement oublier de préciser que cela n'été valable que sous Windows avec un disque formater en "NTFS". "ADS" à visiblement été fait pour une compatibilité avec les ordinateur sous MacOS.

Voir https://manumation.developpez.com/articles/windows/ads/
Les ADS ont été créés dans le but d'offrir une compatibilité avec HFS, le système de gestion de fichiers sous Mac. Sans entrer dans les détails, le but était de pouvoir créer un serveur de fichier Windows avec comme clients des Mac. De nos jours, ils sont aussi utilisés dans certaines techniques de traçabilité de fichiers, et pour par exemple, des résumés (voir fin du chapitre).
Donc oui, pas forcement touts les OS, mais juste Windows, mais cela permet déjà pas mal de chose du style stockage de la clef d'enregistrement, des informations de configuration et même comme quand l'exemple un compteur d'utilisation.

Tout comme, si tu Zip le fichier et que tu l'extrais tu perds aussi les donnée "ADS", cette méthode a ses avantages et ses défauts.

Cordialement,
GallyHC

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

Publié : ven. 13/avr./2018 12:10
par falsam
GallyHC a écrit : Falsam avec ça phrase a surement oublier de préciser que cela n'été valable que sous Windows avec un disque formater en "NTFS"
Pas du tout. Relis bien mon premier message que zorro a d'ailleurs quotée dans son commentaire :wink:

@Ar-S : J'avais fait mes tests sur une clé USB formaté NTFS.

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

Publié : ven. 13/avr./2018 13:47
par falsam
Zorro tu m'énerves :wink:
falsam a écrit :A.D.S. (Alternate Data Stream) est une technologie apparu en 1993 et utilisable qu'avec des disques formatés NTFS uniquement ce qui est le cas de la majorité des ordinateurs en 2018.
- La majorité des ordinateurs ne veut pas dire 100%
- J'ai bien précisé sur partition NTFS (Ca c'est pour Gally ^-^)

Part de marché des OS en Mars 18 2018 (Source Net Market Share)

- Windows : 88.72%
- Mac OS : 8.56%
- Linux : 2.30%
- Chrome OS : 0.31
- le reste on s'en fiche (BSD et autres ....) :wink:

■ Sur ces 88.72% d'ordinateurs équipés de Microsoft Windows (Source StatCounter

- Windows 10 : 43.95%
- Windows 7 : 41.51%
- Windows 8.1 : 7.99 %
- Windows XP : 3.42 %
- Windows 8 : 2.44%
- Windows Vista : 0.61
- Autres : 0.08 %
Zorro a écrit :considerant le nombre de systemes utilisant LINUX et le systeme Ext3/Ext4/XFS .....
2.30%
Zorro a écrit :je parle tout aussi bien des systeme sous Ordinateur que sous Tablettes, Telephones Portables....
Purebasic ne fonctionnant pas sur ce types de terminaux, j'en ai pas tenu compte.
Zorro a écrit :sans parler des Ordinateurs encore nombreux a tourner sur Fat32 / win XP ... (les distributeurs de billets de Banque )
Sous xp 3.42% !
Zorro a écrit :bref , je ne suis pas sur que cette affirmation soit vrais ....
Ben justement si : En faisant référence à ces chiffres, la majorité des ordinateurs sont partitionnés NTFS.

:idea: Pour info j'ai procédé aussi à des tests sous Mac OS et ça fonctionne parfaitement.

Linux je suis loin d’être un spécialiste mais je pense qu'on peut partitionner un support en NTFS. Maintenant est ce que le code fonctionne ? je ne sais pas. Mais ce n'est de toute façon que 2.30% de part de marché.

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

Publié : ven. 13/avr./2018 14:33
par Marc56
Précision:
:arrow:
̶P̶a̶r̶t̶ ̶d̶e̶ ̶m̶a̶r̶c̶h̶é̶ ̶d̶e̶s̶ ̶O̶S̶ ̶e̶n̶ ̶M̶a̶r̶s̶ ̶1̶8̶ ̶2̶0̶1̶8̶
Part de marché des OS qui se sont connecté à l'Internet

Methodology: Details on our data collection, aggregation and quality control processes.
Source of Data:
We collect data from the browsers [...]

On ne peut pas connaitre le % réel de chaque OS en temps réel :wink:
On sait qu'il y a déjà environ 1.2 milliard de téléphones, tablettes etc sous android, ce qui fait plus d'os android que windows mais comme la plupart ne sont pas utilisés pour aller naviguer sur les sites de stats, on ne les voit pas.

Pour ce qui est des partitions NTFS, linux peut les lire, y écrire (péniblement) mais les systèmes natifs de Linux sont bien plus fiables et rapides.
Paradoxe: Linux utilisé comme serveur de fichier pour des clients Windows (avec Samba) est plus rapide qu'un serveur Windows d'origine :mrgreen:

Mais je m'égare là oups :oops:

:idea: PS Merci pour ton article, je ne connaissais pas ADS j'aurais appris un truc aujourd'hui :wink:

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

Publié : ven. 13/avr./2018 15:34
par Ar-S
Voilà un exemple pour générer une petite protection par clé en utilisant ADS.

2 programmes.
- le 1er est le petit keygen qui va créer une 1ère clé. Cette clé vous devez la copier dans le second code ligne 74
- Le second est l'exe que vous compilerez est qui sera destiné à votre client.

Instructions :

- Compilez le code 2 en un fichier test.exe
- Lancez le
Il vous demande nom et prénom. Vous devrez alors rentrer Dupont Jean dans cet exemple sauf si vous avez généré une autre clé avec le keygen
Une fois cela fait, le programme vous demandera de redémarrer. Si les noms et prénom sont bons, la fenêtre du prog s'ouvrira.
Petite protection supplémentaire. L'exe sera lié au serial de votre disque C en plus de votre nom et prénom.

Note : je suis bien conscient que cette protection nécessite de créer un exe pour chaque client et que l'ADS reste très volatile comme protection.
Cet exemple est pour le fun. Je me suis bien amusé.
:mrgreen:

Code : Tout sélectionner

; Générateur de clé

UseSHA3Fingerprint()

Procedure.s GenerateLic(Mot$)
  N$ = UCase(Mot$)
  N$ = Trim(Mot$)
  ProcedureReturn StringFingerprint(N$, #PB_Cipher_SHA3)
EndProcedure


; Exemple de création de la clé à coller dans le code du programme principal
NameKey$ = GenerateLic(Trim("DUPONT JEAN"))
SetClipboardText("NameKey$ = "+Chr(34)+NameKey$+Chr(34))
; Vous pouvez directement faire un clic droit / coller ligne 74 du programme principale.

Code : Tout sélectionner

; Falsam : ADS / MVXA : HDD SERIAL /Ar-S : Prog

UseSHA3Fingerprint()

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure



Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure



Procedure.s GenerateLic(Mot$)
  ProcedureReturn StringFingerprint(Mot$, #PB_Cipher_SHA3)
EndProcedure

Procedure.s ReturnHDDSerial(Laufwerk.s)
  ;code de MVXA
  Define.i tmpSerial
  Define.s tmpLfwrk, tmpFileSystem
  
  tmpLfwrk      = Left(Laufwerk, 1) + ":\"
  tmpFileSystem = Space(256)
  GetVolumeInformation_(@tmpLfwrk, @tmpFileSystem, 255, @tmpSerial, 0, 0, @tmpFileSystem, 255)
  Debug Hex(tmpSerial)
  
  ProcedureReturn Hex(tmpSerial)
EndProcedure



Procedure OW()
  If OpenWindow(0, 0, 0, 220, 100, "Licence OK !...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ButtonGadget  (1, 10, 60, 200, 30, "Fermer")
    
    Repeat
      Event = WaitWindowEvent()
      
      Select Event
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1 
              CloseWindow(0)
              End  
          EndSelect
          
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf
  
EndProcedure



; -----------------------------------------------------
; Clé générée avec le keygen du code précédent
NameKey$ = "18ff575513a42ae5ea7dad4cd8165c032dd837ff09f8197bd6ab9078b8a3baec" ;
;------------------------------------------------------

LicRead.s = ReadADS("NAMEKEY")

If LicRead =""
  WriteADS("NAMEKEY", NameKey$)
  LicRead = NameKey$
EndIf

If Len(LicRead) = 64 ; s'il ni a que le nom prenom
    N$ = InputRequester ("Licence","Entrez votre nom et prénom (ex : marc dumoulin)","")
    
    N$  = Trim(UCase(N$))
    N$ = GenerateLic(N$)
    
    If N$ = LicRead.s
      DD$ = GenerateLic(ReturnHDDSerial("c"))
      Licence.s = N$+":"+DD$
      WriteADS("NAMEKEY", Licence.s)
      MessageRequester("Succés","Vous devez relancer le logiciel pour terminer l'activation"+Chr(10)+"Cle "+Licence.s ,#PB_MessageRequester_Info)
      End
    Else
      MessageRequester("Erreur","Vous devez entrer votre Nom et Prénom"+Chr(10)+"Ce programme va se terminer",#PB_MessageRequester_Error)
      End
    EndIf
    
  ElseIf Len(LicRead) > 64
    
    ; VerifDD
    DDcrypt.s = Mid(LicRead,FindString(LicRead,":")+1,Len(LicRead)-FindString(LicRead,":")+1 )
    ;   MessageRequester("test",DDcrypt.s + " = " +  ReturnHDDSerial("c"),#PB_MessageRequester_Ok)
    If DDcrypt.s =  GenerateLic(ReturnHDDSerial("c"))
      
      OW()
    Else
      MessageRequester("Attention","Ce logiciel est lié à un seul ordinateur",#PB_MessageRequester_Info)
      End
    EndIf
    
  EndIf