Skip to content

Repository files navigation

📱 Basic-Fit QR Code : Analyse Technique Complète

🔍 Introduction

Utilisation

Note : Cette analyse est basée sur l'ingénierie inverse de l'application mobile et reste à des fins éducatives uniquement.

🙏 Crédits et Remerciements

Cette analyse technique est basée sur le travail initial de @szerookii.

La découverte du fonctionnement des QR codes Basic-Fit et une grande partie du travail de reverse engineering ont été réalisés par szerookii, qui a créé :

Objectif de cette documentation : J'ai décidé de refaire l'analyse complète pour le challenge personnel, en m'appuyant sur les découvertes de szerookii et en approfondissant certains aspects techniques.

📊 Structure du QR Code

Script JavaScript pour générer un QR code Basic-Fit.

Format

Comment fonctionne un QR code ? "Un QR code est un code à barres en deux dimensions qui peut stocker des informations. Lorsqu'il est scanné par un appareil compatible, il déchiffre les données encodées."

En scannant un QR code de Basic-Fit, vous obtiendrez une chaîne de caractères structurée comme suit :

GM2:CARD_NUMBER:GUID:TIMESTAMP:HASH

Exemple réel

GM2:V001234567:ABC:1791792657:E8F87B

Décomposition

  • GM2 : Fait référence à un format ou une spécification définie par General Motors QR Code 🤓
  • V001234567 : Numéro de carte membre (identifiant unique)
  • ABC : GUID aléatoire (3 caractères alphanumériques)
  • 1791792657 : Timestamp Unix (en secondes)
  • E8F87B : Hash SHA256 (8 derniers caractères en majuscules)

Algorithme de génération du hash

Fonctionnement

  1. Concaténation des données : cardNumber + guid + timestamp + deviceId
  2. Hashage SHA-256 : Utilisation de l'algorithme SHA
  3. Extraction des 8 derniers caractères : Convertis en majuscules

Exemple de génération

import { createHash } from "crypto";

function generateHash(cardNumber, guid, timestamp, deviceId) {
	const dataToHash = cardNumber + guid + timestamp + deviceId;
	const hash = createHash("sha256").update(dataToHash).digest("hex");
	return hash.slice(-8).toUpperCase();
}

const result = generateHash(
	"1234567890",
	"abc-123-def",
	"1640995200",
	"device123",
);
console.log(result);

� Génération du QR Code

Processus de génération

La génération d'un QR code Basic-Fit suit un processus technique précis :

  1. Assemblage des données : Concaténation des composants selon le format GM2:CARD_NUMBER:GUID:TIMESTAMP:HASH
  2. Encodage du QR code : Transformation des données en matrice de points noirs/blancs
  3. Optimisation de la qualité : Application des paramètres de correction d'erreur
  4. Rendu visuel : Génération de l'image finale scannable

Paramètres techniques

// Configuration recommandée pour un QR code Basic-Fit
const qrConfig = {
	errorCorrectionLevel: "M", // Medium (15% de correction d'erreur)
	type: "image/png", // Format de sortie
	quality: 0.92, // Qualité de compression
	margin: 1, // Marge autour du QR code
	color: {
		dark: "#000000", // Couleur des modules sombres
		light: "#FFFFFF", // Couleur de fond
	},
	width: 256, // Taille en pixels (256x256 recommandé)
};

Niveaux de correction d'erreur

Les QR codes Basic-Fit utilisent différents niveaux de qualité selon l'usage :

Niveau Correction Usage Basic-Fit Performance
L (Low) ~7% ❌ Non recommandé Scan difficile
M (Medium) ~15% Utilisé par défaut Équilibre optimal
Q (Quartile) ~25% ⚠️ Backup mode Scan robuste
H (High) ~30% ❌ Non nécessaire Surdimensionné

Algorithme de génération complet

📁 Implementation complète : Voir le fichier QRCode-generator.js pour l'exemple pratique.

Utilisation :

# Installation des dépendances
npm install qrcode

# Génération du QR code
node QRCode-generator.js

