Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UTILITAIRE DE SANITIZATION DES DISQUES/FICHIERS (SUPPRESSION IRREMEDIABLE DES DONNEES CONFIDENTIELLES)


Information sur la source

Attention: ce code a été marqué comme suspect par un admin, il peut donc être dangereux.
Ce code a été laissé sur le site dans un but pédagogique, ne l'exécutez pas si vous ne comprenez pas son contenu!
Catégorie :Fichier / Disque Classé sous : sanitization, formatage, disque, fichier, récupération Niveau : Initié Date de création : 15/04/2007 Date de mise à jour : 27/04/2007 21:06:24 Vu / téléchargé: 5 127 / 500

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (75)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
/!\ ATTENTION /!\ IL S'AGIT PROBABLEMENT D'UNE DES SOURCES LES PLUS DANGEREUSES DE VBFRANCE.

CE CODE EST DEPOSE DANS UN BUT UNIQUEMENT PEDAGOGIQUE. JE NE SUIS NULLEMENT RESPONSABLE DES EVENTUELS DEGATS CAUSES PAR CE PROGRAMME.
NE TESTEZ PAS CE PROGRAMME SUR UN DISQUE DUR QUI CONTIENT DES DONNEES DONT VOUS AVEZ BESOIN.


===========================================
Présentation du programme
===========================================
Ce programme a pour but d'effectuer une "sanitization" sur un disque dur ou sur un ensemble de fichiers.
La sanitization est une opération qui consiste en la destruction des données.


Une sanitization est une suppression définitive des données. On l'utilise pour effacer les données sensibles(confidentielles, top secrètes...etc.) d'un disque dur.
Parce que vous savez bien que même si vous supprimez un fichier et que vous l'effacez de la corbeille, il reste quand même présent physiquement sur le disque, donc il est récupérable par n'importe quel logiciel de récupération. Et même après un formatage, le fichier est encore récupérable.

D'où l'intérêt d'un tel programme qui permet l'effacement définitif de vos données.


Par conséquent, si vous appliquez une sanitization sur un de vos disque durs, TOUTES LES DONNEES SERONT PERDUES DEFINITIVEMENT, et vous serez de plus contraint de formater (car le header du disque sera corrompu).
De même, si vous sanitisez un fichier, le fichier demeurera présent sur le disque, mais son contenu sera ILLISIBLE.

L'opération de sanitization est IRREMEDIABLE, les données sont IRRECUPERABLES.

Vous voilà prévenus....



Ce programme suis le protocole de sanitization du département de la défense américaine (DOD 5220.22-M).
Pour plus d'infos sur ces protocoles (en anglais) : http://www.hipaadvisory.com/tech/disksan.htm#a



===========================================
Fonctionnement
===========================================
Ecriture dans tout le conteu d'un fichier ou d'un disque de :
-première passe : le byte &H55 (01010101 en binaire)
-deuxième passe : le byte &HAA (le complémentaire de &H55 en binaire)
-dernière passe : des bytes aléatoires entre 0 et 255 inclus.



===========================================
Notes
===========================================
-La dll de création d'une string aléatoire a été codée par Brunews que je REMERCIE GRANDEMENT. Elle est codée en ASM, le code est fourni.
-Testé sur différents fichiers et sur ma clé USB FAT32. Pas encore testé sur NTFS (pas de disque dur prêt a être formaté ^^)
-Test avec Easy Recovery ==> le contenu des disques EST IRRECUPERABLE



Voilà ;)
@+
 

Source

  • 'code ULTRA commenté dans le zip ^^
'code ULTRA commenté dans le zip ^^

Conclusion

Encore une fois : !! ATTENTION A CE QUE VOUS FAITES AVEC CE PROGRAMME !!


Et encore une fois, merci à Brunews pour la dll^^

Notez et commentez svp ;)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

15 avril 2007 21:18:45 :
Une bonne petite optimisationS + bug disparu (merci EB ^^)
27 avril 2007 21:06:24 :
Bug corrigé

Commentaires et avis

signaler à un administrateur
Commentaire de shadowmoy le 15/04/2007 20:19:14

euh question con pourquoi ne pas mettre simplement tous les bits du fichier a effacer a 00 ??

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 20:28:05

Tout simplement pour minimiser la possibilité de récupération des données. Parce que même à 00, c'est pas encore sécurisé... D'où l'intérêt de faire plusieurs passes.

Je ne m'y connais malheureusement pas suffisement sur la technologie des disques durs pour te donner une réponse complète, mais demande à jmfmarques, il s'y connait bien !


Tu peux lire aussi ce thread : http://www.vbfrance.com/infomsg_CONCATENER-CHAINE-QUELQUES-MO_921256.aspx?p=4

Quelques liens :
http://www.mag-securs.com/spip.php?article7475
http://www.clubic.com/actualite-352-effacement-de-donnees-protegees.html



En gros, je propose le service "Destruction logicielle par réécriture (surcharge) sur le disque dur" vendu ici :
http://www.invirtuel.fr/notre-metier/notre-metier-effacement-securise.php


@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 20:40:10 administrateur CS

Question : pourquoi utiliser le type string ? Tu comptes ecrire un livre avec les fichiers effacé ? lol

Non sans blague un tableau d'entier aurait fait l'affaire et c'est bcp bcp plus rapide. je me trompe ? Non je crois pas :p

signaler à un administrateur
Commentaire de jack le 15/04/2007 20:44:50 administrateur CS

Pour info :
"Sanitization" est le terme anglais de "sanitation" en fr : Nettoyage par élevation de température.
J'espère que les disques durs sont water-proof ... euf, étanches !

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 20:47:00 administrateur CS

hahah
j'espere que tu comptes pas "remettre" des données sensible dessus c'est surtout ça la question :p

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 20:48:13

EB ==> Héhé, en effet, mais


-pour la string aléatoire, je ne récupère qu'un pointeur renvoyé par la dll (pas de manip de string). Et comme le temps de création "d'une zone mémoire" de 2Mo par la dll est pratiquement négligeable devant le temps mis a écrire le résultat dans le disque/fichier, pas possible d'optimiser vraiment ici

-pour les &H55 et &HAA, ma foi pourquoi pas virer le StrPtr(s) et utiliser un tableau de bytes ? Faut comparer (d'ailleurs exit le bug que je citais avec cette méthode)



Jack ==> A vrai dire j'ai pas vraiment chercher à traduire ^^ J'ai gardé le terme anglais défini ici : http://en.wikipedia.org/wiki/Sanitization_(classified_information)

@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 20:51:44 administrateur CS

ouai mais pense au temps que tu va mettre a regle ton probleme de "55 00 55 00 55"... haha c'est toi qui vois. De plus tu te trimbale une dll C qui malgres le talent de notre amis commun BruNews ne sert a rien car tu pourrais facilement t'en passer.
Je suis pour le 100% vb. Car si on ajoute des truc en C autant faire tout en C !

@+

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 20:56:08

Bah oui mais non ;)

Parce qu'en VB, la création d'une d'un tableau de 2097152 bytes aléatoires met quand même 300 fois plus de temps que l'appel à la dll ;)

Ok pour les strings avec des 55, mais pas ok pour la string aléatoire ^^

@+

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 20:57:12

Et encore, comment je remplis mon tableau de bytes non nul sans faire de boucle horriblement lente ???

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 20:58:29

Suis-je bête, le construire une seule fois est suffisant... tout comme ma string que je reconstruis à chaque fois dans la boucle du For...

Là il y a de l'optimisation à faire!!

@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 21:03:25 administrateur CS

C'est clair ya de quoi faire.
Au moins tu t'en rend compte tout seul c'est deja ça

:p

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 21:04:21

mdr ;)

La MAJ arrive dans 2 minutes ^^
@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 21:05:13 administrateur CS

...et l'addition s'il vous plait, et que ça saute mdr :p

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 21:19:53

Voilà qui est fait ;)

Au passage j'ai précalculé toutes les opérations qui étaient effectués dans la boucle dans la version précédente...

C'est mieux comme çà ^^
@++

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 21:21:42 administrateur CS

a bah ya la dll :p

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 21:22:52

lol oui, je maintiens que c'est impossible de faire mieux niveau perf que la dll !

300 fois plus rapide, la dll, 300 fois ^^

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 21:41:20 administrateur CS

tout est relatif, tout. Car 300 fois plus rapide que quoi ? Si c'est 300 fois plus rapide qu'un code mal foutu alors la c'est sur ça ce justifi, enfin je me comprend :p

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 21:46:30

Je vois ce que tu veux dire.

Mais, en VB, comment remplirais tu de manière rapide un tableau de 2097152 de taille avec des bytes aléatoires ?


Moi je fais :


Option Explicit

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()
Dim lTim As Long
Dim tb(2097151) As Byte
Dim x As Long

    lTim = GetTickCount
    Call Randomize
    For x = 0 To 2097151
        tb(x) = Int(Rnd * 256)
    Next x
    lTim = GetTickCount - lTim
    
    Me.Caption = CStr(lTim)
End Sub



550 ms tout de même... alors que l'appel à la dll prend un temps de l'orde de quelques pauvres ms.

@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 21:49:32 administrateur CS

deja... pourquoi veux tu un tableau de 2 mega ?
(j'ai pas tout lu le truc de la norme alors je suis peut
etre sous informé :p)

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 21:56:10

Un secteur de disque fait généralement 512 octets.

Ecrire dans un disque secteur par secteur (donc avec un tableau de bytes de 512 de taille) nécessiterait 1953215 boucles, donc près de 2 millions de générations de tableau + 2 millions d'écritures sur le disque..... pour un disque de 1Go.


Donc pour mes 200Go, il faudrait 400 millions de tableaux et 400 millions d'écritures sur le disque. Pas gérable.



Donc j'ai choisi un buffer raisonnable de 2Mo, soient 4096 secteurs de disque, et je n'ai ainsi plus que 500 accès/écritures sur le disque pour un disque de 1Go (sachant que c'est l'opération la plus lente).




De toutes manières, quelle que soit la taille du buffer, il faudra avoir généré 1 milliard de nombres aléatoires pour couvrir 1Go.

Plus le buffer est grand, moins on accède de fois au disque.

@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 21:59:12 administrateur CS

d'accords mais pourquoi ne pas crée ton tableau de 2Mo une seule fois puis le reutiliser, au lieu de le regenerer a chaque cycle ? il y a t'il une securite suplementaire a ecrire des sequences differentes (surtout avec 2Mo de données) ?

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 22:06:01

Ben, selon le protocole du département américain de la défense (DOD 5220.22-M), la troisième passe d'écriture consiste en un remplissage de bytes aléatoire sur la totalité du disque, et non en la répétition de n fois un buffer tité aléatoirement.

Autrement dit, je suis obligé de regénérer mon buffer aléatoire à chaque cycle.




500 cycles * 550 ms = plus de 4.5 minutes passées exclusivement à générer des tableaux.

Et j'ai fait un bench, il faut seulement 2.5 secondes avec la dll pour générer le même nombre de bytes aléatoires.


Donc 110 fois moins de temps (et pas 300 comme je le disais un peu au hasard^^).

@+

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 22:06:23

*tiré, pas tité

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 22:10:11 administrateur CS

Par consequent il faut tout simplement trouver un remplacant a "rnd" comme la fait BruNews. En vb et bien codé je pense qu'on peut atteindre une procedure VB 50 a 10 fois moins rapide que celle de Bruno.

@+

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 22:14:12

Recoder Rnd en VB en l'optimisant ?


J'avoue que je suis curieux de voir une telle function ^^ Faut utiliser quel genre d'opérations ? (parce que j'avoue que je n'ai pas vraiment cherché à décortiquer l'ASM de Brunews).

@+

signaler à un administrateur
Commentaire de EBArtSoft le 15/04/2007 22:19:55 administrateur CS

C'est plus simple que ce que tu sembles croires :p
En tout cas personnellement j'aurais immediatement decortiqué le code de Bruno a reception ! Car la moindre ligne de code vaux son pesant d'or :p

(desolé pour le flood :p)

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 22:38:05

Pas grave pour le flood ;)

Mais comme la dll est en ASM et que je ne connais pas l'ASM, je n'ai pu que l'utiliser sans vraiment la comprendre O_o
Le code est en tout cas fourni dans le zip. Si tu es motivé... ^^

@+

signaler à un administrateur
Commentaire de Galain le 15/04/2007 22:57:25

Salut Violent_Ken
J'ai testé sur un disque dur en NTFS et cela fonctionne très bien
Un grand bravo

signaler à un administrateur
Commentaire de violent_ken le 15/04/2007 22:59:26

Salut Galain, et merci pour la note et pour la confirmation que sous NTFS çà marche aussi ^^

@+

signaler à un administrateur
Commentaire de Galain le 16/04/2007 00:11:44

Salut Violent_Ken
Je t'envoie le code de la dll avec les commentaires sur la génération des nombres aléatoires. l'instrution principale est rdtsc dont le rôle est détourné afin d'avoir une valeur aléatoire de base

__declspec(naked) long* __stdcall bnAlloc2MoAlea()
{
  __asm {
    push    PAGE_READWRITE
    push    MEM_COMMIT or MEM_RESERVE or MEM_TOP_DOWN
    push    2097152 ;// 2 Mo
    push    0
    call    dword ptr VirtualAlloc  ;// alloue le buffer contenant les valeurs aléatoires
    test    eax, eax          ;// test si EAX en retour = 0
    je      short allocEXIT   ;// si oui : l'allocation buffer a échouée
    push    edi               ;// sauvegarde des pointeurs
    push    eax
    push    ebx
    mov     edi, eax          ;// EDI = *pdt
    mov     ebx, 131072       ;// NBR TOURS DE 16 OCTETS
    rdtsc                     ;// rdtsc est une instruction qui stocke dans edx/eax un nombre de 64 bits
                              ;// représentant le nombre de cycle horloge fait depuis le démarrage ( sous toute réserve)  
    mov     edx, eax          ;// EDX = nombre aléatoire
    mov     ecx, 214013       ;// multiplicateur
    sub     edi, 4            ;// compense le 1° add   edi,4 (edi est le pointeur de la zone allouée)
  nextNBR:
    mov     eax, edx          ;// EAX = EDX
    mul     ecx               ;// EAX = ECX * EAX
    add     eax, 2531011      ;// EAX = EAX + constante
    add     edi, 4            ;// pointeur + 4
    mov     edx, eax          ;// // nouveau nombre aléatoire  ----------------------------------------------------
    ror     eax, 16           ;// rotation à droite de 16 bits de EAX ( les 16 bits de poids faibles deviennent    |
                              ;// les 16 bits de poids forts)                                                      |
    add     eax, 7979999      ;// EAX = EAX + constante                                                            |
    mov     [edi], eax        ;// on stocke une valeur aléatoire 32 bits soit 4 octets                             |
                                                                                                                   |
    mov     eax, edx          ;//on recommence <<<<<---------------------------------------------------------------                                                                                     |
    mul     ecx
    add     eax, 2531011
    add     edi, 4            ;// pointeur + 4
    mov     edx, eax          ;// seedRand
    ror     eax, 16
    add     eax, 7979999
    mov     [edi], eax
    
    mov     eax, edx
    mul     ecx
    add     eax, 2531011
    add     edi, 4            ;// pointeur + 4
    mov     edx, eax          ;// seedRand
    ror     eax, 16
    add     eax, 7979999
    mov     [edi], eax
    
    mov     eax, edx
    mul     ecx
    add     eax, 2531011
    add     edi, 4            ;// pointeur + 4
    mov     edx, eax          ;// seedRand
    ror     eax, 16
    add     eax, 7979999
    
    dec     ebx               ;// 1 tour en moins
    mov     [edi], eax
    jnz     short nextNBR     ;// si nbre de tours <> 0 on refait le boucle
    pop     ebx
    pop     eax               ;// POINTEUR ORIGINAL
    pop     edi
allocEXIT:
    ret     0
  }
}

Ce code n'engage que moi et il est possible que j'ai fait des erreurs : pour moi l'assembleur est bien loin
a+

signaler à un administrateur
Commentaire de Galain le 16/04/2007 00:20:13

mov     edx, eax          ;// // nouveau nombre aléatoire  ----------------------------------------------------

cette ligne est associée si l'on peut dire à celle-ci:   mov     eax, edx          ;//on recommence

Le nombre aléatoire créé au mov  edx,eax    est réutilisé au  mov  eax,edx.
J'avais fait la présentation avec Notepad mais le site n'a pas gardé le format des lignes

Désolé

signaler à un administrateur
Commentaire de violent_ken le 16/04/2007 00:29:43

Ah, merci bien pour les commentaires du code ASM : je regarde çà demain en profondeur !

Merci, @+

signaler à un administrateur
Commentaire de ghuysmans99 le 16/04/2007 00:34:48

comme d'habitude, parfait !
j'en connais un autre : Eraser

signaler à un administrateur
Commentaire de MadM@tt le 16/04/2007 14:30:33

ça fait peur à utiliser avec tous les messages attention attention !! lol
En tout cas c'est vraiment bien, surtout que ça respecte une norme, alors la t'es sur de ton coup (que ça va bien être efficace)
Bravo !

signaler à un administrateur
Commentaire de moustachu le 16/04/2007 15:03:18

Bonjour,

Avec un titre comme ça je ne risque pas de tester ton prog ;o). As-tu usé beaucoup de disques durs avant de terminer ton prog ^^.

J'entends souvent dire "Même après formatage, on peut récupérer les fichiers".

Quand un fichier est supprimé puis écrasé par un autre (physiquement) comment peut on récupérer les données d'avant ? C'est naïf comme question, hein. On pourrait multiplier la capacité de stockage d'un disque alors ^^

Beau boulot (je pense). "La programme le plus dangereux de VBFrance" ça fait classe ! Je vais essayer de faire le plus innofensif :o)

++
Moustachu

signaler à un administrateur
Commentaire de zavier666 le 16/04/2007 18:16:59

Des professionnel sont capables avec des machines perfectionnées de lire des données réécrites huit fois par dessus!!!!

Comment? eh bien comme dans tout phénomène magnétique (utilisé pour écrire sur un dur) lorsque tu changes un bit d'état (passage de 0 à 1 par exemple) et que tu fais l'inverse après (passage de 1 à 0), la matière sur le disque ne revient pas exactement à son état de départ (on appelle cela un phénomène d'hystérésis). cela permet non pas de récupérer des fichiers au complet (ne comptons donc pas la dessus pour augmenter nos capacité de stockage :) ) mais des fragments de fichiers qui permettent dans certains cas de prouver le stockage d'un fichier illicite sur un PC par exemple.

slts!
-------------------------------------------
Toujours + de VB et d'API => API @ la Loupe
http://xav.prog.power.free.fr

signaler à un administrateur
Commentaire de violent_ken le 16/04/2007 19:29:14

ghuysmans99 ==> Merci !

MadM@tt ==> Oui, je préfère prévenir ;) Faudrait pas qu'un utilisateur inatentif sanitize son disque dur par mégarde O_o
Et effectivement, le respect de la norme garantit une certaine efficacité du programme ^^

moustachu ==> Héhé, ma pauvre petite clé USB subit énormément de choses ces derniers temps... je viens de remarquer sur le screenshot : plus de 46Go d'utilisés dessus ;) lol, elle ne fait que 986Mo ^^

Pour l'histoire de l'écrasement, comme le dit zavier666, il est toujours possible, même si çà parait bizarre, de récupérer des données après formatage, et même après écrasement(s). Mais évidemment, l'opération est lente et doit être réalisée par des professionnels. Bien sur, on ne récupèrera que des "bribes" de fichiers.
Le meilleur moyen de supprimer définitivement les données est quand même l'utilisation d'un degausser (très fort champ magnétique qui supprime toutes les données).


"La programme le plus dangereux de VBFrance" ==> Je préfère prévenir ! Comme çà je suis tranquille ;)






Petite doc en anglais : http://www.usenix.org/publications/library/proceedings/sec96/full_papers/gutmann/
A noter qu'ici sont proposées 35 passes !

La conclusion indique que la sanitization n'est pas possible totalement, même avec un grand nombre de passes.
Mais bon, les 3 passes proposées ici sont généralement les plus utilisées car relativement efficaces.





Merci pour tous les commentaires, @+

signaler à un administrateur
Commentaire de jack le 16/04/2007 21:03:45 administrateur CS

Bah y-a de la lecture ici ! lol

signaler à un administrateur
Commentaire de Galain le 16/04/2007 21:32:54

Salut à tous
Je ne comprend point pourquoi ce code a été marqué comme louche par un admin : oui il est "dangereux" si on ne comprend point le but de ce code.Mais l'auteur a prévenu les visiteurs et leur fournit assez d'information pour comprendre le but de ce même code
Donc j'en conclus que le visireur qui teste ce code sait ce qu'il fait et est une personne averti!

