Ecrire sur une clé USB sans passer par le FS

Ecrire sur une clé USB sans passer par le FS - C++ - Programmation

Marsh Posté le 03-06-2008 à 17:01:10    

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 ...)
 
 

Reply

Marsh Posté le 03-06-2008 à 17:01:10   

Reply

Marsh Posté le 05-06-2008 à 09:28:51    

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 :)
 
 
 

Reply

Marsh Posté le 07-06-2008 à 16:00:47    

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.

Reply

Marsh Posté le 11-06-2008 à 10:09:55    

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
 
 

Reply

Marsh Posté le 11-06-2008 à 12:27:10    

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/ )

Reply

Marsh Posté le 11-06-2008 à 14:38:35    

Merci je vais regarder ce que ça fait :)

Reply

Marsh Posté le 11-06-2008 à 17:36:16    

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 :)
 

Reply

Marsh Posté le 11-06-2008 à 17:57:51    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed