Bien que je sois d'accord avec les autres réponses, je trouve qu'il y a quelques éléments pragmatiques qui sont négligés ici.
Divulgation complète: je travaille pour une entreprise qui développe des logiciels d'obscurcissement / protection pour les applications mobiles.
Une protection complète et incassable n'est pas possible pour une application exécutée sur un appareil contrôlé par un attaquant. Cependant, il existe un logiciel qui vise à élever la barre et rend moins / pas utile pour une personne de mener une attaque.
En général, ces solutions couvrent deux aspects
Statique protection
Cela inclut généralement un tas de techniques d'obscurcissement visant à rendre la tâche difficile pour un attaquant qui veut analyser une application mobile en examinant les binaires à l'aide d'outils comme IDA Pro, Ghidra et Hopper.
Les techniques ici sont l'obscurcissement du flux de contrôle, l'obscurcissement sémantique (classe, méthode, ... noms), l'obscurcissement arithmétique, le chiffrement de chaînes, le chiffrement de classe, ...
Cela en fait très difficile de «jeter un œil» à l'intérieur d'un binaire et de comprendre ce qui se passe, mais n'offre pas beaucoup de protection lorsqu'un attaquant regarde l'application alors qu'elle s'exécute sur l'appareil lui-même.
Protection dynamique
Ces techniques de protection visent à protéger une application contre toute analyse ou modification lorsqu'elle s'exécute sur l'appareil. Les outils populaires ici sont les débogueurs (lldb, gdb, ...) et les frameworks d'accrochage (Frida, Cydia Substrate, ...).
Les techniques ici essaieront de bloquer / détecter l'utilisation de ces outils, de détecter les environnements d'exécution falsifiés (appareil jailbreaké / rooté, émulateurs), les modifications apportées à l'application et bien plus encore.
Conclusion
Bien qu'il soit de la plus haute importance de s'assurer que votre application a été créée en utilisant des pratiques de sécurité bien définies (les logiciels d'obscurcissement / protection ne vous aideront pas ici!), il existe des outils qui peuvent fonctionner comme un ensemble de shells autour de votre application qui, ensemble, rendent beaucoup plus difficile et, espérons-le, inutile, de casser votre application.