Bravo Violent_Ken et dommage que je ne puisse pas noté un autre 10 pour cette source : chapeau bas

Galain

signaler à un administrateur
Commentaire de Galain le 16/04/2007 21:35:49

Donc j'en conclus que le visiteur bien sûr : un doigt a ripé

signaler à un administrateur
Commentaire de violent_ken le 16/04/2007 21:37:45

Jack ==> aha oui, y a de quoi faire ;)

Galain ==> C'est vrai que le "louche" est peut être pas le mot qui convient le mieux^^, mais bon, avec la msgbox qui s'affiche, le visiteur sera vraiment averti pour de bon ^^
Et merci encore pour le commentaire positif, çà fait plaisir ;)

@+

signaler à un administrateur
Commentaire de BruNews le 16/04/2007 21:42:41 administrateur CS

Le site ne veut pas être responsable de dommages potentiels, il est normal qu'on se prémunisse.
Par "louche" il faut comprendre "potentiellement dangereux", rien de plus.

signaler à un administrateur
Commentaire de Galain le 16/04/2007 23:58:20

Le message a été compris
Merci Brunews

signaler à un administrateur
Commentaire de moustachu le 17/04/2007 10:17:56

zavier666 et violent_ken > Merci votre éclairage. Quel phénomène cet hysteresys ! Toujours là pour nous embêter ! (6 ans d'étude de physique qui parlent ;o)) Mais sur clé usb ? C'est pas magnétique là , si ?

signaler à un administrateur
Commentaire de violent_ken le 17/04/2007 14:05:24

Sur clé USB ==> pas magnétique pour un sou ;) Elle est utilisée comme une partition FAT32 succeptible de jouer le rôle d'un disque dur ^^

Cela dit, les données sont bien évidemment définitivement effacées (avec les trois passes de réécriture).

@+

signaler à un administrateur
Commentaire de apxa le 18/04/2007 00:44:20

Iop all,
Dis moi tu as était récement controlé pour sorti une appli comme ca ;)
Hors mis cela ca me semble pas mal.

Have Fun ;)

signaler à un administrateur
Commentaire de mortalino le 18/04/2007 01:16:08

BruNews,
faut revoir votre message, je suis pas très bon en grammaire, mais là  (entre les chevrons) :

CETTE SOURCE EST MARQUE COMME LOUCHE PAR UN ADMIN, ET >>IL<< PEUT ÊTRE "DANGEUREU>>X<<" DONC PRUDENCE !

Qu'est ce qui est dangereux ? Dans le contexte, c'est la source ?
donc :

CETTE SOURCE EST MARQUE COMME LOUCHE PAR UN ADMIN, ET ELLE PEUT ÊTRE "DANGEUREUSE" DONC PRUDENCE !

(on ne parle de "son exécution" (donc là au masculin) qu'après :p

Voilà  ;)
++

signaler à un administrateur
Commentaire de mortalino le 18/04/2007 01:17:59

correction

(on ne parle de "Ce code" (donc là au masculin) qu'après :p

c'est la fatigue :D

signaler à un administrateur
Commentaire de Renfield le 18/04/2007 08:35:02 administrateur CS

c'est moi qui ai activé le mode "louche" sur la source...

non pas que son contenu soit un virus, trojan ou autre... mais là, l'utilisateur est prevenu qu'il ne s'agit pas d'un simple 'pong'...

signaler à un administrateur
Commentaire de Galain le 18/04/2007 18:23:59

Rassures-toi Thomas il n'y a aucun problème

signaler à un administrateur
Commentaire de violent_ken le 18/04/2007 19:26:15

apxa ==> lol, c'est si jamais les gendarmes frappent chez moi à 5 heures du mat' ;)


Pour le "code louche", pas de problèmes, mieux vaut être prudent ^^

@+

signaler à un administrateur
Commentaire de Galain le 19/04/2007 22:56:34

Je me suis amusé à le tester en tout VB (plus de DLL en C) : c'est plus lent mais cela fonctionne nickel et pour
une application non professionnelle cela reste acceptable.Un grand bravo à Violent_Ken

signaler à un administrateur
Commentaire de BruNews le 19/04/2007 23:13:08 administrateur CS

Jamais compris en quoi ça pouvait gêner d'avoir des DLLs ou autre dans le dossier du prog vu que dans tous les cas il faut un setup.
A mon humble avis c'est le contraire, VB est fait pour assembler des pièces logicielles, moins il y a de codage en VB et mieux c'est.

signaler à un administrateur
Commentaire de Galain le 19/04/2007 23:25:18

La DLL en C ne me génait point : c'est juste pour voir la différence au niveau temps
De rien

signaler à un administrateur
Commentaire de draluorg le 20/04/2007 12:08:05

Salut a tous,

Source interessante!

par contre je suis de l'avis de Eb sur le tout en VB du moins pour cette source, car j'ai pas testé mais c'est quand meme ton dur qui ralentit le plus... non ?
Car le temps que tu genere ton tableau doit a peine laisser le temps au disque de se repositionner lol...
Enfin j'exagere, mais pour de l'ectiture sur dique je pense que Vb est suffisement rapide!

En tout cas c'est une tres bonne source! merci ;)

++


signaler à un administrateur
Commentaire de violent_ken le 20/04/2007 13:21:56

Salut à tous, alors niveau gestion du temps, il faut :

-2.5 secondes pour générer 10^9 bytes avec la dll
-4.5 minutes en VB (avec Rnd)


Le temps d'écriture de disque est très largement supérieur au temps de génération des bytes avec la dll.
Cependant, en "tout VB", c'est quand même 0.5 secondes pour un tableau de 2Mo... donc cela double le temps d'exécution et ramène le temps de génération du tableau dans le même ordre de grandeur que le tems d'écriture.



Donc en résumé :
-"tout VB" : temps d'écriture équivalent au temps de calcul
-avec la dll : temps de calcul infime devant le temps d'écriture.

Par conséquent, supprimer la dll revient à doubler le temps d'éxecution, ce qui n'est pas vraiment terrible.


Et comme dit Brunews, la dll ne pose pas de problèmes car il est d'ailleurs inutile de l'enregistrer (pas activeX) ==> suffit de la poser dans le App.Path. Donc pas gênante du tout au final.

Et elle permet de diviser le temps par 2 ! Gain énorme vu que la sanitization d'un disque est lente.



Merci encore pour les commentaires, @+

signaler à un administrateur
Commentaire de draluorg le 20/04/2007 14:04:54

re,

Erf entre 2.5 secondes et 4.5 minutes, je veux bien que vb soit plus lent que de l'asm mais pas a ce point.
Ou tu es Eb ? montre nous que Vb peut etre plus rapide!
Ou alors je m'en va rejoindre Brunews sur le forum Cpp!! lol

Non vraiment je suis etonné quand meme de voir une telle différence!
Mais la ou je dis que je suis contre la dll, c'est que si on part de ce principe on ne va plus chercher la moindre optimisation en vb et on va recourrir chaque fois a une dll tierce...
Pour certaine appli on se retouvera vite avec 50 dll!
Et donc comme le dit Eb autant coder directement en C++

++

signaler à un administrateur
Commentaire de draluorg le 20/04/2007 16:15:47

re re,

Eh l'a fallu que je test...

j'obtiens des temps 7 * plus rapide qu'avec ta boucle en faisant ainsi:

Option Explicit

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()

    Dim lTim As Long
    Dim x As Long
    Dim l(5) As Long
    
    Call Randomize
    
    l(1) = Int(Rnd * 32)
    l(2) = Int(Rnd * 64)
    l(3) = Int(Rnd * 128)
    l(4) = Int(Rnd * 32)
    l(5) = Int(Rnd * 64)
    
    Dim tb(2097151) As Byte
    lTim = GetTickCount
    
    For x = 0 To 2097151 - 10 Step 10
        l(0) = Int(Rnd * 128)
        tb(x) = l(0)
        tb(x + 1) = l(0) + l(1)
        tb(x + 2) = l(0) + l(2)
        tb(x + 3) = l(2) + l(3) - l(0)
        tb(x + 4) = l(0) + l(1) + l(2)
        tb(x + 5) = l(3) + l(0) - l(5)
        tb(x + 6) = l(5) + l(0) + l(1)
        tb(x + 7) = (l(3) + l(0)) / 2
        tb(x + 8) = l(5) + l(0)
        tb(x + 9) = l(5) + l(2) + l(0)
        tb(x + 10) = l(0) / 2
    Next x
    
    lTim = GetTickCount - lTim
    
    Me.Caption = CStr(lTim)
    
End Sub

Bon d'accord c'est assez barbar mais c'est fait en 5 minutes et  justement c'est encore tres optimisable, et de 4,5 minutes on descend a 38 secondes! (compilé évidement!)

++

signaler à un administrateur
Commentaire de violent_ken le 20/04/2007 16:26:27

Salut, bien évidemment, l'instruction =Int(Rnd*256) est fort peu optimisée. Cependant sur l'exemple que tu donnes :

- attention aux dépassements de capacités notamment dans tb(x + 3) = l(2) + l(3) - l(0)
- j'avoue que je ne sais pas comment tu as fait le test ? Chez moi j'obtiens 223s, soient près de 4 minutes pour 500 cycles (compilé bien sur) ??? Tu es sur des 38s ?? (ou alors mon P4 fatigue vraiment ^^)

@+

signaler à un administrateur
Commentaire de draluorg le 20/04/2007 16:50:54

eh non j'ai compté que ta boucle chez moi mettait 347 Ms
et la mienne 47 ms
C'est donc environs 7 * plus rapide, si je divise 4,5 minutes par 7 j'obtiens envorons 38 secondes...

atta je test avec 500 cycles...

Voila 36 secondes chez moi en faisant ceci:

Option Explicit

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()
    
    Dim lTim As Long
    Dim i As Integer

    lTim = GetTickCount

    For i = 1 To 500
        GenBytes
    Next i
    
    lTim = Round((GetTickCount - lTim) / 1000, 3)
    Me.Caption = CStr(lTim)


End Sub


Private Sub GenBytes()

    Dim x As Long
    Dim l(5) As Long
    Dim tb(2097151) As Byte
    
    Call Randomize
    
    l(1) = Int(Rnd * 32)
    l(2) = Int(Rnd * 64)
    l(3) = Int(Rnd * 128)
    l(4) = Int(Rnd * 32)
    l(5) = Int(Rnd * 64)
    
    For x = 0 To 2097151 - 10 Step 10
        l(0) = Int(Rnd * 128)
        tb(x) = l(0)
        tb(x + 1) = l(0) + l(1)
        tb(x + 2) = l(0) + l(2)
        tb(x + 3) = l(2) + l(4) + (l(0) / 2)
        tb(x + 4) = l(0) + l(1) + l(2)
        tb(x + 5) = l(3) + l(0)
        tb(x + 6) = l(5) + l(0) + l(1)
        tb(x + 7) = (l(3) + l(0)) / 2
        tb(x + 8) = l(5) + l(0)
        tb(x + 9) = l(5) + l(2) + l(0)
        tb(x + 10) = l(0) / 2
    Next x
    
End Sub

PS: J'ai un P4 aussi ;)

++

signaler à un administrateur
Commentaire de violent_ken le 20/04/2007 17:06:53

Ah oui mais là, c'est plus la même boucle que celle d'avant ^^ Celle d'avant mettait entre 500 et 800 ms, celle ci plus que 100.

Donc c'est 5 fois plus rapide que le Rnd*256.


Mais par contre le résultat n'est pas convenable, la distribution des bytes n'étant pas pseudo-aléatoire ==> (test effectué avec 2M valeurs)
http://www.enregistrersous.com/images/69389407420070420170612.jpg

@+

signaler à un administrateur
Commentaire de violent_ken le 20/04/2007 17:08:22

Bien sur, le graphe représente l'occurence en fonction du numéro de byte, échelle 0-255 en abscisse et 0-occurence max en ordonnée

@+

signaler à un administrateur
Commentaire de EBArtSoft le 21/04/2007 01:35:59 administrateur CS

LE probleme principal c'est que VB ne fait pas d'arithmetique non signé de ce fait pour avoir un resultat semblable au code de BruNews il faut passer par de l'assembleur "embarqué". Bref on fait de l'assembleur dans VB et le tour est joué. Si ça vous interresse je fait le test pour voir si c'est jouable. Je ferais un module de classe pour que le code soit fonctionnel et dans l'ide et en mode compilé. Apres il faudra soustraire le temps d'appel a la propriete de l'objet. Mais ça devrait deja etre plus rapide que des Rnd :p
Surtout si on optimise la partie tableau pas tres bien foutue il faut l'avouer dans le projet original :p

@+

signaler à un administrateur
Commentaire de violent_ken le 21/04/2007 10:18:55

mwahaha ;)

Bon ben si tu es motivé, çà m'intéresse ^^
@+

signaler à un administrateur
Commentaire de EBArtSoft le 21/04/2007 11:13:24 administrateur CS

Ok c'est fait (mais pas encore fait les bench) quand t'as le temps passe me voir sur msn

@+

signaler à un administrateur
Commentaire de EBArtSoft le 21/04/2007 11:40:40 administrateur CS

Bon j'ai fait mon petit bench vite torché, voila les resultat :

asm + dll : 156ms
asm + vb  : 109ms
rnd + vb  : 13375ms

asm + dll : 140ms
asm + vb  : 94ms
rnd + vb  : 13234ms

asm + dll : 156ms
asm + vb  : 94ms
rnd + vb  : 16312ms

Detail du bench :

    t = GetTickCount
    For i = 0 To 10
        n = bnAlloc2MoAlea()
        Call bnFreeAlloc(n)
    Next
    List1.AddItem "asm + dll :" & GetTickCount - t

    t = GetTickCount
    For i = 0 To 10
        Obj.bnAlloc2MoAlea Tbl(0)
    Next
    List1.AddItem "asm + vb :" & GetTickCount - t

    t = GetTickCount
    For i = 0 To 10
        For j = 0 To 2097151
            Tbl(j) = Rnd * 255
        Next
    Next
    List1.AddItem "rnd + vb :" & GetTickCount - t

Detail de la machine :

P4 1.6Ghz
1024 Ram

Conclusions :

J'obtiens de meilleur resultat avec de "l'assembleur embarqué" ceci s'explique par le fait que BruNews fait une alloc a chaque appel alors qu'il suffit de reutiliser le tableau dimentionné par VB. Ainsi le cout d'un appel a la propriete est minimisé face a l'allocation... bref si ça interresse j'ai le code :p

signaler à un administrateur
Commentaire de draluorg le 21/04/2007 11:45:41

re,

"Mais par contre le résultat n'est pas convenable, la distribution des bytes n'étant pas pseudo-aléatoire" oui c'etait a l'arache juste pour montrer que en diminuant le nombre d'appel a rnd tu pouvais gagner enormement de temps...

Bon voici un autre exemple plus propre et plus aleatoire (500 cycles en 5 secondes!)

Private Sub GenBytes(ByRef tb() As Byte)

    Dim x           As Long
    Dim i           As Long
    
    For i = 1 To 151
        tb(i) = Int(256 * Rnd)
    Next i
    
    For x = 151 To 2097151 - 1000 Step 1000
        tb(x) = Int(256 * Rnd)
        For i = x + 1 To x + 1000
            tb(i) = (tb(x) Xor tb(i - x))
        Next i
    Next x

End Sub

Clair que ca vaudra pas le code de Eb mais bon...
Sinon comment analyse tu le niveau "pseudo aleatoire" ? ca m'interesse!

++

signaler à un administrateur
Commentaire de violent_ken le 21/04/2007 14:16:10

EB ==> Dsl, j'ai pas WLM d'installé (ni MSN) en ce moment car formatage pas très loin... ;)
Pour le code, oui çà m'intéresse, si tu peux le poster ce serait cool ;)

Et merci pour les bench, c'est bon à savoir...


Dralurog ==> 500 cycles en 5 secondes !! Grosse optimisation.
Pour l'analyse du niveau des tirages aléatoires, le plus simple est de comptabiliser le nombre d'occurence de chaque byte (http://www.enregistrersous.com/images/69389407420070420170612.jpg pour le premier cas).

Donc je confirme, ton dernier algo répartit correctement les bytes
http://www.enregistrersous.com/images/79659193820070421140643.jpg

Faudrait une étude plus poussée pour voir s'il n'y a pas de répétition de suites de bytes ou autre, mais c'est déjà vraiment mieux !

@+

signaler à un administrateur
Commentaire de EBArtSoft le 21/04/2007 19:04:38 administrateur CS

Le code ici : http://ebartcodes.info/temp/bnAlloc2.zip

@

signaler à un administrateur
Commentaire de draluorg le 21/04/2007 19:42:37

erf! lol 1,4 secondes pour 500 cycles! Chapeau bas monsieur!
Mais bon je pige rien de chez rien au code :(

Sinon avec methode en declarant tb() en global comme toi au lieu de le passer en byref a chaque fois je tombe a 2.2 secondes :P (bon ok je sors...)

++

signaler à un administrateur
Commentaire de EBArtSoft le 21/04/2007 20:07:01 administrateur CS

Ouai c'est vrai on pourrait stoker l'adresse du tableau et eviter de le passer en argument a chaque fois... faut voir :p

signaler à un administrateur
Commentaire de violent_ken le 21/04/2007 22:08:31

WAOUH, tu es mon gourou EB !! ;)

Vraiment très fort... çà vaut le coup de faire un MAJ ^^
@+

signaler à un administrateur
Commentaire de Galain le 22/04/2007 13:30:51

Bravo EB : j'ai testé et c'est nickel

Pour Violent_Ken
J'ai remarqué que pour le conversion d'un currency en 2 long signés tu as supprimé le test sur le passage positif/négatif du mot de 32 bits High : cela n'est pas génant pour l'instant car nos disques durs sont encore trop petits mais dans quelques temps risque de bug !!!

Bravo à vous deux : je vous mets à tous deux un 10 mais il n'est que virtuel malheureusement

signaler à un administrateur
Commentaire de violent_ken le 22/04/2007 13:47:21

Effectivement. Mais de toutes façons, je pense que la méthode la meilleure serait de faire un CopyMemory ==> plus de bug et plus rapide ;)

@+

signaler à un administrateur
Commentaire de violent_ken le 27/04/2007 21:08:04

Salut, j'ai mis à jour à la suite d'un bug qui (-1 en trop dans mon code) qui empêchait de sanitizer le dernier buffer dans un fichier.


Note : ce code inclus dans ma nouvelle source : http://www.vbfrance.com/codes/FILESYSTEMLIBRARY-TOUT-FSO-SUR-FICHIERS-DOSSIERS-DISQUES_42404.aspx (la MAJ ce soir)

@+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

récupération de données [ par eliefr78 ] Bonjour à tous,je vous décrit le contexte : j'ai créer un outil utilisé par plusieurs utilisateur.les utilisateurs renseignent une base de donnée (il récupération de données d'autres fichiers [ par Phalls ] Bonjour à tous,Je voudrais comparer des données venant de deux types de fichiers totalement différents. La première donnée se trouve dans un fichier . Enregistrement et récupération de deux données dans un fichier .txt [ par Splif62 ] Salut les amis !!Je dois pour les cours développer une petite application qui doit me permettre l'enregistrement et la récupération de 2 données dans Récupération et mise à jour d'un fichier vers un autre [ par p4uline ] VaZy [VBS] supprimmer un fichier sans connaitre son emplacement exact [ par zatox ] Bonjour à tous, j'espère ue je suis au bon endroit pour poser cette question. j'aimerai savoir s'il est possible en avec un script vbs de supprimmer Box pour choisir un fichier texte sur le disque dur [ par bimone78 ] Bonjour,je souhaiterai pouvroir créer une dialogbox qui me permettrait de choisir le fichier sur le disque dur comme si l'on passait par poste de trav Récupération de données distante [ par Zenway ] Pourriez-vous m'indiquer comment:- En réalisant un script VB je peux récupérer des données d'un fichier .TXT sur un serveur net, le transformer en .md récupération de d'informations sur HD [ par junfunk ] comment récuperrer les données brutes d'un disque dur, càd, lire directement les informations de ce dernier.J'ai accés à un disque dur, formaté mais q récupération d'un fichier attaché avec MAPI. [ par PHR ] Bonjour,voilà le problème :je souhaite, en utilisant MAPI, récupérer le fichier attaché d'un mail quelconque et le transférer sur un répertoire systèm Récupération des données d'un fichier [ par eltaris ] J'ai un fichier à accès direct.Quand je récupère les données dans des string et que j'affiche ce que j'ai récupéré à l'écran, les lettres telles que "


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.