Introduction

Certains disques dur comme les My Passport de Western Digital contiennent un chiffrement matériel et il faut donc un mot de passe pour y accéder.
Sous Windows il n’est possible d’y accéder qu’avec le logiciel WD Unlocker, aussi appelé WD Drive Unlock, mais rien d’officiel pour Linux.
J’ai donc cherché comment y accéder sous linux et voici la solution, qui n’est certes pas la plus simple mais fonctionne.

Récupération des différents logiciels

Les manipulations suivantes ont été faites sous Ubuntu 12.04.

Il faut récupérer le script python wdpassport-utils permettant de générer le mot de passe sur github :
git clone https://github.com/KenMacD/wdpassport-utils.git

puis installer les sg3-utils :
sudo apt-get install sg3-utils

Et enfin un petit bout de code qui permet de reseter le disque dur après avoir envoyé le mot de passe, à enregistrer sous usbreset.c par exemple :
[c]
/* usbreset — send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>

int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;

if (argc != 2) {
fprintf(stderr, "Usage: usbreset device-filename\n");
return 1;
}
filename = argv[1];

fd = open(filename, O_WRONLY);
if (fd < 0) {
perror("Error opening output file");
return 1;
}

printf("Resetting USB device %s\n", filename);
#if 0
rc = ioctl(fd, USBDEVFS_RESET, 0);

if (rc < 0) {
perror("Error in ioctl");
return 1;
}
#else
//Work on WD My Passport
struct usbdevfs_ioctl usb_ioctl;
usb_ioctl.ifno = 0;
usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
usb_ioctl.data = NULL;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);
if (rc == -1 && errno != ENODATA) {
perror("Error in ioctl (USBDEVFS_DISCONNECT)");
return 1;
}

sleep(1);

usb_ioctl.ifno = 0;
usb_ioctl.ioctl_code = USBDEVFS_CONNECT;
usb_ioctl.data = NULL;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);
if (rc == -1 && errno != ENODATA) {
perror("Error in ioctl (USBDEVFS_CONNECT)");
return 1;
}
#endif

printf("Reset successful\n");

close(fd);
return 0;
}
[/c]
et le compiler :
gcc usbreset.c -o usbreset

Utilisation des différents outils

Génération du mot de passe

Avec le script python qui va générer un fichier password.bin :
./cookpw.py MotDePasse > password.bin

Informations du disque

Pour trouver le disque dur il faut utiliser les commandes
dmesg |grep sg |grep "type 13"
qui nous donne
[ 3588.636411] ses 9:0:0:2: Attached scsi generic sg4 type 13
et
lsusb
qui nous donne
Bus 004 Device 005: ID 1058:0748 Western Digital Technologies, Inc.

Envois des commandes

Avec ces informations nous pouvons donc envoyer le mot de passe au disque dur :
sudo sg_raw -s 40 -i password.bin /dev/sg4 c1 e1 00 00 00 00 00 00 28 00
Puis le redémarrer :
sudo ./usbreset /dev/bus/usb/004/005

Normalement le disque dur se montera automatiquement.