Astuces diverses en vrac

Cet article a pour but de répertorier quelques astuces que j’utilise fréquemment, et qui peuvent aussi être disponibles sur notre Wiki Linux

Renommer des fichiers

Il est parfois utile de renommer des fichiers pour par exemple remplacer/supprimer des caractères spéciaux (dans cet exemple les : qui ne sont pas supportés pas Windows…)
for ix in *.png; do mv "$ix" "`echo $ix | sed 's/chaine a remplacer/chaine de remplacement/'`";done
ou
for ix in *.png; do mv "$ix" "`echo $ix | tr ':' '-'`";done

Renommer des fichiers en .old

Il est parfois utile de renommer des fichiers en .old pour en faire une sauvegarde.
Pour cela un simple script copytoold.sh permet de le faire
#!/bin/sh
for ix in $@;do cp "$ix" "$ix.old";done

Faire un Checkout svn derrière un proxy

Il faut éditer le fichier /etc/subversion/servers et modifier les lignes :

[global]
http-proxy-host = proxy.domain.com
http-proxy-port = 8080

Faire un md5sum récursif

find . -type f -exec md5sum {} \;

Lancer Wireshark sans les droit root et avoir accès aux interfaces réseau

Comme expliqué sur le wiki de wireshark :
sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap

Do While en bash

while true;do commande;sleep 1;done

Désactiver un coeur du CPU

De façon dynamique :
sudo echo 0 > /sys/devices/system/cpu/cpu2/online
Au démarrage en ajoutant « maxcpus=n » aux bootargs

Convertir un fichier binaire en tableau C

Avec la commande
xxd -c16 -i fichier_binaire

Créer une copie d’un ftp en ligne de commande

wget -m ftp://user:pass@server.com/

Effacer efficacement un fichier

shred -z -u -v nomdufichier
ou
srm -zv nomdufichier

Effacer efficacement récursivement plusieurs fichiers

find nomdurepertoire -type f -exec shred -z -u -v {} \;
ou
srm -rzv nomdurepertoire;

Faire fonctionner la touche Backspace en console ou via ssh

Il arrive parfois que la touche Backspace (ou Del) ne fonctionne pas correctement et à la place d’effacer le caractère précédent, affiche ^?. Il faut donc affecter l’effacement à cette touche avec la commande :
stty erase ^?
Afficher les différentes affectations se fait avec la commande :
stty -a

Recherche d’une chaîne de caractères dans des fichiers jar

find . -name "*.jar" -exec echo '{}' \; -exec zipgrep "Chaine a chercher" '{}' \;

Extraire l’extension et le nom du fichier

