Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1092 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Ecrire sur une clé USB sans passer par le FS

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire sur une clé USB sans passer par le FS

n°1740945
cppisevil
Posté le 03-06-2008 à 17:01:10  profilanswer
 

Bonjour,
 
Je cherche à écrire sur une clé USB mais sans passer par le FS.
En fait ce que je veux faire c'est caché des données sur une clé.
C'est pour gérer des licences ( et les trucs du commerce sont trop chers ... )
Le truc c'est que comme c'est pour des soucis de licence, je ne peux pas juste crypté les fichiers, car il suffirait de copier collé le contenu de la clé sur l'ordi perso de l'utilisateur par exemple, et quand il a fini d'utiliser la clé de restaurer la clé avec les données initiales ...
 
1) A part écrire un driver spécifique, y a t il d'autres moyens ?  
2) Existe t il déjà des librairies ou driver permettant de faire ce genre de choses ?
3) Si je dois me taper un driver spécifique, des pistes d'exemples, j'ai rien trouvé (à part de préparer une cafetière ...)
 
 

mood
Publicité
Posté le 03-06-2008 à 17:01:10  profilanswer
 

n°1741655
cppisevil
Posté le 05-06-2008 à 09:28:51  profilanswer
 

J'ai essayé de regarder tout ce qu'on pouvait faire avec la fonction DeviceIoControl()
 
Mais je n'ai pas réussi
 
Je cherche le moyen de parcourir la FAT
Et d'écrire moi même dans les clusters, sans respecter le système de fichier d'ailleurs, mais je saurais ou j'ai écris quelque chose
 
En autres solutions, j'aurais voulu pouvoir mettre un fichier invisible, (avec le flag qui indique que le fichier a été effacé), mais j'ai pas trouvé comment faire non plus.
 
Si quelqu'un a des idées :)
 
 
 

n°1742878
sligor
Posté le 07-06-2008 à 16:00:47  profilanswer
 

cppisevil a écrit :

Bonjour,
 
Je cherche à écrire sur une clé USB mais sans passer par le FS.
En fait ce que je veux faire c'est caché des données sur une clé.
C'est pour gérer des licences ( et les trucs du commerce sont trop chers ... )


C'est de la sécurité par l'obsurantisme, ça se fait péter en 2 secondes.

n°1744572
cppisevil
Posté le 11-06-2008 à 10:09:55  profilanswer
 

Oui sans doute, tout est petable de toute façon
 
Mais là ou c'est destiné, le risque est faible d'avoir ce type de profil
 
 

n°1744685
xilebo
noone
Posté le 11-06-2008 à 12:27:10  profilanswer
 

voici le code source de rawdisk :  
 

Code :
  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. //  RawDisk - Direct Disk Read/Write Access for NT/2000/XP
  4. //  Copyright (c) 2003 Jan Kiszka
  5. //
  6. //  This program is free software; you can redistribute it and/or modify
  7. //  it under the terms of the GNU General Public License as published by
  8. //  the Free Software Foundation; either version 2 of the License, or
  9. //  (at your option) any later version.
  10. //
  11. //  This program is distributed in the hope that it will be useful,
  12. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. //  GNU General Public License for more details.
  15. //
  16. //  You should have received a copy of the GNU General Public License
  17. //  along with this program; if not, write to the Free Software
  18. //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. //
  20. //////////////////////////////////////////////////////////////////////
  21. #include "stdafx.h"
  22. #include "Version.h"
  23. #define BUFFER_SIZE     1024*1024
  24. int lock_volume(HANDLE hDisk)
  25. {
  26.     DWORD dummy;
  27.     return DeviceIoControl(hDisk, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0,
  28.                            &dummy, NULL);
  29. }
  30. int unlock_volume(HANDLE hDisk)
  31. {
  32.     DWORD dummy;
  33.     return DeviceIoControl(hDisk, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0,
  34.                            &dummy, NULL);
  35. }
  36. void usage(void)
  37. {
  38.     printf(" Usage: rawdisk [-r|-w] diskno imagefilen"
  39.            "        rawdisk -i disknonn"
  40.            "t-r       tread from diskn"
  41.            "t-w       twrite to diskn"
  42.            "t-i       tprint disk parameters onlyn"
  43.            "tdiskno   tnumber of harddisk to read or write (0 for first disk)n"
  44.            "timagefiletname of the image filenn" );
  45.     exit(1);
  46. }
  47. void error(char* msg)
  48. {
  49.     char* pMsgBuf;
  50.     printf(msg);
  51.     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
  52.                   FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
  53.                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pMsgBuf,
  54.                   0, NULL);
  55.     printf(pMsgBuf);
  56.     LocalFree(pMsgBuf);
  57.     exit(1);
  58. }
  59. int main(int argc, char* argv[])
  60. {
  61.     enum {read, write, info} mode;
  62.     unsigned int    diskno;
  63.     char            diskname[] = "\\.\PhysicalDrive0";
  64.     HANDLE          hDisk;
  65.     HANDLE          hFile;
  66.     DWORD           count;
  67.     DISK_GEOMETRY   geometry;
  68.     LONGLONG        totalSize;
  69.     LONGLONG        bufSize;
  70.     PVOID           pBuffer;
  71.     DWORD           blockSize;
  72.     DWORD           i;
  73.     DWORD           blocks;
  74.     printf("RawDisk " VER_FILEVERSION_STR ", Copyright (c) 2003 Jan Kiszkan" );
  75.     if ((argc < 3) || (argc > 4))
  76.         usage();
  77.     if (strcmp(argv[1], "-r" ) == 0)
  78.         mode = read;
  79.     else if (strcmp(argv[1], "-w" ) == 0)
  80.         mode = write;
  81.     else if (strcmp(argv[1], "-i" ) == 0)
  82.         mode = info;
  83.     else
  84.         usage();
  85.     if ((mode != info) && (argc !=4))
  86.         usage();
  87.     if (sscanf(argv[2], "%ud", &diskno) != 1)
  88.         usage();
  89.     if ((diskno == 0) && (mode == write))
  90.     {
  91.         printf(" To avoid damage, writing to the first disk - which is most "
  92.                "likely your systemn hard disk - is currently disabled.n" );
  93.         exit(1);
  94.     }
  95.     diskname[strlen(diskname)-1] += diskno;
  96.     pBuffer = VirtualAlloc(NULL, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
  97.     if (pBuffer == NULL)
  98.         error(" Error allocating a buffer: " );
  99.     hDisk = CreateFile(diskname, (mode == read) ? GENERIC_READ : GENERIC_WRITE,
  100.                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
  101.                        FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, NULL);
  102.     if (hDisk == INVALID_HANDLE_VALUE)
  103.         error(" Error opening disk: " );
  104.     if (mode != info)
  105.     {
  106.         hFile = CreateFile(argv[3], (mode == write) ? GENERIC_READ : GENERIC_WRITE,
  107.                            0, NULL, (mode == write) ? OPEN_EXISTING : CREATE_ALWAYS,
  108.                            FILE_ATTRIBUTE_NORMAL, NULL);
  109.         if (hFile == INVALID_HANDLE_VALUE)
  110.             error(" Error opening image file: " );
  111.     }
  112.     if (!DeviceIoControl(hDisk, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0,
  113.                          &geometry, sizeof(geometry), &count, NULL))
  114.         error(" Error reading disk parameters: " );
  115.     totalSize = geometry.Cylinders.QuadPart * geometry.TracksPerCylinder *
  116.         geometry.SectorsPerTrack * geometry.BytesPerSector;
  117.     printf(" Disk Size:           t%.1f MB (%I64u bytes)n",
  118.            ((float)totalSize)/(1024*1024), totalSize);
  119.     if (mode == info)
  120.     {
  121.         printf("  Cylinders:          t%I64un"
  122.                "  Tracks per Cylinder:t%un"
  123.                "  Sectors per Track:  t%un"
  124.                "  Byte per Sector:    t%un", geometry.Cylinders.QuadPart,
  125.                geometry.TracksPerCylinder, geometry.SectorsPerTrack,
  126.                geometry.BytesPerSector);
  127.         CloseHandle(hDisk);
  128.         return 0;
  129.     }
  130.     if (!lock_volume(hDisk))
  131.         error(" Error locking disk: " );
  132.     i       = 0;
  133.     bufSize = BUFFER_SIZE;
  134.     blocks  = (DWORD)((totalSize + BUFFER_SIZE-1) / bufSize);
  135.     if (mode == read)
  136.     {
  137.         while (totalSize > 0)
  138.         {
  139.             printf("r Reading Disk %d:     t%u/%u", diskno, i, blocks);
  140.             blockSize = BUFFER_SIZE;
  141.             if (totalSize < blockSize)
  142.                 blockSize = (DWORD)totalSize;
  143.             if (!ReadFile(hDisk, pBuffer, blockSize, &count, NULL))
  144.             {
  145.                 count = GetLastError();
  146.                 unlock_volume(hDisk);
  147.                 SetLastError(count);
  148.                 error(" Error reading from disk: " );
  149.             }
  150.             if (!WriteFile(hFile, pBuffer, blockSize, &count, NULL))
  151.             {
  152.                 count = GetLastError();
  153.                 unlock_volume(hDisk);
  154.                 SetLastError(count);
  155.                 error(" Error writing to image file: " );
  156.             }
  157.             totalSize -= blockSize;
  158.             i++;
  159.         }
  160.         printf("r Reading Disk %d:     t%u/%un", diskno, i, blocks);
  161.     }
  162.     else
  163.     {
  164.         while (totalSize > 0)
  165.         {
  166.             printf("r Writing Disk %d:     t%u/%u", diskno, i, blocks);
  167.             blockSize = BUFFER_SIZE;
  168.             if (totalSize < blockSize)
  169.                 blockSize = (DWORD)totalSize;
  170.             if (!ReadFile(hFile, pBuffer, blockSize, &count, NULL))
  171.             {
  172.                 count = GetLastError();
  173.                 unlock_volume(hDisk);
  174.                 SetLastError(count);
  175.                 error(" Error reading from image file: " );
  176.             }
  177.             if (!WriteFile(hDisk, pBuffer, blockSize, &count, NULL))
  178.             {
  179.                 count = GetLastError();
  180.                 unlock_volume(hDisk);
  181.                 SetLastError(count);
  182.                 error(" Error writing to disk: " );
  183.             }
  184.             totalSize -= blockSize;
  185.             i++;
  186.         }
  187.         printf("r Writing Disk %d:     t%u/%un", diskno, i, blocks);
  188.     }
  189.     unlock_volume(hDisk);
  190.     CloseHandle(hDisk);
  191.     CloseHandle(hFile);
  192.     return 0;
  193. }


 
Ca devrait pouvoir t'aider.
 
 
(source : http://www.stud.uni-hannover.de/~kiszka/RawDisk/ )

n°1744807
cppisevil
Posté le 11-06-2008 à 14:38:35  profilanswer
 

Merci je vais regarder ce que ça fait :)

n°1744966
cppisevil
Posté le 11-06-2008 à 17:36:16  profilanswer
 

C'est exactement ce que je cherchais
 
En fait j'avais testé d'ecrire/lire sur le volume et sur le disque physique directement. Mais ca n'avait pas marché peut etre des problemes de parametres
 
Merci :)
 

n°1744983
xilebo
noone
Posté le 11-06-2008 à 17:57:51  profilanswer
 

Gaffe lors des essais. Si tu ouvres ton disque systeme, tu perds tout.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Ecrire sur une clé USB sans passer par le FS

 

Sujets relatifs
[shell] Passer stdin à une commande passé au shell sur stdinEcrire un texte à la verticale, à 90° : possible ?
passer de mac à windowsPasser un objet Array à une fonction JS
Passer une valeur dans le liens!? GET ou POST? [RESOLUS]Comment passer du flash au .html
[C#] Lecture d'un port USBPasser d'un site en frame en div
Macro excel passer plusieurs variableEcrire / Lire dans un fichier txt avec J2ME
Plus de sujets relatifs à : Ecrire sur une clé USB sans passer par le FS


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR