Debian: Editar i compilar paquets

Hi ha vegades que pots tenir la necessitat de modificar paquets abans d’instal·lar-los, per exemple podries modificar el codi font d’un repositori de Github.

Fer-ho així està bé, però hi ha vegades que l’aplicació requereix una instal·lació o configuració a nivell de sistema, normalment les que s’instal·len amb make install. Si et poses a modificar el paquet podries arribar a tenir problemes si instal·les paquets que no són coneguts per dpkg.

Si ho fas com t’explico a continuació, podràs compartir els paquets modificats i instal·lar-los a altres ordinadors sense problemes.

Obtenir el codi font

Primer de tot has d’obtenir el codi font de l’aplicació que vols modificar. El paquet de codi font està compost per diversos fitxers: el fitxer principal és el .dsc (Debian Source Control), és un llistat de tots els fitxers que conté el paquet, que poden ser .tar.{gz,bz2,xz}, diff.gz o .debian.tar.{gz,bz2,xz}.

Per descarregar-te el codi font pots utilitzar el navegador però també la terminal. Si tens la linia deb-src al fitxer /etc/apt/sources.list, i després d’executar apt update, pots utilitzar la comanda apt source NOM_PAQUET:

# Obtenir codi font
nadki@debian:~$ apt source libfreefare
Reading package lists... Done
NOTICE: 'libfreefare' packaging is maintained in the 'Git' version control system at:
git://anonscm.debian.org/collab-maint/libnfc.git
Please use:
git clone git://anonscm.debian.org/collab-maint/libnfc.git
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 119 kB of source archives.
Get:1 http://deb.debian.org/debian bullseye/main libfreefare 0.4.0-2.1 (dsc) [2,144 B]
Get:2 http://deb.debian.org/debian bullseye/main libfreefare 0.4.0-2.1 (tar) [113 kB]
Get:3 http://deb.debian.org/debian bullseye/main libfreefare 0.4.0-2.1 (diff) [3,732 B]
Fetched 119 kB in 0s (555 kB/s)         
dpkg-source: info: extracting libfreefare in libfreefare-0.4.0
dpkg-source: info: unpacking libfreefare_0.4.0.orig.tar.gz
dpkg-source: info: unpacking libfreefare_0.4.0-2.1.debian.tar.xz

# Fitxers descarregats
nadki@debian:~$ ls -la libfreefare*
-rw-r--r--  1 nadki nadki   3732 Jan  5  2021 libfreefare_0.4.0-2.1.debian.tar.xz
-rw-r--r--  1 nadki nadki   2144 Jan  5  2021 libfreefare_0.4.0-2.1.dsc
-rw-r--r--  1 nadki nadki 113466 Jan 14  2014 libfreefare_0.4.0.orig.tar.gz

libfreefare-0.4.0:
total 124
drwxr-xr-x 10 nadki nadki  4096 Feb  6 10:48 .
drwxr-xr-x 17 nadki nadki  4096 Feb  6 10:48 ..
-rw-r--r--  1 nadki nadki   164 Dec 24  2013 AUTHORS
-rw-r--r--  1 nadki nadki 25847 Dec 24  2013 ChangeLog
drwxr-xr-x  3 nadki nadki  4096 Dec 24  2013 cmake
-rw-r--r--  1 nadki nadki  1728 Dec 24  2013 CMakeLists.txt
-rw-r--r--  1 nadki nadki  2811 Dec 24  2013 configure.ac
drwxr-xr-x  4 nadki nadki  4096 Dec 24  2013 contrib
-rw-r--r--  1 nadki nadki  9652 Dec 24  2013 COPYING
drwxr-xr-x  3 nadki nadki  4096 Jan  5  2021 debian
drwxr-xr-x  2 nadki nadki  4096 Dec 24  2013 examples
-rw-r--r--  1 nadki nadki   648 Dec 24  2013 .gitignore
-rw-r--r--  1 nadki nadki  4543 Dec 24  2013 HACKING
drwxr-xr-x  2 nadki nadki  4096 Dec 24  2013 libfreefare
-rw-r--r--  1 nadki nadki   296 Dec 24  2013 libfreefare.pc.in
drwxr-xr-x  2 nadki nadki  4096 Dec 24  2013 m4
-rw-r--r--  1 nadki nadki  1446 Dec 24  2013 Makefile.am
-rw-r--r--  1 nadki nadki  3545 Dec 24  2013 NEWS
drwxr-xr-x  2 nadki nadki  4096 Feb  6 10:48 .pc
-rw-r--r--  1 nadki nadki   418 Dec 24  2013 README
drwxr-xr-x  3 nadki nadki  4096 Dec 24  2013 test
-rw-r--r--  1 nadki nadki   752 Dec 24  2013 TODO

Et deus haver adonat que la comanda apt source diu al començament que existeix un repositori Git que té el paquet. Pots obtenir fàcilment el codi de Git amb la comanda git clone URL:

nadki@debian:~$ git clone https://github.com/nfc-tools/libfreefare
Cloning into 'libfreefare'...
remote: Enumerating objects: 3811, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 3811 (delta 0), reused 1 (delta 0), pack-reused 3805
Receiving objects: 100% (3811/3811), 804.99 KiB | 5.75 MiB/s, done.
Resolving deltas: 100% (2896/2896), done.

Instal·lar les dependències

Ara que ja tens el codi font, has d’instal·lar les dependències. Les necessitaràs si vols compilar certs binaris, però també si vols fer alguna prova parcial durant la compilació.

Cada paquet declara les seves dependències al camp Build-Depends del fitxer debian/control.

nadki@debian:~/libfreefare-0.4.0/debian$ cat control 
Source: libfreefare
Section: libs
Priority: extra
Maintainer: Nobuhiro Iwamatsu <iwamatsu@debian.org>
Build-Depends: debhelper (>= 9), dh-autoreconf, libnfc-dev (>= 1.7.0~rc7), pkg-config, libssl-dev
Standards-Version: 3.9.5
Homepage: https://code.google.com/p/libfreefare/
Vcs-Git: git://anonscm.debian.org/collab-maint/libnfc.git
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/libfreefare.git;a=summary

Package: libfreefare0
Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Pre-Depends: ${misc:Pre-Depends}
Multi-Arch: same
Description: MIFARE card manipulations library
 The libfreefare project aims to provide a convenient API for MIFARE
 card manipulations. 
 .
 This package contains the libfreefare library.

[...]

Pots instal·lar les dependències a través de apt amb la comanda apt build-dep ./:

nadki@debian:~/libfreefare-0.4.0$ sudo apt build-dep ./
Note, using directory './' to get the build dependencies
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  dctrl-tools hfsutils isolinux libfile-slurp-perl libyaml-libyaml-perl syslinux-common tofrodos
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  autoconf automake autopoint autotools-dev debhelper dh-autoreconf dh-strip-nondeterminism dwz gettext intltool-debian libdebhelper-perl libfile-stripnondeterminism-perl libnfc-dev
  libnfc6 libsigsegv2 libssl-dev libsub-override-perl libtool libusb-dev m4 po-debconf
0 upgraded, 21 newly installed, 0 to remove and 15 not upgraded.
Need to get 7,549 kB of archives.
After this operation, 24.3 MB of additional disk space will be used.
Do you want to continue? [Y/n]

[...]

Aplicant actualitzacions

Aquí veuràs només una introducció, ja que hi ha molta informació i coses que pots fer. Si t’interessa pots visitar la Guía del nuevo desarrollador de Debian.

El primer que has de fer és modificar la versió del paquet perquè es pugui distingir de les versions ja existents. Pots fer-ho amb dch (Debian CHangelog), del paquet devscripts. La comanda dch –local IDENTIFICADOR/SUFIX invoca un editor de text que et permet documentar tots els canvis que fas als paquets.

nadki@debian:~/libfreefare-0.4.0$ head -n 1 debian/changelog
libfreefare (0.4.0-2.1) unstable; urgency=medium

nadki@debian:~/libfreefare-0.4.0$ dch --local nadki
dch warning: neither DEBEMAIL nor EMAIL environment variable is set
dch warning: building email address from username and FQDN
dch: Did you see those 2 warnings?  Press RETURN to continue...


Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny

Choose 1-2 [1]: 2

nadki@debian:~/libfreefare-0.4.0$ head -n 1 debian/changelog
libfreefare (0.4.0-2.1nadki1) UNRELEASED; urgency=medium

Si vols fer canvis de manera regular, et pot interessar definir les variables d’entorn DEBFULLNAME i DEBMAIL amb el teu nom i email, respectivament. Els seus valors els utilitzen moltes eines de compilació, inclòs dch, que els afegeixen al changelog automàticament.

Imagina ara que has baixat el codi font de pyrit i vols aplicar una actualització que has trobat a un repositori git. Hi ha dues maneres de fer-ho:

Amb el codi font

Primer obtens el codi font de pyrit, et descarregues la versió que t’interessa i apliques l’actualització:

nadki@debian:~$ apt source pyrit

[...]

nadki@debian:~$ cd pyrit-0.4.0/

nadki@debian:~/pyrit-0.4.0$ wget https://github.com/JPaulMora/Pyrit/commit/14ec997174b8e8fd20d22b6a97c57e19633f12a0.patch -O /tmp/pyrit-patch

[...]

nadki@debian:~/pyrit-0.4.0$ patch -p1

A aquest punt has instal·lat correctament l’actualització al teu paquet i ja podries generar el binari. No obstant això, si ho intentes segurament obtindràs l’error unexpected upstream changes, perquè pyrit, i la majoria de paquets, utilitzen el format 3.0 (quilt), on els canvis s’han d’enregistrar a debian/patches/, on debian/patches/series indica l’ordre de les actualitzacions aplicades.

Per aquest motiu, has d’executar la comanda dpkg-source –commit:

nadki@debian:~$ dpkg-source --commit
dpkg-source: info: local changes detected, the modified files are:
 pyrit-0.4.0/cpyrit/pckttools.py
Enter the desired patch name: fix-for-scapy-2.3.patch

dpkg-source: info: local changes have been recorded in a new patch: pyrit-0.4.0/debian/patches/fix-for-scapy-2.3.patch

nadki@debian:~$ tail -n 1 debian/patches/series
fix-for-scapy-2.3.patch

Amb Quilt

L’eina anomenada quilt s’ha popularitzat perquè la majoria de paquets de Debian utilitzen el format 3.0 (quild). Pots trobar més informació aquí: enllaç.

Amb el repositori Git

L’eina més popular és git-buildpackage, s’fa servir per gestionar tots els repositoris. Quan l’utilitzes, les actualitzacions no s’apliquen directament a la branca principal, sinó que es guarden a debian/patches. Pots afegir manualment actualitzacions al directori i llistar-les a debian/patches/series, però els usuaris de bit-buildpackage acostumen a fer servir gbp pq per editar totes les actualitzacions a la vegada i posar-les a una sola branca.

git-dpm és una altra eina que et pot ser útil. Emmagatzema metadata a debian/.git-dpm i manté les actualitzacions aplicades a la branca principal fent merging del contingut de debian/patches.

Generar el binari

Una vegada has modificat tot el que volies, pots generar el binari o fitxer .deb. Tot el procés es gestiona amb dpkg-buildpackage:

$ dpkg-buildpackage -us -uc -b
dpkg-buildpackage: source package libfreefare
dpkg-buildpackage: source version 0.4.0-2buxy1
dpkg-buildpackage: source distribution UNRELEASED
dpkg-buildpackage: source changed by Raphael Hertzog
dpkg-buildpackage: host architecture amd64
[...]
   dh_builddeb
dpkg-deb: building package 'libfreefare0-dbgsym' in '../libfreefare0-dbgsym_0.4.0-2buxy1_amd64.deb'.
dpkg-deb: building package 'libfreefare0' in '../libfreefare0_0.4.0-2buxy1_amd64.deb'.
dpkg-deb: building package 'libfreefare-dev' in '../libfreefare-dev_0.4.0-2buxy1_amd64.deb'.
dpkg-deb: building package 'libfreefare-bin-dbgsym' in '../libfreefare-bin-dbgsym_0.4.0-2buxy1_amd64.deb'.
dpkg-deb: building package 'libfreefare-bin' in '../libfreefare-bin_0.4.0-2buxy1_amd64.deb'.
dpkg-deb: building package 'libfreefare-doc' in '../libfreefare-doc_0.4.0-2buxy1_all.deb'.
 dpkg-genchanges -b >../libfreefare_0.4.0-2buxy1_amd64.changes
dpkg-genchanges: binary-only upload (no source code included)
 dpkg-source --after-build libfreefare-0.4.0
dpkg-buildpackage: binary-only upload (no source included)

Els atributs -us -uc deshabiliten les signatures d’alguns fitxers creats, com .dsc o .changes, perquè l’operació fallarà si no tens una clau GnuPG associada amb l’identitat que has ficat al changelog. L’atribut -b és per binary-only-build, en aquest cas el paquet de codi font .dsc no es crearà, només el .deb. Utilitza aquesta opció per evitar errors durant el compilat.

Ara ja pots instal·lar el paquet .deb de la manera habitual, amb dpkg -i o apt install.

Exemple: construir un paquet de Kali

Primer de tot, has d’instal·lar el paquet devscripts:

nadki@debian:~$ sudo apt-get install devscripts

Després, descarrega’t el codi font (les versions poden variar):

# Instal·la tots els paquets kali-linux-*
nadki@debian:~$ sudo apt source kali-meta

nadki@debian:~$ cd kali-meta-2020.3.2/

nadki@debian:~/kali-meta-2020.3.2/$ nano debian/control

Modifica el fitxer control perquè inclogui el teu paquet:

Package: kali-linux-custom
Architecture: any
Depends: ${misc:Depends},
 kali-linux,
 aircrack-ng,
 nmap,
 sqlmap,
Description: Kali Linux Custom tools for custom use
 This is Kali Linux, the most advanced penetration testing and security
 auditing distribution.
 .
 This metapackage depends on few of our favorites.

Modifica la versió del paquet perquè es pugui distingir dels originals:

nadki@debian:~/kali-meta-2020.3.2/$ head -1 debian/changelog

nadki@debian:~/kali-meta-2020.3.2/$ dch --local custom -m "Nou canvi"

nadki@debian:~/kali-meta-2020.3.2/$ head -1 debian/changelog

Finalment, compila el paquet:

nadki@debian:~/kali-meta-2020.3.2/$ dpkg-buildpackage -us -uc -b

nadki@debian:~/kali-meta-2020.3.2/$ ls -l ../*custom*
-rw-r--r-- 1 kali kali 13604 Jun 22 16:47 ../kali-desktop-core_2020.3.2custom1_amd64.deb
-rw-r--r-- 1 kali kali 13440 Jun 22 16:47 ../kali-desktop-e17_2020.3.2custom1_all.deb
-rw-r--r-- 1 kali kali 13640 Jun 22 16:47 ../kali-desktop-gnome_2020.3.2custom1_all.deb
-rw-r--r-- 1 kali kali 13424 Jun 22 16:47 ../kali-desktop-i3_2020.3.2custom1_all.deb
-rw-r--r-- 1 kali kali 13440 Jun 22 16:47 ../kali-desktop-i3-gaps_2020.3.2custom1_all.deb
-rw-r--r-- 1 kali kali 13492 Jun 22 16:47 ../kali-desktop-kde_2020.3.2custom1_all.deb
-rw-r--r-- 1 kali kali 13564 Jun 22 16:47 ../kali-desktop-live_2020.3.2custom1_all.deb

[...]

nadki@debian:~/kali-meta-2020.3.2/$ ls -l ../kali-linux-custom_2020.3.2custom1_amd64.deb
-rw-r--r-- 1 kali kali 13456 Jun 22 16:47 ../kali-linux-custom_2020.3.2custom1_amd64.deb

Exemple: actualitzar un paquet de Kali

Per aquest exercici, actualitzaré el paquet SET de Kali.

Primer, obté el codi font:

nadki@debian:~$ sudo apt source set

Descarrega’t l’última versió del paquet:

nadki@debian:~$ wget https://github.com/trustedsec/social-engineer-toolkit/archive/master.tar.gz -O set_7.7.1.orig.tar.gz

nadki@debian:~$ tar xvf set_7.7.1.orig.tar.gz

nadki@debian:~$ mv social-engineer-toolkit-master social-engineer-toolkit-7.7.1

Copia tots els fitxers específics de Debian:

nadki@debian:~$ cp -a set-7.7/debian social-engineer-toolkit-7.7.1/debian

nadki@debian:~$ rm -rf social-engineer-toolkit-7.7.1/.git

Actualitza la versió:

nadki@debian:~/social-engineer-toolkit-7.7.1/$ cd social-engineer-toolkit-7.7.1

nadki@debian:~/social-engineer-toolkit-7.7.1/$ head -1 debian/changelog

nadki@debian:~/social-engineer-toolkit-7.7.1/$ dch -v 7.7.1-0custom1 "Nova actualització"

nadki@debian:~/social-engineer-toolkit-7.7.1/$ head -1 debian/changelog

Compila la versió i assegura que tot funciona:

nadki@debian:~/social-engineer-toolkit-7.7.1/$ dpkg-buildpackage -us -uc -b

nadki@debian:~/social-engineer-toolkit-7.7.1/$ ls -l ../*custom*

nadki@debian:~/social-engineer-toolkit-7.7.1/$ sudo dpkg -i ../set_7.7.1-0custom1_all.deb

Deixa un comentari