Permet d'attacher PINCE à un processus Wine/Proton (ex. SOTTR.exe), ce qui échoue avec un setup distrobox standard à cause de l'isolation user namespace de rootless podman.
Le distrobox classique tourne en rootless podman → user namespace isolé → même avec CAP_SYS_PTRACE, le kernel refuse le ptrace sur les processus du host (« Operation not permitted »).
Seule solution propre : un distrobox rootful, qui place le container dans le namespace racine du host. Les capabilities sont alors réellement effectives.
- Container : tout l'environnement PINCE (Fedora + deps + code PINCE lui-même dans
/opt/PINCE) - Host : aucune installation. Le
$HOMEreste propre — il sera juste monté en lecture/écriture dans le container par distrobox pour que PINCE puisse stocker ses configs dans~/.config/PINCE.
→ Pour réinstaller à neuf : distrobox rm du container, et on recommence. Aucune pollution sur le host.
# ptrace_scope doit être à 0 pour le ptrace same-UID
cat /proc/sys/kernel/yama/ptrace_scope
# Si != 0 :
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
# SELinux (à savoir, pas forcément à changer)
getenforceRendre ptrace_scope=0 persistant :
sudo tee /etc/sysctl.d/10-ptrace.conf <<< "kernel.yama.ptrace_scope = 0"
sudo sysctl --system# ⚠️ PAS de sudo devant — distrobox refuse, le flag --root gère l'élévation
distrobox create --root \
--name pince \
--image registry.fedoraproject.org/fedora-toolbox:latest \
--additional-flags "--cap-add=SYS_PTRACE --security-opt seccomp=unconfined" \
--yesDistrobox demandera le mot de passe sudo en interne pour utiliser podman en mode root.
Flags clés :
--root→ podman rootful, container dans le namespace racine du host--cap-add=SYS_PTRACE→ permet à GDB / PINCE d'attacher--security-opt seccomp=unconfined→ désactive le filtre seccomp par défaut qui peut bloquer certains syscalls (process_vm_readv, etc.)--image fedora-toolbox:latest→ image officielle Fedora optimisée pour les containers de dev (peut être omis, c'est la valeur par défaut)
# ⚠️ Toujours sans sudo, le --root suffit
distrobox enter --root pinceVous êtes maintenant dans le container. Le prompt change.
# Deps système (gdb + libs natives Qt6 pour PyQt6 + outils pour install.sh)
sudo dnf install -y python3-pip python3-devel python3-virtualenv gdb gcc git \
qt6-qtbase-gui curl tar
# Préparer /opt/PINCE avec la bonne ownership AVANT le clone
# (install.sh refuse de tourner en root, donc le dossier doit appartenir à l'user)
sudo mkdir -p /opt/PINCE
sudo chown -R $USER:$USER /opt/PINCE
# Clone SANS sudo
git clone https://github.com/korcankaraokcu/PINCE.git /opt/PINCE
cd /opt/PINCE
# Lancer le script d'install officiel SANS sudo
# Il s'occupe de tout : venv + pip install requirements + git submodule libmemscan
# + download Zig 0.16.0 + compile libmemscan + compile traductions Qt
./install.shÀ la fin, vous aurez :
/opt/PINCE/.venv/→ venv Python avec PyQt6, capstone, keystone-engine, etc./opt/PINCE/libpince/libmemscan/memscan.so→ module C++ compilé/opt/PINCE/i18n/qm/*.qm→ fichiers de traduction compilés
Pourquoi /opt/PINCE et pas ~/PINCE : distrobox monte votre $HOME host dans le container, donc ~/PINCE polluerait le host. /opt est purement container-local. On utilise chown pour donner la propriété à l'user puisque install.sh refuse de tourner en root.
Pourquoi install.sh et pas un pip manuel : PINCE intègre libmemscan, un module C++ pour les scans mémoire performants. C'est un git submodule compilé avec Zig (pas gcc/make). Le script crée un venv Python, installe les requirements dedans, télécharge Zig 0.16.0 dans libmemscan/, build le module natif, et compile les traductions Qt. Sans cette étape : ModuleNotFoundError: No module named 'libpince.libmemscan'.
Pourquoi un venv et pas le Python système : install.sh isole PINCE dans .venv — propre, reproductible, pas de conflit avec d'autres outils Python du container. Conséquence : il faut lancer PINCE avec .venv/bin/python, pas avec python3 directement.
Le test qui ne ment pas : si gdb n'arrive pas à s'attacher, PINCE non plus.
Lancez votre jeu (Steam / Proton). Puis dans le container :
PID=$(pgrep -f SOTTR.exe) # adapter au nom du process cible
echo "PID = $PID"
sudo gdb -p $PIDSortie attendue :
Attaching to process 24729
[New LWP 24730]
...
(gdb)
Sortie qui veut dire que ça ne marche pas :
ptrace: Operation not permitted.
(gdb)
Si ça marche → detach puis quit pour libérer le process. Sinon, voir la section Dépannage.
PINCE doit tourner avec le Python du venv créé par install.sh, et sudo reste nécessaire pour les privilèges ptrace.
Ne pas utiliser
sh PINCE.sh: ce wrapper utilisepkexecpour l'élévation GUI via polkit/D-Bus, ce qui n'est pas dispo dans un container distrobox (erreurError getting authority). On utilisesudoà la place.
cd /opt/PINCE
sudo .venv/bin/python PINCE.pydistrobox enter --root pince -- bash -c "cd /opt/PINCE && sudo .venv/bin/python PINCE.py"Dans ~/.bashrc ou ~/.bash_aliases :
alias pince='distrobox enter --root pince -- bash -c "cd /opt/PINCE && sudo .venv/bin/python PINCE.py"'Créer ~/.local/share/applications/pince.desktop :
[Desktop Entry]
Name=PINCE
Comment=Memory scanner / debugger (rootful distrobox)
Exec=distrobox enter --root pince -- bash -c "cd /opt/PINCE && sudo .venv/bin/python PINCE.py"
Terminal=true
Type=Application
Categories=Development;Debugger;Puis :
chmod +x ~/.local/share/applications/pince.desktop
update-desktop-database ~/.local/share/applicationsIcône (à exécuter dans le container, une fois) :
mkdir -p ~/.local/share/icons/
cp /opt/PINCE/media/logo/ozgurozbek/pince_appimage.png ~/.local/share/icons/pince.pngLe ~/.local/share/icons/ étant sur le host via le mount du $HOME, le fichier y apparaît immédiatement. Pointer le .desktop dessus avec un chemin absolu :
Icon=/home/sub/.local/share/icons/pince.pngNote Bazzite : sur une Fedora atomic,
/homeest un symlink vers/var/home. Le path/home/sub/...fonctionne donc partout, pas besoin d'utiliser/var/home/sub/....
| Vérification | Commande | Attendu |
|---|---|---|
| Container bien rootful ? | distrobox ls --root |
Doit lister pince |
| Cap effectivement présente ? | Dans le container : sudo grep CapBnd /proc/self/status puis capsh --decode=<hex> |
Doit contenir cap_sys_ptrace |
| SELinux qui bloque ? | getenforce côté host |
Essayer sudo setenforce 0 |
| ptrace_scope OK ? | cat /proc/sys/kernel/yama/ptrace_scope |
Doit être 0 |
| Bon PID ? | pgrep -af <nom_process> |
Le jeu peut avoir plusieurs sous-processus |
Vous lancez probablement avec python3 au lieu du Python du venv créé par install.sh. Bonne commande :
cd /opt/PINCE
sudo .venv/bin/python PINCE.pySi le venv n'existe pas (ls .venv/bin/python échoue) → relancer ./install.sh (sans sudo).
Les libs natives Qt6 manquent dans l'image fedora-toolbox minimale. PyQt6-pip embarque ses propres binaires Qt mais a besoin de libs système OpenGL/X11. Fix :
sudo dnf install -y qt6-qtbase-guiCette commande tire en cascade toutes les deps nécessaires (mesa, xcb-*, fontconfig, dbus, etc.). Variante manuelle si vous voulez le strict minimum :
sudo dnf install -y mesa-libGL libxkbcommon-x11 dbus-libs fontconfig \
xcb-util-cursor xcb-util-keysyms xcb-util-image xcb-util-renderutil xcb-util-wmPINCE.sh utilise pkexec (élévation GUI via polkit/D-Bus), pas dispo dans un container distrobox. Ne pas l'utiliser. Lancer via :
sudo .venv/bin/python PINCE.pylibmemscan (scan mémoire C++ via Zig) n'a pas été compilé. install.sh n'a pas été lancé ou a échoué avant l'étape de build. Relancer (sans sudo) :
cd /opt/PINCE
./install.shEn cas d'échec du download Zig (curl 404, etc.), vérifier la version Zig pinnée dans install.sh et adapter si la 0.16.0 n'est plus dispo.
Le dossier /opt/PINCE appartient à root (clone fait avec sudo par erreur). install.sh refuse de tourner en root et ne peut pas écrire dans le dossier. Fix :
sudo chown -R $USER:$USER /opt/PINCE
cd /opt/PINCE
./install.shinstall.sh doit tourner en user, pas en root. Relancer sans sudo. Si l'ownership de /opt/PINCE est mauvaise, voir le point précédent.
sudo ausearch -m AVC -ts recentSi des AVC liés à ptrace apparaissent, laisser SELinux en Permissive pour les sessions PINCE (sudo setenforce 0).
- Règle distrobox :
--rootetsudosont mutuellement exclusifs. Pour les commandes distrobox (create,enter,stop,rm), ne jamais mettresudodevant quand on utilise--root— distrobox demandera lui-même l'élévation. Le seulsudolégitime dans la chaîne est celui à l'intérieur du container devantpython3 PINCE.py(PINCE vérifie qu'il tourne en root au démarrage). gdb-gefn'existe pas dans les dépôts Fedora — c'est un script tiers, inutile pour PINCE qui embarque ses propres extensions GDB dansgdb_python_scripts/.- PyQt5 n'est plus packagé sur Fedora 44+ → PINCE moderne (≥ 2025) utilise PyQt6.
- Module
keyboardnécessite root pour accéder à/dev/input/*→ OK puisque PINCE tourne déjà en sudo. - Configs PINCE stockées dans
~/.config/PINCE(host, via le mount distrobox du$HOME) → survivent à undistrobox rm. - Code PINCE dans
/opt/PINCE(container-only) → disparaît si vous détruisez le container. À re-cloner lors d'une recréation.
distrobox stop pince --root --yes
distrobox rm pince --root --yes
# Si vous voulez aussi virer les configs PINCE :
rm -rf ~/.config/PINCE| Couche | Action |
|---|---|
| Host kernel | ptrace_scope = 0 (persistant via /etc/sysctl.d/) |
| Container | distrobox rootful (--root) + --cap-add=SYS_PTRACE + seccomp=unconfined |
| Code & deps | Clone dans /opt/PINCE (chown user) puis ./install.sh (sans sudo) gère tout : venv, pip, libmemscan C++ via Zig, traductions Qt |
| Lancement | distrobox enter --root pince ... (pas de sudo devant), puis sudo .venv/bin/python PINCE.py dans le container |
→ La clé : pour qu'un container puisse ptrace un processus du host, il faut être dans le même user namespace que le host → distrobox rootful obligatoire.