Tout d'abord, toute la Team Hackademy vous souhaite une année 2008 pleine de bonnes choses !
Pour débuter cette année, nous sommes heureux de vous annoncer que le Ezine commence à prendre forme (surtout l'équipe qui dirigera celui-ci) et devrait apparaitre sur le Web début Avril. Cela peut paraitre loin mais nous voulons vraiment faire un Ezine de qualité, cela demande donc beaucoup de préparation.
Pour ceux qui aimeraient publier dans le premier numéro il est encore temps d'envoyer vos articles (au pire il seront pour le prochain numéro) directement à redaction@thehackademy.net.
Autre annonce importante, le premier meeting HZV aura lieu le 16 Février 2008 sur Paris (dans les locaux de Sysdream). Celui-ci sera mensuel et aura pour concept de dispenser une formation d'environ 4h sur divers thèmes choisi par la communauté. Le premier thème abordé sera la sécurité VoIP et sera dispensé par CrashFr. Il vous est possible de réserver vos places en formulant votre demande sur meeting@thehackademy.net. Les meeting sont aussi l'occassion pour ceux qui n'auront pas la chance d'assister à la formation de faire des rencontres avec les autres membres de la communauté. Biensur ce meeting est ouvert à tous et gratuit (seul la limite de place disponible peut vous empecher l'accès; alors faites vite !).
Bonne année et n'oubliez pas: HZV will never die !
|
| Voir le sujet précédent :: Voir le sujet suivant |
| Auteur |
Message |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Sam Déc 15, 2007 5:29 pm |
Sujet du message: C - Effacer un fichier définitivement
|
|
Bonjour à tous, dans l'étude de différent algorithme de cryptographie, je me suis posé la question : lors du cryptage d'un fichier avec un logiciel, si le fichier d'origine est supprimé avec un simple remove(), il peut être retrouver grace à des logiciels spécifiques.
Esque ce morceau de code permettrait d'avoir une supprésion irréversible ?
| Code: | if ((in=fopen(szFile,"wb")) == NULL) {MessageBox(hwnd,"Fichier introuvable","",NULL);;}
int x;
for(x=0;x<10240;x++)
{fputc(0,in);}
remove(szFile); |
Et sinon, comment supprimer un fichier définitivement ?
Dernière édition par HacKSpideR le Lun Déc 17, 2007 1:50 pm; édité 1 fois |
|
| Revenir en haut |
|
 |
Celelibi

Inscrit le: 29 Mar 2006 Messages: 770
|
Posté le: Dim Déc 16, 2007 11:21 am |
Sujet du message:
|
|
Pourquoi écris un nombre fixes d'octets ?
Pour retrouver les données après ça, c'est peut-être possible.
Si c'est un bon vieux disque dur magnétique, il y a des chances pour que ça soit possible car la magnétisation du disque n'est jamais parfaite quand tu écris dessus. Et comme tu écris uniquement des 0 il devient possible de retrouver l'ancienne valeur.
Si tu écris des données aléatoires, ça devient plus marrant déjà.
Sinon, il me semble qu'un document décrit comment effacer d'une manière correcte les données. De mémoire il faut un minimum de 7 passes.
Tiens voilà un document qui en parle :
http://www.usenix.org/publications/library/proceedings/sec96/full_papers/gutmann/
Il propose 35 passes.
Mais bon, généralement, écrire 0x55 (alternance stricte de 1 et 0 en binaire) puis 0xAA (son complément) suivi d'une écriture de données aléatoire devrait suffire pour la plus part des cas.
Note que tes quelques lignes de code ressemblent plus à du C mal indenté qu'à du C++.  _________________ Il y a un boulet qui sommeille en chacun de nous. (enfin, surtout vous...) |
|
| Revenir en haut |
|
 |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Dim Déc 16, 2007 2:35 pm |
Sujet du message:
|
|
Merci pour le lien , je vais essayer en écrivant un binaire aléatoire.
Pour le code je l'ai écrit vite fait, je ne connais pas encore par coeur la fonction createfile, je remplacerai fopen, fputc et remove  |
|
| Revenir en haut |
|
 |
Celelibi

Inscrit le: 29 Mar 2006 Messages: 770
|
Posté le: Dim Déc 16, 2007 3:42 pm |
Sujet du message:
|
|
C'est pas parce que tu vas utiliser une fonction de l'API windows à la place de l'API standard que ton programme va plus ressembler à du C++.
Tu ferais mieux de le faire en pure C. _________________ Il y a un boulet qui sommeille en chacun de nous. (enfin, surtout vous...) |
|
| Revenir en haut |
|
 |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Lun Déc 17, 2007 11:38 am |
Sujet du message:
|
|
Ok c'est bon, je l'ai fait en C
j'ai fait sa, mais je n'utilise pas 0x55 et 0xAA. J'ai testé ce code il est un peu long voir très long ^^ et plante parfois lorsque le fichier et sur une clée usb.
| Code: | if(mes == IDYES)
{
int y;
int x;
int n =1;
for(y=0;y<10;y++)
{
if ((in=fopen(szFile,"wb")) == NULL) {MessageBox(hwnd,"Fichier introuvable","",MB_ICONWARNING);return 1;}
for(x=0;x<1024000;x++)
{
int partSize = (n == RAND_MAX) ? 1 : 1 + (RAND_MAX - n)/(n+1);
int maxUsefull = partSize * n + (partSize-1);
int draw;
do
{
draw = rand();
} while (draw > maxUsefull);
fputc(draw,in);
}
fclose(in);
}
DeleteFile(szFile);
} |
Je pense que ce code devrait faire l'affaire mais je ne suis pas sur, j'ai lu le site que tu m'as indiqué avec ma traduction approximative et je pense avoir compris le principe. |
|
| Revenir en haut |
|
 |
Celelibi

Inscrit le: 29 Mar 2006 Messages: 770
|
Posté le: Mer Déc 19, 2007 11:27 pm |
Sujet du message:
|
|
Je trouve ça un peu abusif d'ouvrir et fermer le fichier à chaque fois. Pour forcer l'écriture du buffer sur le disque, utilise plutôt la fonction fflush puis sync.
Ensuite tu as toujours la taille fixe de 1024000 octets, tu vas donc agrandir le fichier jusqu'à quasiment 1Go.
Je suis pas sûr de comprendre comment fonctionne ton programme (il en manque un morceau ? genre n++ ?), mais il me semble possible que certains bits ne soient probablement pas modifiés, ce qui fait qu'il est possible de retrouver des morceaux d'information.
Je pense qu'on ne peut pas faire moins de trois passes dont deux constante. De façon à avoir écrit des 0 et des 1 dans chaque bit, puis une dernière passe aléatoire afin d'éviter tout calcul des anciennes valeurs.
Sans oublier le fflush puis sync pour forcer l'écriture sur disque.
Cela dit, sync c'est un appel système pour linux, je pense qu'il existe un truc équivalent pour windows. _________________ Il y a un boulet qui sommeille en chacun de nous. (enfin, surtout vous...) |
|
| Revenir en haut |
|
 |
Celelibi

Inscrit le: 29 Mar 2006 Messages: 770
|
Posté le: Jeu Déc 20, 2007 11:04 am |
Sujet du message:
|
|
Addendum :
Note que étant donné la technologie utilisée pour les clés USB, Une seul et unique passe avec que des 0 devrait suffire. Puisque je ne pense pas qu'il y ait de rémanence des données, mais ça demande confirmation. _________________ Il y a un boulet qui sommeille en chacun de nous. (enfin, surtout vous...) |
|
| Revenir en haut |
|
 |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Jeu Déc 20, 2007 5:03 pm |
Sujet du message:
|
|
En faite le fichier est vidée à chaque passage ( w+b ) donc sa n'atteint pas 1Go, c'est pour sa qu'il est ouvert et fermé à chaque passage. Pour n, il sert à avoir un nombre entre 0 et n, ici entre 0 et 1.
Par contre mon code crer un nombre binaire "pseudo-aléatoire", je ne sais pas si cela convient ?
Pour la fonction fflush et sync je vais me renseigner
Donc je vais retraivailler sa, en plus c'est les vacances demain, sa tombe bien
Par contre il faudrai que j'écrit un nombre d'octet égal au nombre d'octet du fichier original ? |
|
| Revenir en haut |
|
 |
Celelibi

Inscrit le: 29 Mar 2006 Messages: 770
|
Posté le: Ven Déc 21, 2007 2:53 am |
Sujet du message:
|
|
L'ouverture avec les modes "wb" permet de tronquer le fichier et placer le pointeur au début du fichier. Mais il n'empêche que tu écris 1024000 octets, donc tu étends le fichier jusqu'à cette taille.
Et puis tu devrais peut-être éviter d'utiliser fopen. J'avais pas relu le man fopen, mais étant donné qu'il tronque le fichier, les blocs de données seront peut-être libéré puis réalloués quand tu vas réécrire. Le problème c'est que les blocs de données réalloués ne seront peut-être pas ceux qui étaient utilisés pour l'ancien fichier, et par conséquent tu risque d'écrire dans des blocs de données qui ne contiennent aucune information sensible. Les informations sensibles restent quant-à elles dans leurs blocs de données qui ont été libérés et pas réalloués.
Je suis pas sûr que ça soit bien clair ce que je raconte.
Bref, ça va vraiment dépendre du fs et de la façon dont le système gère le fs.
Sous linux je te dirais de passer par l'appel système open afin de positionner le pointeur d'écriture au début du fichier sans pour autant tronquer le fichier.
Note que mettre une taille fixe est toujours mauvais parce que je pourrais toujours créer un fichier plus grand.  _________________ Il y a un boulet qui sommeille en chacun de nous. (enfin, surtout vous...) |
|
| Revenir en haut |
|
 |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Ven Déc 21, 2007 4:49 pm |
Sujet du message:
|
|
Oui effectivement, ce n'est pas sur que j'écrivent sur le "bon" fichier. Je vais trouver autre chose.
Merci d'avoir répondue à mes questions, je reposterai lorsque j'aurai trouver comment remedier au problème
Sur ce, Bonne Vancance ! |
|
| Revenir en haut |
|
 |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Sam Déc 22, 2007 1:11 pm |
Sujet du message:
|
|
Je vien de fouinner un peu sur cpp.france et j'ai trouvé ce morceau de code que j'ai tester, il remplie le fichier de 0 mais d'une autre facon que moi.
| Code: | #define BLOC 0x100000
// ...
HANDLE hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{return FALSE;}
LPVOID p = HeapAlloc(GetProcessHeap(), 0, BLOC);
DWORD d;
memset(p, 0, BLOC);
DWORD dwSize = GetFileSize(hFile, NULL);
while(dwSize > 0)
{
if(dwSize >= BLOC)
{
dwSize -= BLOC;
if(!WriteFile(hFile, p, BLOC, &d, NULL) || d != BLOC)
{
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, p);
return FALSE;
}
}
else
{
if(!WriteFile(hFile, p, dwSize, &d, NULL) || d != dwSize)
{
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, p);
return FALSE;
}
dwSize = 0;
}
}
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, p);
}
DeleteFile(szFile); |
Je vais essayer de faire en sorte qu'il écrive des données pseudo-aléatoire mais sinon esque cette manière et plus efficace que la mienne ? |
|
| Revenir en haut |
|
 |
Celelibi

Inscrit le: 29 Mar 2006 Messages: 770
|
Posté le: Sam Déc 22, 2007 6:43 pm |
Sujet du message:
|
|
J'aurais du mal à dire quoi que ce soit à propos de ce code, je ne connais pas du tout l'API win32, c'est pas des fonctions standard.
Maintenant que j'ai râlé, je vais dire que dnas le cas général, oui ce code est plus efficace que le tien. Mais après il faut voir si windows utilise un buffer disque. Si c'est le cas, la différence de performance sera vraiment minime. _________________ Il y a un boulet qui sommeille en chacun de nous. (enfin, surtout vous...) |
|
| Revenir en haut |
|
 |
HacKSpideR

Inscrit le: 19 Juin 2007 Messages: 37
|
Posté le: Jeu Déc 27, 2007 5:27 pm |
Sujet du message:
|
|
Je vais finallement laisser comme sa, je vais quand meme voir si je pourrai pas choper une partie du code source de shred sur linux, il utilise la methode de guttman.
Merci pour ton aide Celelibi
et bonnes fetes |
|
| Revenir en haut |
|
 |
|
|