filename=$(basename "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"

Supprimer une extension

for ix in *.old; do mv $ix $(basename $ix .old);done

Télécharger plusieurs répertoires avec rsync et ssh

rsync --protect-args --partial --progress --rsh=ssh -r username@url:/home/ubuntu/dir/dir/{Dir1,Dir2,Dir3} ./

Utilisation de screen

Lancement :
screen
Mise en arrière plan :
CTRL+a d
Recuperation de la console :
screen -r

Boucle for en bash

De 1 à 10 :
for IX in $(seq 1 10); do echo $IX; done
Avec des 0 pour 01 à 10
for IX in $(seq -w 1 10); do echo $IX; done

Découper un mp3 grâce à un fichier cue

Pour le découper et nommer numéro de piste – Groupe – Titre :
mp3splt -f -c fichier.cue fichier.mp3 -o @n+-+@p+-+@t

Gestion du swap sous linux

Il est possible de savoir à partir de combien de pourcent de RAM restante le système va commencer à swapper :
cat /proc/sys/vm/swappiness
Pour modifier cette valeur et attendre par exemple 90% de RAM utilisée il suffit d’ajouter/modifier l’entrée vm.swappiness dans /etc/sysctl.conf comme par exemple
vm.swappiness = 10

Afficher les informations de connections de la freebox V5

wget -qO- http://mafreebox.freebox.fr/pub/fbx_info.txt
Et si il y a un problème d’accents :
wget -qO- http://mafreebox.freebox.fr/pub/fbx_info.txt|iconv -f iso8859-1 -t utf8

Aspirer un site web

-s0 : Sans prise en compte du robots.txt
-A1000000 : Vitesse max de 1Mo/s
-%c2 : max 2 connections par secondes
httrack --mirror http://site.web/ -s0 --disable-security-limits -A1000000 -%c2

Simulation d’appuis touche

Pour scripter des appuis sur des touches et pouvoir se la jouer sans les mains il y a l’outil xdotool.
Pour un appuis sur plusieurs touches en même temps il faut les séparer par +, dans l’exemple suivant le focus est mis sur Firefox, puis un appuis simultané sur les touches a, s, l et p, tout en les maintenant enfoncées.

#!/bin/bash
WID=`xdotool search --name "Mozilla Firefox" | head -1`
xdotool windowfocus $WID
while [ 1 ]
do
xdotool keydown a+s+l+p
sleep 0.1
done

Compresser tous les répertoires d’un répertoire dans des archives séparées

#!/bin/bash
for f in *; do
    if [[ -d $f ]]; then
        # $f is a directory
        tar cvzf "$f".tar.gz "$f"
    fi
done

Copier des fichiers dans des sous-répertoires en fonction de leur 1er caractere

#!/bin/bash
for ix in $(seq 0 9); do
echo $ix
mkdir $ix
for f in *; do
    if [[ -f $f ]]; then
        if [ ${f:0:1} = $ix ]; then
#          echo $f
          mv $f $ix
        fi
    fi
done
done

Effacer une ligne en bash pour afficher un autre texte

Les options
-n do not output the trailing newline
-e enable interpretation of backslash escapes
\r carriage return

#!/bin/bash
echo "test"
while true;do
echo -en "\r-";sleep 1
echo -en "\r\\";sleep 1
echo -en "\r|";sleep 1
echo -en "\r/";sleep 1
done

Récupérer un fichier protégé par cookies et referer avec wget

wget --cookies=on --keep-session-cookies --save-cookies=cookie.txt http://first_page
wget --referer=http://first_page --cookies=on --load-cookies=cookie.txt --keep-session-cookies --save-cookies=cookie.txt http://second_page

Serveur Web Simple

Thin est un serveur web simple en Ruby.
Fichier de configuration config.ru pour partager le répertoire local:
run Rack::Directory.new(Dir.pwd)
Commande pour lancer le serveur sur le port 8000 avec le fichier de config précédent :
thin -Rconfig.ru start -p 8000

Convertir une chaîne de caractère hexadécimale en fichier binaire

echo "506C6F70" | xxd -r -p > plop

Comparaison hexadécimale en bash

[[ 0x8000 -gt $CMD1 ]] && echo yes|| echo no

Empêcher l’upmix sur pulseaudio

Pour que pulseaudio ne recopie pas le stéréo sur les différents canaux audio de l’ampli, il suffit de rajouter dans le fichier /etc/pulse/daemon.conf les lignes suivantes :
enable-remixing = no
enable-lfe-remixing = no

Ajouter les droits en lecture récursivement

Le X permet d’ajouter l’exécution sur les répertoires uniquement.

chmod -R +rX *

Copier des images en fonction de leurs données EXIF

Suite à la récupération d’images avec photorec sur un disque dur formaté par erreur, il faut parfois faire une première passe de tri.

#!/bin/bash
mkdir AX250
mkdir D700
mkdir FE4020
for ix in *;do
  if [[ -f $ix ]];then
    if [[ $(file $ix |grep AX250) ]]; then
      echo "AX250 $ix"
      cp $ix AX250/
    fi
    if [[ $(file $ix |grep D700) ]]; then
      echo "D700 $ix"
      cp $ix D700/
    fi
    if [[ $(file $ix |grep FE4020) ]]; then
      echo "FE4020 $ix"
      cp $ix FE4020/
    fi
  fi
done

Copier des répertoires sur un ftp en ligne de commande

ncftpput -R -v -u root -P 2100 192.168.0.4 /raid0/data/_NAS_Media/Vacances/ ./Photos*

minicom

minicom -o -b 115200 -8 -con -w -D /dev/ttyUSB0

-o : Do not initialize
-b : Specify the baud rate
-8 : 8bit characters pass through without any modification
-con : Color on
-w : Turns line-wrap on at startup by default
-D : Specify the device

Montage d’une partition d’une image disque

Il faut récupérer l’offset avec parted :
esver@PC:~/sav$ parted disque.img
Utilisation de /home/esver/sav/disque.img
Bievenue sur GNU Parted ! Tapez 'help' pour voir la liste des commandes.
(parted) unit B
(parted) print
Modèle: (file)
Disque /home/esver/sav/disque.img : 1500301910016B
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : msdos
Disk Flags:

Numéro Début Fin Taille Type Système de fichiers Fanions
1 1048576B 1500301492223B 1500300443648B primary ext4 démarrage

(parted) quit
mount -o loop,ro,offset=1048576 disque.img /mnt/tempo

Utilisation de fsck sur une partition d’une image disque

Montage sur loop0 (avec l’offset donné par parted par exemple)
losetup -o 1048576 /dev/loop0 disque.img
Utilisation d’un autre superblock pour réparer la partition (donné par testdisk par exemple)
sudo fsck.ext4 -p -b 163840 -B 4096 /dev/loop0

Intégrer la licence Windows 7 OEM d’un PC sous VirtualBox

Introduction

Le but de l’opération est de réinstaller le Windows présent à l’origine sur l’ordinateur dans une machine virtuelle sous linux et de garder l’activation de celui-ci.
Pour être activé, un Windows 7 OEM doit remplir 3 conditions :
– Avoir une table ACPI SLIC dans le BIOS,
– Avoir un certificat correspondant à cette table
– Avoir une clé correspondant au certificat et à la table.
Pour pouvoir passer cette licence sous VirtualBox il faut sauvegarder la clé et le certificat de Windows (si aucun DVD contenant Windows et ses certificats n’a été fourni avec l’ordinateur) pour les remettre dans la machine virtuelle et aussi permettre à celle-ci d’accéder à la table SLIC du BIOS. Il est ainsi possible de garder son Windows OEM dans une machine virtuelle tout en passant sa machine sous GNU/Linux.

Sauvegarde de la clé ainsi que du certificat de Windows 7

Pour cela il suffit de lancer en administrateur l’application SLIC_ToolKit_V3.2, cliquer sur l’onglet Advanced et cliquer sur le bouton Backup pour sauvegarder la clé ainsi que le certificat.
SLIC_ToolKit_V3.2

La clé se trouve dans le fichier ProductId.txt et le certificat contient l’extension xrm-ms.

Copie des information du BIOS dans la machine virtuelle

À la main

Copie de la table slic dans la machine virtuelle :
sudo dd if="/sys/firmware/acpi/tables/SLIC" of=Emplacement_de_la_VM
sudo chown $USER: Emplacement_de_la_VM

Ajout de la table dans la VM
VBoxManage setextradata "Nom_De_La_VM" "VBoxInternal/Devices/acpi/0/Config/CustomTable" "Emplacement_de_la_VM"

Puis grâce à l’outil dmidecode, qui permet d’afficher certaines données du BIOS, il faut copier les valeurs Vendor et Version de BIOS Information (dmidecode -t0), Manufacturer et Product Name de System Information (dmidecode -t1) et enfin Manufacturer et Product Name de Base Board Information (dmidecode -t2) dans respectivement
VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor
VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVersion
VBoxInternal/Devices/pcbios/0/Config/DmiSystemProduct
VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor
VBoxInternal/Devices/pcbios/0/Config/DmiBoardProduct
VBoxInternal/Devices/pcbios/0/Config/DmiBoardVendor
En respectant la casse.

Script Shell qui automatise tout ça sous Linux

Voici un script qui permet d’automatiser la copie du SLIC ainsi que des valeurs trouvées avec dmidecode dans la machine virtuelle :

#!/bin/sh

SLIC_LOCATION="/sys/firmware/acpi/tables/SLIC"

VM_NAME="$1"

if ([ -n "$VM_NAME" ]);then
  VM_IN_LIST=`VBoxManage list vms |grep "$VM_NAME"`
  if ([ -n "$VM_IN_LIST" ]);then

    VM_BASE_DIR=`VBoxManage showvminfo "$VM_NAME" |grep "Config file:"|sed 's/Config file://'|sed 's/^[ \t]*//'| grep -o '.*/'`
    SLIC_LOCAL_LOCATION="${VM_BASE_DIR%/}/SLIC.bin"

    if [ ! -e "$SLIC_LOCATION" ];then
      echo "No SLIC table found"
    elif [ -f "$SLIC_LOCATION" ];then
      echo "SLIC exist, copy to $SLIC_LOCAL_LOCATION"
      sudo dd if="$SLIC_LOCATION" of="$SLIC_LOCAL_LOCATION"
      sudo chown $USER: "$SLIC_LOCAL_LOCATION"
      
      VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/acpi/0/Config/CustomTable"          "$SLIC_LOCAL_LOCATION"
    fi
    
    BIOS_VENDOR=`sudo dmidecode -t0| grep 'Vendor:'|sed 's/Vendor://'|sed 's/^[ \t]*//'`
    BIOS_VERSION=`sudo dmidecode -t0| grep 'Version:'|sed 's/Version://'|sed 's/^[ \t]*//'`
    
    SYSTEM_VENDOR=`sudo dmidecode -t1| grep 'Manufacturer:'|sed 's/Manufacturer://'|sed 's/^[ \t]*//'`
    SYSTEM_PRODUCT=`sudo dmidecode -t1| grep 'Product Name:'|sed 's/Product Name://'|sed 's/^[ \t]*//'`

    BOARD_VENDOR=`sudo dmidecode -t2| grep 'Manufacturer:'|sed 's/Manufacturer://'|sed 's/^[ \t]*//'`
    BOARD_PRODUCT=`sudo dmidecode -t2| grep 'Product Name:'|sed 's/Product Name://'|sed 's/^[ \t]*//'`

    VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor"      "string:$BIOS_VENDOR"
    VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVersion"     "string:$BIOS_VERSION"
    VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/pcbios/0/Config/DmiSystemProduct"   "string:$SYSTEM_PRODUCT"
    VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor"    "string:$SYSTEM_VENDOR"
    VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/pcbios/0/Config/DmiBoardProduct"    "string:$BOARD_PRODUCT"
    VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/pcbios/0/Config/DmiBoardVendor"     "string:$BOARD_VENDOR"
  else
    echo "VM not found"
  fi
else
  echo "Use VM_ACPI.sh \"VM to modify\""
  VBoxManage list vms
fi

Script BATCH qui automatise tout ça sous Windows (ou presque)

Voici un script qui permet d’automatiser la copie du SLIC ainsi que des valeurs trouvées avec dmidecode dans la machine virtuelle, il faut préalablement avoir récupéré la table SLIC dans un fichier avec l’outil SLIC_ToolKit_V3.2 (fichier renommé en SLIC.BIN dans l’exemple ci dessous) et avoir récupérés les outils grep, sed et DmiDecode ainsi que leurs dépendances sur GnuWin32.
Il faut aussi rajouter le PATH vers VBoxManage (souvent C:\Program Files\Oracle\VirtualBox).

@echo off
rem Add to path : C:\Program Files\Oracle\VirtualBox
rem setlocal for local variable
rem enabledelayedexpansion remplace % with ! in if/else
setlocal enabledelayedexpansion
set SLIC_NAME=SLIC.BIN


set VM_NAME=%1

if not [%VM_NAME%] == [] (
  for /F "delims=" %%V in ('VBoxManage list vms ^| grep %VM_NAME%') do set VM_IN_LIST=%%V
  if not [!VM_IN_LIST!] == [] (

    rem ~pdV : p pour lettre de lecteur et d pour repertoires cf http://www.computerhope.com/FORhlp.htm
    for /F "delims=" %%V in ('VBoxManage showvminfo !VM_NAME! ^|grep "Config file:"^|sed "s/Config file://"^|sed "s/^[ \t]*//"') do set VM_BASE_DIR=%%~pdV
    set SLIC_LOCAL_LOCATION=!VM_BASE_DIR!!SLIC_NAME!

    if exist !SLIC_NAME! (
      echo SLIC exist, copy to $SLIC_LOCAL_LOCATION
      copy !SLIC_NAME! "!SLIC_LOCAL_LOCATION!"
      VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/acpi/0/Config/CustomTable"          "!VM_BASE_DIR!!SLIC_NAME!"
    ) else (
      echo No SLIC table found
    )

    for /F "delims=" %%V in ('dmidecode -t0^| grep "Vendor:"^|sed "s/Vendor://"^|sed "s/^[ \t]*//"') do set BIOS_VENDOR=%%V
    for /F "delims=" %%V in ('dmidecode -t0^| grep "Version:"^|sed "s/Version://"^|sed "s/^[ \t]*//"') do set BIOS_VERSION=%%V

    for /F "delims=" %%V in ('dmidecode -t1^| grep "Manufacturer:"^|sed "s/Manufacturer://"^|sed "s/^[ \t]*//"') do set SYSTEM_VENDOR=%%V
    for /F "delims=" %%V in ('dmidecode -t1^| grep "Product Name:"^|sed "s/Product Name://"^|sed "s/^[ \t]*//"') do set SYSTEM_PRODUCT=%%V

    for /F "delims=" %%V in ('dmidecode -t2^| grep "Manufacturer:"^|sed "s/Manufacturer://"^|sed "s/^[ \t]*//"') do set BOARD_VENDOR=%%V
    for /F "delims=" %%V in ('dmidecode -t2^| grep "Product Name:"^|sed "s/Product Name://"^|sed "s/^[ \t]*//"') do set BOARD_PRODUCT=%%V

    echo Set BOARD_PRODUCT to "!BOARD_PRODUCT!"
    VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/pcbios/0/Config/DmiBoardProduct"    "string:!BOARD_PRODUCT!"
    echo Set BOARD_VENDOR to "!BOARD_VENDOR!"
    VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/pcbios/0/Config/DmiBoardVendor"     "string:!BOARD_VENDOR!"

    echo Set SYSTEM_PRODUCT to "!SYSTEM_PRODUCT!"
    VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/pcbios/0/Config/DmiSystemProduct"   "string:!SYSTEM_PRODUCT!"
    echo Set SYSTEM_VENDOR to "!SYSTEM_VENDOR!"
    VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor"    "string:!SYSTEM_VENDOR!"
  
    echo Set BIOS_VENDOR to "!BIOS_VENDOR!"
    VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor"      "string:!BIOS_VENDOR!"
    echo Set BIOS_VERSION to "!BIOS_VERSION!"
    VBoxManage setextradata !VM_NAME! "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVersion"     "string:!BIOS_VERSION!"

  ) else (
  echo VM not found
  )
) else (
  echo Use slicadd.cmd "VM to modify"
  VBoxManage list vms 
)

Activer Windows en lui mettant la clé et le certificat

À la main

Ajout du certificat
slmgr -ilc Chemin\vers\le\certificat.xrm-ms
Ajout de la clé
slmgr -ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

Script BATCH qui automatise tout ça

Voici un script windows, à modifier en fonction de la clé et du certificat sauvegardé précédemment, qui permet de copier le certificat ainsi que la clé (les chemins ne doivent pas contenir d’espaces) à lancer en administrateur :

@echo off
setlocal enableextensions
echo "Installation du certificat"
slmgr -ilc "%~dp0\DELL_V2.1_Cert.xrm-ms"
echo "Installation de la cle"
slmgr -ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

Modification d’un bios AMI pour y rajouter un microcode Intel

Dans cet article nous verrons comment modifier certains BIOS AMI pour ajouter ou mettre à jour un microcode de processeur non compressé, cette article fait suite à l’article Modification d’un bios Award pour y rajouter un microcode Intel et est basé sur le bios d’une carte mère Asus P5Q Deluxe.
Attention, faire ceci peut être dommageable et empêcher le démarrage de votre ordinateur, il est conseillé de pouvoir reflasher le bios grâce à un programmateur externe, par exemple mon programmateur de SPI

Pour commencer nous allons récupérer les microcode Intel puis les mettre sous une forme compréhensible par le bios, pour cela il faut se rendre sur le site http://downloadcenter.intel.com/, dans mon cas j’ai sélectionné Processors=>Desktop=>Intel Core 2 Quad Processor puis le microcode Linux* Processor Microcode Data File
J’ai ensuite récupéré un petit logiciel permettant de transformer ce fichier, il est disponible ici.

Il vous suffit de le compiler puis de le lancer avec comme paramètre le fichier de microcode précédemment téléchargé, vous aurez ainsi tous les fichiers sous la forme voulue.

Celui qui m’intéresse pour mon E8400 est cpu0001067a_plat00000011_ver00000a0b_date20100928.bin.

Il faut ensuite lancer MMTOOL et ouvrir le bios :
wine ./MMTOOL.EXE
Se rendre sur l’onglet CPU PATCH et supprimer l’entrée existante pour le processeur (dans ce cas c’est le CPU ID 067A et le Platform Type 11)
modbiosami1

Puis ajouter le nouveau microcode
modbiosami2

Et enfin sauvegarder le bios et le flasher pour faire la mise à jour.

Outils pour mise à jours d’un téléphone Android HTC sous linux

Voici quelques outils bien utiles pour mettre à jour son téléphone android avec des ROM RUU de chez HTC, dans cet exemple ce sera un HTC Desire.

Extraction du fichier rom.zip d’un exécutable RUU

Pour cela il faut un
– exécutable RUU (dans cet exemple le fichier RUU_Bravo_Froyo_HTC_WWE_2.29.405.5_Radio_32.49.00.32U_5.11.05.27_release_159811_signed.exe pour un HTC Desire)
– le programme unruu
Tout d’abord récupérer les sources de unruu ainsi que la librairie unshield du même auteur :
git clone https://github.com/twogood/unshield.git
cd unshield/
./bootstrap
./configure --prefix=/usr
make
sudo make install

Une fois la librairie installée, faire de même avec unruu :
git clone https://github.com/kmdm/unruu.git
cd unruu
./autogen.sh
./configure
make

Il est maintenant possible d’extraire le fichier rom.zip de la façon suivante :
./unruu RUU_Bravo_Froyo_HTC_WWE_2.29.405.5_Radio_32.49.00.32U_5.11.05.27_release_159811_signed.exe
Il en résulte un fichier rom.zip contenant la ROM, ce fichier peut être renommé en PB99IMG.zip et placé à la racine de la carte SD pour être flashée par le bootloarder.
Pour pouvoir être flashé il faut que le bootloader soit verrouillé, s’il est déverrouillé il faut entrer la commande suivante en mode fastboot :
fastboot oem lock

Flasher la rom par fastboot

Une fois le fichier rom.zip extrait, il est possible de la flasher par fastboot sans la copier sur la carte SD avec la commande suivante :
fastboot flash zip rom.zip

Erreur « Main version is older »

Il arrive que la version à flasher soit plus ancienne que ce peut accepter le téléphone (par exemple avec la mise à jour du hboot 1.03.003 qui a permit de débloquer le téléphone), cela est du au numéro de version présente dans la partition misc.
Il suffit donc d’extraire cette partition avec la commande
cat /dev/mtd/mtd0 > /sdcard/mtd0.img
De modifier avec un éditeur héxadécimal le numéro de version qui se trouve à l’adresse 0xA0 et puis de reflasher ce fichier avec la commande
flash_image misc /sdcard/mtd0.img
Il est maintenant de nouveau possible de flasher la ROM par le bootloader.

Rooter son téléphone sous Froyo ou Gingerbread à la main

Voici la procédure permettant de rooter un HTC Desire sous Froyo (2.2.2) avec son bootloader débloqué grâce à l’exploit GingerBreak. La manipulation suivante permet de comprendre les étapes du root, et aussi d’avoir la maîtrise des outils car tout est fait à partir de code source.

Les outils nécessaires sont :
– le SDK et le NDK android
– l’exploit GingerBreak en version 2 disponible ici
les sources de l’application Superuser de Koush
– une carte SD insérée dans le téléphone

Le SDK est installé dans le répertoire /home/esver/android-sdks.
Le NDK est installé dans le répertoire /home/esver/android-ndk.

Mise en place des différents outils

mkdir GingerRoot
cd GingerRoot

Compilation de l’exploit GingerBreak V2

mkdir GingerBreak
cd GingerBreak
mkdir jni
copier dans le répertoire jni l’exploit GingerBreak v2 et le nommer GingerBreak.c
Créer un fichier Android.mk dans le répertoire jni et y coller

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := Ginger
LOCAL_SRC_FILES := GingerBreak.c

include $(BUILD_EXECUTABLE)

Créer aussi un fichier Application.mk dans ce répertoire jni et y coller

APP_ABI := armeabi
NDK_TOOLCHAIN_VERSION=4.7
APP_PIE = false

Compiler l’application :
/home/esver/android-ndk-r8e/ndk-build
L’exécutable se trouve dans le répertoire libs/armeabi/

Compilation de l’application Superuser

Se placer dans le répertoire GingerRoot
Récupérer l’applicatif sur le depot GIT de Koush :
git clone git://github.com/koush/Superuser
git clone git://github.com/koush/Widgets

Créer un fichier local.properties dans le répertoire Superuser/Superuser contenant

ndk.dir=/home/esver/android-ndk/
sdk.dir=/home/esver/android-sdks/

Copier ce fichier dans le répertoire Widgets/Widgets

Création d’un fichier clé s’il n’en existe pas déjà un avec la commande
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
et copier ce fichier dans /home/esver

Créer un fichier ant.properties dans le répertoire Superuser/Superuser contenant
key.store=/home/esver/my-release-key.keystore
key.alias=alias_name

Entrer dans le répertoire Superuser/Superuser pour compiler l’applicatif Superuser
cd Superuser/Superuser
Et lancer la compilation
ant release

L’executable su se trouver dans libs/armeabi/su et l’apk se trouve dans bin/Superuser-release.apk

Utilisation de l’exploit ainsi que de l’applicatif Superuser pour rooter le téléphone

Créer un répertoire stuff dans le répertoire GingerRoot et y copier le binaire su, l’apk ainsi que le binaire Ginger ainsi que le binaire adb (/home/esver/android-sdks/platform-tools/adb)
Connecter le téléphone en usb avec l’option développement par usb,
copier les fichiers dans le répertoire /data/local/tmp du téléphone :
./stuff/adb push stuff/Ginger /data/local/tmp/Ginger
./stuff/adb push stuff/su /data/local/tmp/su
./stuff/adb push stuff/Superuser-release.apk /data/local/tmp/Superuser-release.apk

Se connecter au shell sur le téléphone :
./stuff/adb shell

Une fois sur le tel aller dans le répertoire /data/local/tmp et lancer l’exploit Ginger :
cd /data/local/tmp
./Ginger

Normalement ça y est on est root (passage de $ à #), il faut maintenant remonter la partition system en écriture (la partition peut être différente suivant les téléphones, le voir avec la commande mount) :
mount -o rw,remount /dev/block/mtdblock3 /system

Copier les fichiers su et l’apk dans les répertoires /system/bin et /system/app et changer les droits sur les fichiers :
cat su > /system/xbin/su
chown 0:0 /system/xbin/su
chmod 6755 /system/xbin/su
ln -s /system/xbin/su /system/bin/su

cat Superuser-release.apk > /system/app/Superuser.apk
chmod 644 /system/app/Superuser.apk

Normalement tout est bon, redémarrer le téléphone, le mode root est accessible.

Compilation de la ROM AOSP pour un Sony Xperia Z

Préparation des outils et de l’environnement de compilation :

Voir l’article sur la compilation de la ROM CyanogenMod pour les différents paquets à installer.
sudo apt-get install xsltproc python-lunch
mkdir ~/bin
PATH=~/bin:$PATH
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
chmod a+x ~/bin/repo

Création du répertoire de travail :
mkdir XZ_AOSP
cd XZ_AOSP

Télécharger les binaires pour le XP à l’adresse suivante : http://developer.sonymobile.com/downloads/tool/software-binaries-for-xperia-z-and-xperia-tablet-z/
unzip SW_binaries_for_Xperia_Z_Xperia_Tablet_Z_v3.zip

Initialisation du repo local

repo init -u https://android.googlesource.com/platform/manifest
mkdir .repo/local_manifests

Créer le fichier .repo/local_manifests/c6603.xml et y coller le texte suivant :

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote  name="sony" fetch="git://github.com/sonyxperiadev/" />

<remove-project name="platform/hardware/qcom/display" />
<remove-project name="platform/hardware/qcom/keymaster" />
<remove-project name="platform/hardware/qcom/media" />
<remove-project name="platform/hardware/qcom/msm8960" />
<remove-project name="platform/hardware/qcom/power" />
<remove-project name="platform/hardware/qcom/sensors" />
<remove-project name="platform/hardware/invensense" />
<remove-project name="platform/hardware/akm" />

<project path="device/sony/lagan" name="device-sony-lagan" groups="device" remote="sony" revision="master" />
<project path="device/sony/c6603" name="device-sony-c6603" groups="device" remote="sony" revision="master" />
<project path="vendor/sony/dash" name="DASH" groups="device" revision="master" remote="sony" />
</manifest>

Télécharger les sources

repo sync

Configuration de la cible pour le XZ

. build/envsetup.sh
lunch full_c6603-userdebug

Compilation

make

Les fichiers img se trouveront dans le répertoire out/target/product/generic

Pour aller plus loin

Compilation avec openjdk sous ubuntu 12.04

Je n’ai pas testé l’image pour savoir si elle était conforme et que tout était compilé convenablement, ce n’est qu’à l’état de test de compilation.

Installation de tous les paquets requis :
sudo apt-get install xsltproc python-lunch git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool g++-multilib lib32z1-dev lib32ncurses5-dev lib32readline-gplv2-dev gcc-multilib gobjc++-multilib openjdk-6-jdk libxml2-utils

Commenter les lignes de test d’openjdk du fichier build/core/main.mk

# Check for the corrent jdk
#ifneq ($(shell java -version 2>&1 | grep -i openjdk),)
#$(info ************************************************************)
#$(info You are attempting to build with an unsupported JDK.)
#$(info $(space))
#$(info You use OpenJDK but only Sun/Oracle JDK is supported.)
#$(info Please follow the machine setup instructions at)
#$(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html)
#$(info ************************************************************)
#$(error stop)
#endif

puis compiler avec make

Codes secrets sur un HTC Desire

Pour accéder au menu caché des fonctions de test sur un téléphone HTC Desire il suffit de composer le *#*#3424#*#* , un moyen mnémotechnique est de retenir le fait que ces touches correspondent à *#*#diag#*#*.

Il est aussi possible d’accéder au menu caché Android.

Encodage de DVD en ligne de commande

Je vais présenter ici les scripts que j’utilise pour encoder des séries, pour pouvoir les stocker et les regarder sur PC sans avoir à changer de DVD au bout de 4-5 épisodes. Pour cela j’ai un script qui copie le DVD sur le disque dur, un autre qui m’affiche ses infos et enfin 2 script pour l’encodage suivant la façon dont les épisodes sont découpés (par chapitres ou par titres).

Pour l’encodage j’utilise un « PC » Quad core mais avec pour sortie vidéo une liaison série, il faut donc que tout se passe en console.

Les logiciels utilisés sont ddrescue pour copier le DVD et essayer de corriger les erreurs s’il est rayé, mplayer pour acquérir les infos sur le DVD et HandBrakeCLI pour l’encodage.

Prérequis

Installer le ppa pour handbrake
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:stebbins/handbrake-releases

Installer les différents paquets :
sudo apt-get install mplayer gddrescue handbrake-cli

Activer la lecture des dvds protégés :
sudo /usr/share/doc/libdvdread4/install-css.sh

Scripts utilisés

Le premier script copie donc le DVD sur le disque dur :

#!/bin/bash

INPUT="/dev/dvd"

if [ -z "$1" ]
then
NOM_DVD=`mplayer -dvd-device "$INPUT" dvd:// -frames 0 -msglevel identify=6 2>>/dev/null |grep "ID_DVD_VOLUME_ID"| sed "s/ID_DVD_VOLUME_ID=//"`
else
NOM_DVD="$1"
fi
echo "Sauvegarde du dvd : $NOM_DVD"

ddrescue -B -n -b2048 "$INPUT" "$NOM_DVD.iso" "ddrescue.log" 2>>/dev/null
ddrescue -B -d -r 0 -b2048 "$INPUT" "$NOM_DVD.iso" "ddrescue.log" 2>>/dev/null
ddrescue -B -d -r 0 -R -b2048 "$INPUT" "$NOM_DVD.iso" "ddrescue.log" 2>>/dev/null

rm ddrescue.log

Ensuite le script qui affiche les informations sur le dvd :

#!/bin/bash
mplayer -dvd-device "$1" dvd:// -frames 0 -msglevel identify=6 2>>/dev/null|grep "ID_DVD"

Ensuite un script d’encodage permettant de découper les épisodes lorsqu’ils sont tous dans le même titre, le script détecte le titre le plus long et découpe les épisode en fonction de la configuration #Config qui indique l’index de départ ainsi que le modulo, par exemple pour un épisode contenant 4 chapitres (intro,1ere partie,2e partie, fin) le modulo est de 4, pour une suite d’épisode complet ce sera 1.

#!/bin/bash

#Utilisation :
#encode_dvd_modulo.sh nom_du_fichier.iso

NOM_DU_FICHIER_ISO=$1
NOM_DU_FICHIER_RIP="${NOM_DU_FICHIER_ISO%.*}_Ep"

echo "*******************************"
echo NOM_DU_FICHIER_ISO : $NOM_DU_FICHIER_ISO
echo "*******************************"

#Config
START=1
MODULO=4
PISTE_AUDIO=2

#Nombre de Titres
TITRE_LONG=0
TITRE_A_RIP=0
TITRE_TOTAL=`mplayer -dvd-device "$NOM_DU_FICHIER_ISO" dvd:// -frames 0 -msglevel identify=6 -lavdopts threads=4 2>>/dev/null |grep "ID_DVD_TITLES"| sed -r "s/ID_DVD_TITLES=([0-9]+)/\\1/"`
echo "*******************************"
echo Titre total : $TITRE_TOTAL
echo "*******************************"
#nombre de chapitres du titre 2 :
for IX in `seq 1 $TITRE_TOTAL`;do
echo "*******************************"
echo IX : $IX
echo "*******************************"
 LONGUEUR=`mplayer -dvd-device "$NOM_DU_FICHIER_ISO" dvd:// -frames 0 -msglevel identify=6 -lavdopts threads=4 2>>/dev/null |grep "ID_DVD_TITLE_"$IX"_LENGTH"| sed -r "s/ID_DVD_TITLE_"$IX"_LENGTH=([0-9]+)(\\..*)?/\\1/"`
 if [ $LONGUEUR -gt $TITRE_LONG ]; then
echo "*******************************"
echo "if [ $LONGUEUR -gt $TITRE_LONG ]; then" $LONGUEUR $TITRE_LONG
echo "*******************************"
 NOMBRE_DE_CHAPITRES=`mplayer -dvd-device "$NOM_DU_FICHIER_ISO" dvd:// -frames 0 -msglevel identify=6 -lavdopts threads=4 2>>/dev/null |grep "ID_DVD_TITLE_"$IX"_CHAPTERS"| sed -r "s/ID_DVD_TITLE_"$IX"_CHAPTERS=([0-9]+)/\\1/"`
 TITRE_A_RIP=$IX
 TITRE_LONG=$LONGUEUR
 fi
done
echo "*******************************"
echo titre : $TITRE_A_RIP chapitres : $NOMBRE_DE_CHAPITRES
echo "*******************************"

for IX in `seq $START $NOMBRE_DE_CHAPITRES`;do
 if [ `expr $(($IX + 1 - $START)) % $MODULO` -eq 0 ];then
 if [ $MODULO -eq 1 ];then
 CHAPITRES_A_RIP=$IX
 else
 CHAPITRES_A_RIP=`expr $IX + 1 - $MODULO`-$IX
 fi

 HandBrakeCLI -i "$NOM_DU_FICHIER_ISO" -o "$NOM_DU_FICHIER_RIP"$(printf "%02d" $IX).mkv -t $TITRE_A_RIP -c $CHAPITRES_A_RIP -e x264 --x264-tune animation -q 20.0 -a $PISTE_AUDIO -E lame -B 160 -f mkv --detelecine --decomb -m -2
 fi

done

Le second script permet l’encodage de plusieurs titres sur un même DVD.

#!/bin/bash

#Utilisation :
#encode_dvd_multi_titles.sh nom_du_fichier.iso titre1,titre2,titreX numero_de_depart_du_titre_pour_nomage

NOM_DU_FICHIER_ISO=$1
NOM_DU_FICHIER_RIP=`echo "${NOM_DU_FICHIER_ISO%.*}_Ep" | tr " " "_"`

LISTE=`echo "$2" | tr "," " "`

echo "*******************************"
echo NOM_DU_FICHIER_ISO : $NOM_DU_FICHIER_ISO
echo "*******************************"

for IX in $LISTE;do
 echo "*******************************"
 echo Encodage du fichier $NOM_DU_FICHIER_RIP$(printf "%02d" $(($IX + $3))).mkv
 echo "*******************************"
 HandBrakeCLI -i "$NOM_DU_FICHIER_ISO" -o $NOM_DU_FICHIER_RIP$(printf "%02d" $(($IX + $3))).mkv -t $IX -e x264 --x264-tune animation -q 20.0 -a 3 -E lame -B 160 -f mkv --detelecine --decomb -m -2
done

Exemple d’utilisation des scripts

Encodage d’une serie

Pour cette série j’encode les 2 pistes audio, et les 2 pistes de sous-titres, par défaut je mets la langue française et les sous-titres forcées pour cette langue (c’est une série d’animation avec certains passages censurés dans sa version française)
La config handbrake du script :
HandBrakeCLI -i "$NOM_DU_FICHIER_ISO" -o $NOM_DU_FICHIER_RIP$(printf "%02d" $(($IX + $3))).mkv -t $IX -s 2,1 --subtitle-default 1 -e x264 --x264-tune animation -q 20.0 -a 1,2 -E lame -B 160 -f mkv --detelecine --decomb -m -2 -T
La commande utilisée avec le script
./encode_dvd_multi_titles.sh RANMA_KOL_19_SCN.iso 2,3,4,5,7,8 96

Script complémentaire

Changement des pistes audio et sous-titres par défaut

Le script suivant permet de modifier les pistes lues par défaut pour par exemple passer d’une langue française avec les sous-titres pour cette langue à une langue japonaise avec sous-titres français.

#!/bin/bash
for FILE in *.mkv
do
#mkvpropedit $FILE --edit track:a1 --set flag-default=1 --edit track:a2 --set flag-default=0 --edit track:s1 --set flag-default=1 --edit track:s2 --set flag-default=0
mkvpropedit $FILE --edit track:a1 --set flag-default=0 --edit track:a2 --set flag-default=1 --edit track:s1 --set flag-default=0 --edit track:s2 --set flag-default=1
done

Introduction aux outils bluetooth en ligne de commande sous linux

Voici une petite introduction aux outils disponibles sous la ligne de commande linux pour effectuer quelques opérations avec le bluetooth.

Détections des modules connectés

Cette commande permet d’afficher les différents modules bluetooth connectés au PC :

hcitool dev
Devices:
hci0 00:20:E0:9B:XX:XX
hci1 00:1B:11:63:XX:XX

Nous avons donc 2 modules bluetooth connectés soit hci0 et hci1.

Recherche des voisins visibles

Pour recherché les éléments bluetooth du voisinage :

hcitool -i hci1 scan
Scanning ...
8C:DE:52:06:XX:XX SRS-BTV5

Nous avons donc détecté une enceinte portable Sony SRS-BTV5.

Demande d’infos

Pour avoir des informations sur cette enceinte bluetooth il faut utiliser la commande suivante :

sudo hcitool -i hci1 info 8C:DE:52:06:XX:XX
Requesting information ...
BD Address: 8C:DE:52:06:XX:XX
Device Name: SRS-BTV5
LMP Version: 3.0 (0x5) LMP Subversion: 0x2200
Manufacturer: Integrated System Solution Corp. (57)
Features page 0: 0xbf 0xff 0xff 0xfe 0x88 0x3d 0x19 0x86
<3-slot packets> <5-slot packets>

<3-slot EDR ACL>
<5-slot EDR ACL>

Features page 1: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00

L’outil sdptool permet d’avoir d’autres information dont les services offert par le périphérique :

sdptool browse 8C:DE:52:06:XX:XX
Browsing 8C:DE:52:06:XX:XX ...
Service RecHandle: 0x10001
Service Class ID List:
"PnP Information" (0x1200)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 1
"SDP" (0x0001)
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"PnP Information" (0x1200)
Version: 0x0100

Service Name: Headset unit
Service RecHandle: 0x10002
Service Class ID List:
« Headset » (0x1108)
« Generic Audio » (0x1203)
Protocol Descriptor List:
« L2CAP » (0x0100)
« RFCOMM » (0x0003)
Channel: 2
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
« Headset » (0x1108)
Version: 0x0100

Service Name: Hands-free unit
Service RecHandle: 0x10003
Service Class ID List:
« Handsfree » (0x111e)
« Generic Audio » (0x1203)
Protocol Descriptor List:
« L2CAP » (0x0100)
« RFCOMM » (0x0003)
Channel: 1
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
« Handsfree » (0x111e)
Version: 0x0105

Service Name: Audio SNK
Service Provider: ISSC
Service RecHandle: 0x10008
Service Class ID List:
« Audio Sink » (0x110b)
Protocol Descriptor List:
« L2CAP » (0x0100)
PSM: 25
« AVDTP » (0x0019)
uint16: 0x100
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
« Advanced Audio » (0x110d)
Version: 0x0100

Service Name: AVRCP CT
Service Provider: ISSC
Service RecHandle: 0x10006
Service Class ID List:
« AV Remote » (0x110e)
Protocol Descriptor List:
« L2CAP » (0x0100)
PSM: 23
« AVCTP » (0x0017)
uint16: 0x100
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
« AV Remote » (0x110e)
Version: 0x0100

Service Name: AVRCP TG
Service Provider: ISSC
Service RecHandle: 0x1000c
Service Class ID List:
« AV Remote Target » (0x110c)
Protocol Descriptor List:
« L2CAP » (0x0100)
PSM: 23
« AVCTP » (0x0017)
uint16: 0x100
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
« AV Remote » (0x110e)
Version: 0x0100

Récupérer le nom d’un élément

Pour ne récupérer que le nom de l’élement bluetooth il suffit d’utiliser la commande suivante :

hcitool -i hci1 name 8C:DE:52:06:XX:XX
SRS-BTV5

Introduction aux outils pour les puces Bluetooth CSR

Dans cet article nous verrons comment sauvegarder/restaurer un firmware sur une puce CSR.

Attention, faire ceci peut être dommageable et empêcher le bon fonctionnement de votre dongle Bluetooth voir le rendre inopérant.

Identification des composants

Tout d’abord il faut connaître le fabricant de la puce avec la commande hciconfig -a qui devrait afficher les informations des différents éléments bluetooth connectés à l’ordinateur, par exemple :
hci0: Type: BR/EDR Bus: USB
BD Address: 00:20:E0:9B:XX:XX ACL MTU: 192:8 SCO MTU: 64:8
UP RUNNING PSCAN
RX bytes:2454 acl:0 sco:0 events:87 errors:0
TX bytes:562 acl:0 sco:0 commands:51 errors:0
Features: 0xff 0xff 0x8f 0x78 0x18 0x18 0x00 0x80
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'malin-0'
Class: 0x6e0100
Service Classes: Networking, Rendering, Capturing, Audio, Telephony
Device Class: Computer, Uncategorized
HCI Version: 1.1 (0x1) Revision: 0x571
LMP Version: 1.1 (0x1) Subversion: 0x571
Manufacturer: Cambridge Silicon Radio (10)

hci1: Type: BR/EDR Bus: USB
BD Address: 00:1E:58:3F:XX:XX ACL MTU: 384:8 SCO MTU: 64:8
UP RUNNING PSCAN
RX bytes:789 acl:0 sco:0 events:28 errors:0
TX bytes:376 acl:0 sco:0 commands:27 errors:0
Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'malin-1'
Class: 0x6e0100
Service Classes: Networking, Rendering, Capturing, Audio, Telephony
Device Class: Computer, Uncategorized
HCI Version: 2.0 (0x3) Revision: 0x77b
LMP Version: 2.0 (0x3) Subversion: 0x77b
Manufacturer: Cambridge Silicon Radio (10)

 

hci2: Type: BR/EDR Bus: USB
BD Address: 00:1B:11:63:XX:XX ACL MTU: 1017:8 SCO MTU: 64:0
UP RUNNING PSCAN
RX bytes:779 acl:0 sco:0 events:27 errors:0
TX bytes:376 acl:0 sco:0 commands:27 errors:0
Features: 0xff 0xff 0x8d 0xfe 0x9b 0xf9 0x00 0x80
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'malin-2'
Class: 0x6e0100
Service Classes: Networking, Rendering, Capturing, Audio, Telephony
Device Class: Computer, Uncategorized
HCI Version: 2.0 (0x3) Revision: 0x403d
LMP Version: 2.0 (0x3) Subversion: 0x430e
Manufacturer: Broadcom Corporation (15)

Nous pouvons donc voir que nous avons 2 éléments venant de chez CSR(Cambridge Silicon Radio) qui sont hci0 et hci1.

Pour connaître les révisions des composants il faut lancer la commande bccmd -d hci0 chiprev ce qui donne pour mes 2 éléments :
sudo bccmd -d hci0 chiprev
Chip revision: 0x008a (BC2-External B)
sudo bccmd -d hci1 chiprev
Chip revision: 0x0026 (BC4-External)

Nous avons donc une puce BC2-Ext et une BC4-Ext qui sont toutes les deux programmables (-Ext et non -Rom).

Sauvegarde et modification du firmware CSR

Pour sauvegarder les firmwares de ces puces il faut utiliser la commande dfutool archive nomdufichier.dfu et sélectionné l’élément désiré, cela permet de sauvegarder le firmware.

Il est ainsi par exemple possible de passer la clé DBT-120 utilisant le chip Bluecore4-Ext en bluetooth 2.1 par mise à jour de firmware avec la commande dfutool upgrade nouveaufirmware.dfu.

Détection des registres

Il suffit de taper la commande sudo bccmd -d hci1 pslist

0x0001 - Bluetooth address (8 bytes)
0x01f9 - Host interface (2 bytes)
0x01fe - Crystal frequency (2 bytes)
0x0209 - TX and RX PIO control (2 bytes)
0x025c - Module security code (16 bytes)
0x02be - USB vendor identifier (2 bytes)
0x02bf - USB product identifier (2 bytes)

Modification des Vendor Id et Product Id USB

Il est aussi possible de modifier le vendor Id de la clé usb avec la commande bccmd psset -s 0x0000 0x02be 0x07d1 où 0x07d1 est le Vendor Id de la clé DBT-120 ainsi que le Product Id bccmd psset -s 0x0000 0x02bf 0xfc01.

Modification de l’adresse Mac

Pour lire l’adresse Mac du dongle :

sudo bccmd -d hci1 psget -s 0x0001 0x0001

Et pour le modifier de façon à avoir une adresse Mac 01:02:03:04:05:06 :

sudo bccmd -d hci1 psset -s 0x0001 0x0001 0x04 0x00 0x06 0x05 0x03 0x00 0x02 0x01