Résultat :

  • Fichier qr-basic-fit-medium.png généré
  • Aperçu terminal pour validation
  • Logs détaillés du processus

Optimisation pour le scan

Pour garantir une lecture optimale par les scanners Basic-Fit :

🎯 Facteurs de qualité :

  • Minimum : 192x192 pixels (scan difficile)
  • Optimal : 256x256 pixels (scan fiable)
  • Maximum : 512x512 pixels (scan excellent, mais plus lourd)
  • Contraste : Noir pur (#000000) sur blanc pur (#FFFFFF)
  • Déformation : Maintenir les proportions carrées

📠 Device ID

Récupération via l'API Basic-Fit ✅

Le deviceId est obtenu via l'API Basic-Fit après authentification (endpoint fonctionnel) :

{
	"member": {
		"cardnumber": "V004683024",
		"country": "FR",
		"homeClub": "Basic-Fit Villeurbanne Rue Hippolyte Kahn",
		"deviceId": "F081C3F1-BCCF-4088-9F28-C049036E5591"
	}
}

Comment récupérer le deviceId :

# Utiliser le script PowerShell pour tester le compte Basic-Fit
.\basic-fit-account-explorer.ps1 -AccessToken "VOTRE_TOKEN eyJhfFjENwopDCcCI6IkpXVCJ9..."

Endpoints API

Endpoints fonctionnels

📁 Script de test : Voir le fichier basic-fit-account-explorer.ps1 pour tester tous les endpoints.

Les endpoints suivants sont confirmés fonctionnels avec un token OAuth valide :

Endpoint Method URL Description
Health Status GET https://bfa.basic-fit.com/api/health Statut de l'API
Infos membre GET https://bfa.basic-fit.com/api/member/info Informations du compte membre
Paramètres membre GET https://bfa.basic-fit.com/api/member/settings Paramètres du compte
Visites gym GET https://bfa.basic-fit.com/api/member/gym-visits-total Historique des visites
Visites limitées GET https://bfa.basic-fit.com/api/member/gym-visits-total?limit={5,10,20} Dernières X visites

Headers requis

Authorization: Bearer YOUR_ACCESS_TOKEN
User-Agent: Basic-Fit/2436 CFNetwork/1568.300.101 Darwin/24.2.0
Accept: application/json
Content-Type: application/json

Exemples de réponses

📁 Fichiers d'exemple : Voir les fichiers exemple_api-*.json dans le repository pour les structures de réponse complètes.

Utilisation du script PowerShell

# Tester tous les endpoints
.\basic-fit-account-explorer.ps1 -AccessToken "eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6..."

Endpoints non fonctionnels

⚠️ Les endpoints suivants ne sont PAS accessibles publiquement :

  • /api/member/qr-code - Génération QR code
  • /api/member/devices - Gestion des appareils
  • /api/member/cards - Gestion des cartes
  • /api/clubs - Liste des clubs
  • /api/reservations - Réservations

Raison : Ces endpoints nécessitent des permissions spéciales ou ne sont accessibles qu'à l'application mobile officielle.

⚠️ Considérations importantes

Limitations temporelles

  • Validité : Les QR codes ont une durée de vie limitée
  • Timestamp : Vérifié côté serveur pour éviter la réutilisation
  • Fraîcheur : Nouveaux codes générés à chaque utilisation

Sécurité

  • Device binding : Un QR code est lié à un appareil spécifique
  • Account binding : Validé contre l'abonnement actif
  • Cryptographic integrity : Hash empêche la modification

Usage éthique

⚠️ Cette documentation est à des fins éducatives uniquement. Elle ne doit pas être utilisée pour contourner les systèmes de sécurité ou frauder un abonnement Basic-Fit.

Limitation technique importante : Les endpoints API pour générer des QR codes ne sont pas accessibles au public. Seule l'application mobile officielle Basic-Fit peut générer des QR codes fonctionnels.

🔗 Références

📜 Licence

Cette documentation à été rédigée dans un but éducatif et de partage de connaissances. Réalisée par NassCT, avec le travail/l'influence de szerookii.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages