Modifier le logo du BIOS d’un PC HP

Attention, faire ceci peut être dommageable et empêcher le démarrage de votre ordinateur.

Introduction

Je cherchais depuis quelques temps s’il était possible de changer l’image du bios qui s’affiche lorsqu’on boot, avec l’uefi on peut souvent faire pleins de trucs. Ça permet de le customiser, voir de mettre son adresse mail, en cas de vol, ben ça fait chier l’acheteur (jusqu’à ce qu’il trouve ce billet).

Outils disponibles

Il existe l’outil eRepLogo d’HP mais il n’est pas compatible avec le BIOS d’un ProBook 650 G2.

Par contre l’outil HP CustomLogoApp.efi du pack pour Z440/Z640/Z840 fonctionne.

Utilisation

Je me suis fait un petit script pour tout automatiser, à partir d’un exemple trouvé dans l’outil UEFI d’intel pour tester les processeurs et paf, j’ai un nouvel écran de démarrage.
Le fichier doit fait 1024*768 d’après ce que j’ai compris et être un JPG, je me fais donc une image 1920*1080 pour avoir ma bonne résolution puis je la passe en 1024*768 et la copie sur ma clé.

Liens supplémentaires

Release notes HP Ereplogo Utility
Release notes HP Z440/Z640/Z840 Workstations BIOS Utilities for Windows
Page Web de l’outil Intel Processor Diagnostic Tool for UEFI

Astuces Wireshark

Filtrer les requêtes dhcp en fonction d’une adresse mac

bootp.hw.mac_addr == b8:27:eb:d3:cc:dd
bootp.hw.mac_addr[0:3] == b8:27:eb

Filtrer les requêtes dhcp et le trafique en fonction d’une adresse mac

bootp.type == 2 || eth.addr[0:3]==b8:27:eb

Filtrer les requêtes HTTP GET en fonction d’une adresse mac

eth.addr[0:3]==b8:27:eb && http.request.method == « GET »

Configuration des touches de luminosité avec acpid

Suite au passage sous Ubuntu 16.10 sur mon HP ProBook 650 G2, le rétro éclairage ne fonctionnait plus avec le réglage précédent.
Pour contourner le problème il est possible de passer par le daemon acpid, après détection des touches avec l’outil acpi_listen :
video/brightnessup BRTUP 00000086 00000000 K
video/brightnessup BRTUP 00000086 00000000 K

Il faut donc créer 3 fichiers :
/etc/acpi/hp-probook650g2-backlight.sh

#!/bin/sh

# this directory is a symlink on my machine:
KEYS_DIR=/sys/class/backlight/intel_backlight/
STEP=25
STEPTIME=0.01

test -d $KEYS_DIR || exit 0

MIN=0
MAX=$(cat $KEYS_DIR/max_brightness)
VALOLD=$(cat $KEYS_DIR/brightness)

if [ "$1" = down ]; then
	VAL=$((VALOLD-STEP))
else
	VAL=$((VALOLD+STEP))
fi

if [ "$VAL" -lt $MIN ]; then
	VAL=$MIN
elif [ "$VAL" -gt $MAX ]; then
	VAL=$MAX
fi

if [ "$VAL" -gt "$VALOLD" ]; then
  VALSEQ=$(seq $VALOLD $VAL)
else
  VALSEQ=$(seq $VALOLD -1 $VAL)
fi

for IX in $VALSEQ; do
  echo $IX > $KEYS_DIR/brightness
  sleep $STEPTIME
done

/etc/acpi/events/hp-probook650g2-backlight-down

# /etc/acpi/events/hp-probook650g2-backlight-down
# This is called when the user presses the key brightness 
# down button and calls /etc/acpi/hp-probook650g2-backlight.sh for
# further processing.

event=video/brightnessdown BRTDN 00000087 00000000 K
action=/etc/acpi/hp-probook650g2-backlight.sh down

/etc/acpi/events/hp-probook650g2-backlight-up

# /etc/acpi/events/hp-probook650g2-backlight-up
# This is called when the user presses the key brightness 
# down button and calls /etc/acpi/hp-probook650g2-backlight.sh for
# further processing.

event=video/brightnessup BRTUP 00000086 00000000 K
action=/etc/acpi/hp-probook650g2-backlight.sh up

Configuration des touches de luminosité et son sous compiz/cairo-dock

Suite à l’acquisition d’un HP ProBook 650 G2 et à son passage sous Ubuntu 16.04 avec Cairo-Dock, les touches de gestion de luminosité et du volume n’étaient pas prise en compte.
Pour les faire fonctionner, je suis passé par le Gestionnaire de Configuration CompizConfig(ccsm).
Menu Général->Commandes

Ajout des commandes

Commandes
Pour la luminosité j’utilise :

xbacklight -dec 5
xbacklight -inc 5

Et pour le volume, soit par alsa mixer :

amixer -D pulse sset Master 5%-
amixer -D pulse sset Master 5%+
amixer -D pulse set Master 1+ toggle

soit avec pactl (pulse audio) :

pactl set-sink-mute 0 false ; pactl set-sink-volume 0 -5%
pactl set-sink-mute 0 false ; pactl set-sink-volume 0 +5%
pactl set-sink-mute 0 toggle

Ajout des Touches

Touches
Pour la luminosité cela donne :
XF86MonBrightnessDown
XF86MonBrightnessUp

Et pour le volume :
XF86AudioLowerVolume
XF86AudioRaiseVolume
XF86AudioMute

Ces touches peuvent aussi être retrouvées avec la commande :

xev | sed -n 's/.*keycode *\([0-9]\+\)[^,]*, \([^)]\+\)).*$/keycode \1, keysym \2/p'

Astuces PDF

Récupérer la 1ere page de plusieurs document et les merger dans un seul

for file in Logiciel/*.pdf; do pdftk "$file" cat 1 output "$(basename "${file%.pdf}-page1.pdf")"; done
pdftk *.pdf cat output ../page1.pdf

Extraire 2 pages d’un schéma et l’anonymiser

pdftk Projet_Conf.pdf cat 18-19 output microchip.pdf
pdftk microchip.pdf output uncompressed.pdf uncompress
sed -e "s/NomClient/FauxNom/g" <uncompressed.pdf >modified.pdf
pdftk modified.pdf output final.pdf compress

Supprimer le watermark

La procédure est la même qur pour anonymiser un document :
Décompresser le fichier pdf :
pdftk original.pdf output uncompressed.pdf uncompress
Supprimer la chaine de caractere :
sed -e "s/watermarktextstring/ /" uncompressed.pdf > unwatermarked.pdf
Recompresser le document :
pdftk unwatermarked.pdf output fixed.pdf compress

Astuces VirtualBox

Convertir un disque dur vmdk en vdi

VBoxManage clonehd --format VDI fichier.vmdk fichier.vdi

Modifier la taille d’un disque virtualbox

Pour passer un disque à 40Go :

VBoxManage modifyhd fichier.vdi --resize 40000

Modifier le System UUID

VBoxManage setextradata "test VM" "VBoxInternal/Devices/pcbios/0/Config/DmiSystemUuid" "8fb169be-9288-4fa0-b176-35362568998f"

Modifier l’adresse Mac d’une VM

VBoxManage modifyvm "test VM" --macaddress1 0800271B00E8

Modifier le nom du processeur

Pour avoir par exemple :
« Intel(R) Core(TM) i7-3740QM CPU @ 2.70GHz »
Il suffit de rajouter les champs correspondants :

VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000002/eax 0x20202020
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000002/ebx 0x6e492020
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000002/ecx 0x286c6574
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000002/edx 0x43202952
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000003/eax 0x2865726f
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x20294d54
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000003/ecx 0x332d3769
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000003/edx 0x51303437
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000004/eax 0x5043204d
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000004/ebx 0x20402055
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000004/ecx 0x30372e32
VBoxManage setextradata "test VM" VBoxInternal/CPUM/HostCPUID/80000004/edx 0x007a4847

Il est possible de récupérer ces lignes avec cpuid sous linux de la façon suivante :

cpuid -r |grep "80000002\|80000003\|80000004"|head -n 3|awk '{print $1 "/eax" $3 "\n" $1 "/ebx" $4 "\n" $1 "/ecx" $5 "\n" $1 "/edx" $6};'|sed 's/eax=/ /'|sed 's/ebx=/ /'|sed 's/ecx=/ /'|sed 's/edx=/ /'|sed '/^0x/!d'|sed 's/^0x/VBoxManage setextradata \"test VM\" VBoxInternal\/CPUM\/HostCPUID\//'

ou avec une ancienne version :

cpuid |grep "80000002\|80000003\|80000004"|awk '{print "0x" $1 "/eax 0x" $2 "\n0x" $1 "/ebx 0x" $3 "\n0x" $1 "/ecx 0x" $4 "\n0x" $1 "/edx 0x" $5};'|sed 's/^0x/VBoxManage setextradata \"test VM\" VBoxInternal\/CPUM\/HostCPUID\//'

Ajouter un vrai disque dur

VBoxManage internalcommands createrawvmdk -filename sdc.vmdk -rawdisk /dev/sdc

Réinstallation d’une rom officielle sur un Sony Xperia avec Flashtool

Introduction

Voici la procédure à suivre pour flasher un Xperia E3 avec rom opérateur SFR vers la version stock « Customised FR »(version officielle Sony française), le tout sous linux avec le logiciel flashtool et avec le bootloader d’origine !
Le logiciel flashtool permet le téléchargement et le flashage de rom officielles Sony, il télécharge la dernière version disponible sur les serveurs officiels.

Installation et configuration

Il faut télécharger flashtool
Puis le décompresser et lors du premier lancement couper le contenu du répertoire firmwares et le copier dans ~/.flashTool/firmwares

Téléchargement du firmware

Attention le téléchargement peut prendre entre 10 et 30 minutes en fonction de la connexion.
Cliquer dans le menu Devices->Check Updates
puis double cliquer sur « D22XX Sony Xperia E3 »,
cliquer sur D2203,
double cliquer sur « 1287-0508 Customized FR » pour afficher la dernière version disponible et de nouveau double cliquer sur « 1287-0508 Customized FR ».
Le firmware se télécharge, une barre de progression indique l’avancement du téléchargement.
Sélectionner tous les fichiers et les passer à droite dans « Firmware Content » puis cliquer sur Create et patienter le temps que la barre de progression finisse et d’avoir le message « Bundle creation finished »
Fermer la fenêtre de sélection du firmware.

Flashage

Cliquer sur l’icône éclair et sélectionner « flashmode » puis Ok.
Sélectionner le firmware et cliquer sur le bouton flash.
Passer le téléphone en mode flashmode :
Téléphone éteint, maintenir la touche vol – et brancher le câble USB sur l’ordinateur.
Patienter le temps du flashage(plusieurs minutes).
Une fois terminé, débrancher le téléphone, l’allumer et patienter quelques minutes.

Utilisation d’OpenOCD pour programmer une clé RZUSBstick avec l’interface Bus Pirate

Introduction

Le but de la programmation de la clé RZUSBstick est d’utiliser le firmware killerbee pour pouvoir sniffer un réseau ZigBee avec wireshark.
Et cela avec au choix l’interface Bus Pirate ou une interface ftdi Amontec JTAGkey.

Installation d’OpenOCD

Il faut installer la version 0.9.0 ou supérieure d’OpenOCD contenant le support pour l’Atmel AT90USB128.

Compilation pour mes 2 interfaces :

cd openocd-code
./configure --prefix=/opt/openocd-code --enable-ftdi --enable-buspirate
make
sudo make install

Pins du JTAG sur la clé usb

Voici l’emplacement du connecteur JTAG sur la clé (Pin 1 en rouge)
Emplacement JTAG
Et voici l’emplacement des pins sur ce connecteur
Schema JTAG

Configuration pour l’interface Bus Pirate

Dans cet exemple mon interface utilise le firmware 6.1.
Pour l’interface Bus Pirate je me suis fait le fichier openocd_bp.cfg suivant :

# for avr
    set  _CHIPNAME avr
    set  _ENDIAN little
# jtag speed
#
# Buspirate with OpenOCD support
#
# http://dangerousprototypes.com/bus-pirate-manual/
#

interface buspirate

# you need to specify port on which BP lives
buspirate_port /dev/ttyUSB0

# communication speed setting
buspirate_speed fast; #normal ;# or fast

# voltage regulator Enabled = 1 Disabled = 0
#buspirate_vreg 0

# pin mode normal or open-drain
#buspirate_mode normal

# pullup state Enabled = 1 Disabled = 0
#buspirate_pullup 0

# this depends on the cable, you are safe with this option
reset_config srst_only

#adapter_khz 4500
reset_config  srst_only
adapter_nsrst_delay 100
#jtag scan chain
if { [info exists CPUTAPID ] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4978203F
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
set _TARGETNAME [format "s.cpu" $_CHIPNAME]
target create $_TARGETNAME avr -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x20000000  -work-area-size 16384 -work-area-backup 0
flash bank avr1.flash avr 0 0 0 0 $_TARGETNAME

#avr_program.cfg:
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666
init
reset init
verify_ircapture disable
halt
wait_halt
poll
#avr mass_erase 0
flash probe 0
flash write_image erase /home/esver/Perso/Zigbee/killerbee-read-only/killerbee/firmware/kb-rzusbstick-001.hex 
reset run
shutdown

J’ai connecté le jtag de ma clé en suivant les connexion suivantes :
Jtag Bus Pirate
Les pins sont donc reliées comme ceci :
Clé <=> Bus Pirate
GND <=> GND
TCK <=> CLK
TDO <=> MISO
TMS <=> CS
TDI <=> MOSI
SRST<=> AUX

J’ai ensuite lancé la commande pour programmer mon composant :

/opt/openocd-code/bin/openocd -f openocd_bp.cfg

Et voilà une clé programmée !

Configuration pour l’interface ftdi Amontec JTAGkey2 (plus rapide que la Bus Pirate)

Pour l’interface ftdi je me suis fait le fichier openocd_ftdi.cfg suivant :

# for avr
    set  _CHIPNAME avr
    set  _ENDIAN little
# jtag speed
interface ftdi
ftdi_device_desc "Amontec JTAGkey-2"
ftdi_vid_pid 0x0403 0xcff8

ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800

adapter_khz 4500
reset_config  srst_only
adapter_nsrst_delay 100
#jtag scan chain
if { [info exists CPUTAPID ] } {
    set _CPUTAPID $CPUTAPID
} else {
    set _CPUTAPID 0x4978203F
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
set _TARGETNAME [format "s.cpu" $_CHIPNAME]
target create $_TARGETNAME avr -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x20000000  -work-area-size 16384 -work-area-backup 0
flash bank avr1.flash avr 0 0 0 0 $_TARGETNAME

#avr_program.cfg:
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666
init
reset init
verify_ircapture disable
halt
wait_halt
poll
#avr mass_erase 0
flash probe 0
flash write_image erase /home/esver/Perso/Zigbee/killerbee-read-only/killerbee/firmware/kb-rzusbstick-001.hex 
reset run
shutdown

Le pinout de l’interface est disponible ici.
Les pins sont donc reliées comme ceci :
Clé <=> JTAG
VTref<=> VREF(1)
GND <=> GND(20)
TCK <=> TCK
TDO <=> TDO
TMS <=> TMS
TDI <=> TDI
SRST<=> SRST_N

J’ai ensuite lancé la commande pour programmer mon composant :

/opt/openocd-code/bin/openocd -f openocd_ftdi.cfg

Et voilà une clé programmée !

Astuces programmation C

Cet article a pour but de répertorier quelques astuces que j’utilise lors de développements en C.

Ignorer les warnings sur certaines variables de debug

int __attribute__ ((unused)) variable;

Executer du code à une adresse mémoire

Utile pour exécuter un bootloader par exemple, (0x1FFFB004 est l’adresse de destination du saut)

void jump(void)
{
  void (*SysMemBootJump)(void) = (void (*)(void)) (*((uint32_t *) 0x1FFFB004));
  SysMemBootJump();
}

Fonction de débug en couleur basée sur printf

Voir article

Rétroingénierie sur un firmware

Introduction

Par simple curiosité, je voulais comprendre le fonctionnement de mon NAS Thecus N2310, et faire un peu de reverse engineering pour, pourquoi pas, mettre un jour un firmware alternatif.

Pour cela je suis partit du zip de mise à jour de la nand, mais j’aurai tout aussi bien pu dumper la nand avec les mtdtools.

Commençons les recherches sur le firmware

Récupérations des infos sur les partitions de la nand :
strings N2310_OS6.build_770.t2.bin > strings.txt
Recherche dans le fichier strings.txt de tailles de partitions.
Quelques données intéressantes :

partition@0,0
bNAND 256MiB 1,8V 08-bit
partition@0,1
bfirmware
partition@0c0000
benvironment
partition@100000
bkernel
partition@600000
bdevice-tree
partition@700000
bversion
partition@720000
bvalid
partition@820000
bramdisk
partition@1C00000
bos6disk

Pour plus d’information, il faut extraire la partition device tree qui semble être entre 0x600000 et 0x700000, donc utilisation de la commande :
dd if=N2310_OS6.build_770.t2.bin of=device-tree bs=1 skip=$((0x600000)) count=$((0x100000))

Extrations des données du device-tree

dtc -I dtb ./device-tree > dts
Ouverture avec un éditeur de texte du fichier dts, nous avons donc, entre autre, toutes les données de partitions :

				nand {
					#address-cells = <0x1>;
					#size-cells = <0x1>;

					partition@0,0 {
						label = "NAND 256MiB 1,8V 08-bit";
						reg = <0x0 0x10000000>;
					};

					partition@0,1 {
						label = "firmware";
						reg = <0x0 0xc0000>;
					};

					partition@0c0000 {
						label = "environment";
						reg = <0xc0000 0x40000>;
					};

					partition@100000 {
						label = "kernel";
						reg = <0x100000 0x500000>;
					};

					partition@600000 {
						label = "device-tree";
						reg = <0x600000 0x100000>;
					};

					partition@700000 {
						label = "version";
						reg = <0x700000 0x20000>;
					};

					partition@720000 {
						label = "valid";
						reg = <0x720000 0x100000>;
					};

					partition@820000 {
						label = "ramdisk";
						reg = <0x820000 0x27e0000>;
					};

					partition@1C00000 {
						label = "os6disk";
						reg = <0x3000000 0xd000000>;
					};
				};

Il est maintenant possible d’extraires les différentes partitions avec dd donc petit script :

#!/bin/sh
dd if=N2310_OS6.build_743.t2.bin of=firmware bs=1 skip=$((0x0)) count=$((0xc0000))
dd if=N2310_OS6.build_743.t2.bin of=environment bs=1 skip=$((0xc0000)) count=$((0x40000))
dd if=N2310_OS6.build_743.t2.bin of=kernel bs=1 skip=$((0x100000)) count=$((0x500000))
dd if=N2310_OS6.build_743.t2.bin of=device-tree bs=1 skip=$((0x600000)) count=$((0x100000))
dd if=N2310_OS6.build_743.t2.bin of=version bs=1 skip=$((0x700000)) count=$((0x20000))
dd if=N2310_OS6.build_743.t2.bin of=valid bs=1 skip=$((0x720000)) count=$((0x100000))
dd if=N2310_OS6.build_743.t2.bin of=ramdisk bs=1 skip=$((0x820000)) count=$((0x27e0000))
dd if=N2310_OS6.build_743.t2.bin of=os6disk bs=1 skip=$((0x3000000)) count=$((0xd000000))

L’outil file peut donner quelques informations sur les partitions :
file ramdisk
ramdisk: u-boot legacy uImage, InitRamFS 2.3.0-2.t2.ppc, Linux/PowerPC, RAMDisk Image (gzip), 15014381 bytes, Wed Jun 11 14:38:12 2014, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0x7A5957CD, Data CRC: 0x67486288

C’est donc bien une partition InitRamFS.

file os6disk
os6disk: HIT archive data

En l’ouvrant avec ghex, il est possible de voir que les 3 premiers octets donne les caractères UBI, c’est donc une partition ubifs

Exploration de la partition InitRamFS

Il faut extraire le fichier gzip du ramdisk, pour cela il faut rechercher 00 00 1F 8B, avec une utilisation de ghex, on extrait tout ce qui est après 1F 8B inclu, donc 0x40 soit 64 :
dd if=ramdisk of=ramdisk.gz ibs=1 skip=64
Une petite vérification du fichier ramdisk.gz avec la commande file :
file ramdisk.gz
donne :
ramdisk.gz: gzip compressed data, from Unix, last modified: Tue Apr 15 18:24:42

Puis on extrait le ramdisk :
gunzip ramdisk.gz

On obtient un fichier cpio :
file ramdisk
qui renvoit :
ramdisk: ASCII cpio archive (SVR4 with no CRC)

On extrait le tout :
cpio -i -d -H newc -F ramdisk --no-absolute-filenames

Et voilà, un beau filesystem à explorer.

Exploration de la partition ubifs

Pour cela il faut simuler une nand, y copier la partition et monter le tout
sudo modprobe mtd
sudo modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15
sudo modprobe ubi
sudo dd if=os6disk of=/dev/mtd0 bs=2048
sudo ubiattach -m 0
sudo mount -t ubifs /dev/ubi0_0 partition/

La partition est maintenant montée sur le répertoire partition, il est possible d’en extraire les fichiers.