web-dev-qa-db-fra.com

Est-il vraiment impossible de protéger les applications Android du reverse engineering?

Comme nous le savons, les applications Android sont écrites en Java. En Java, peu importe ce que vous faites , il est impossible de protéger le code compilé de la décompilation ou du reverse engineering, comme la question Stack Overflow Comment verrouiller les classes Java compilées pour éviter la décompilation? suggère.

Comment pourrait-on protéger une application contenant des secrets commerciaux algorithmiques contre l'ingénierie inverse?

Par "comment", j'entends non seulement les techniques logicielles, mais également d'autres approches creative.

57
Android Eve

La première étape pour moi serait d’optimiser et d’obscurcir le code avec ProGuard , qui est connu pour fonctionner avec du code octet destiné à Android Dalvik VM (via Dex). C'est un outil vraiment formidable qui peut augmenter la difficulté "d'inverser" votre code tout en réduisant l'empreinte de votre code (dans certains cas, de façon spectaculaire: une de mes applets récente est passée d'environ 600 Ko à environ 50 Ko).

Comme le disent d’autres, vous n’obtiendrez jamais une sécurité de 100% des détails de votre algorithme lorsque son implémentation est distribuée aux clients. Pour cela, vous devez garder le code sur vos serveurs uniquement. Les tentatives visant à sécuriser le code client à près de 100% représentent en réalité DRM et peuvent rendre votre code client fragile face aux pannes de réseau et simplement frustrer les utilisateurs (légitimes).

Le blog des développeurs Android contient des applications tilesarticles sur le thème "inviolables" Android (et ils en recommandent l'utilisation de ProGuard dans le cadre de l’approche globale).

En ce qui concerne les approches "créatives": certains développeurs utilisent techniques de détection du débogueur pour empêcher l’analyse au moment de l’exécution et le combiner avec le cryptage de parties de code binaire (pour décourager l’analyse statique), mais, pour être honnête, suffisamment attaquant déterminé peut contourner ceux-ci, alors qu'il peut causer une frustration légitime de l'utilisateur, comme illustré par l'article de la base de connaissances Windows Jeux: Message d'erreur: un débogueur a été Détecté: déchargez le débogueur et réessayez. Le logiciel de DVD 'Apprendre à conduire' de ma petite amie ne fonctionnera pas sous VirtualBox pour cette raison, mais elle blâme bien sûr Linux!

OpenRCE et L'article de Wikipedia sur le code obscurci peut constituer un bon point de départ si vous souhaitez approfondir la question. Mais soyez averti, vous risquez de perdre davantage en raison d'une utilisation plus zélée de ces techniques que de la frustration de vos utilisateurs, plutôt que de la perte de secrets commerciaux par ingénierie inverse. Comme Anton S dit , peut-être que l'approche la plus "créative" consiste à peaufiner le modèle économique plutôt que la technologie.

La dernière Android Mise à jour du SDK du 6 décembre 2010 (coïncidant avec Android 2.3 version de Gingerbread):

Prise en charge intégrée de ProGuard: ProGuard est maintenant fourni avec les outils du SDK. Les développeurs peuvent désormais masquer leur code en tant que partie intégrante d'une version de version.

72
willjcroz

Si c'est une possibilité: appel de procédure distante vers un serveur bien protégé (le serveur a le code que vous voulez protéger).

14
jcomeau_ictx

Rendez-vous si peu coûteux et ne construisez pas votre modèle commercial au-dessus des secrets exécutés côté client. En d'autres termes, ne partagez pas vos secrets.

7
Anton S

Il est impossible de protéger un code côté client du reverse engineering. Vous pouvez simplement utiliser des moyens plus ou moins efficaces pour obscurcir votre code. Et l’assembleur x86 optimisé se révèle être un assez bon obscurcissement.

Donc, si vous avez des secrets algorithmiques, mettez-les du côté serveur.

5
CodesInChaos

Comment verrouiller les classes Java compilées pour empêcher la décompilation

Tu ne peux pas. Tout stratagème peut être vaincu par une personne disposant de suffisamment de compétences, de temps et de motivation.

(Incidemment, cela s'applique également aux logiciels compilés en binaire. La seule différence réside dans la quantité d'effort nécessaire à la décompilation.)

Ma question est la suivante: comment protéger une application contenant des secrets commerciaux algorithmiques contre l'ingénierie inverse?

N'installez tout simplement pas l'application sur le téléphone de l'utilisateur. Ou (plus utilement), exécutez le code contenant les secrets commerciaux sur un serveur distant (correctement sécurisé).

3
Stephen C

Vous ne pouvez pas protéger complètement votre application, car il y aura toujours quelqu'un qui la craquera ...

Cependant, vous pourriez les empêcher de le faire en rendant votre application gratuite ou du moins en vous permettant de ne pas déranger les gens.

Sinon, essayez de garder votre application Android "idiote", comme pour garder toute la logique commerciale secrète sur un serveur principal, et que vous ayez simplement les données d'affichage d'applications en utilisant une forme de service exposé.

2
Jimmy

Quoi que vous fassiez, vous pouvez peut-être au moins rendre la décompilation très difficile, mais: Si quelque chose est exécuté/calculé dans un programme, les informations sur l'algorithme doivent être là et il y aura toujours une possibilité de le savoir. comment l'obtenir (suffisamment d'habileté et de motivation chez vos adversaires supposés). Toujours.

1
oezi

Vous ne pouvez pas sécuriser à 100% votre code Android contre le reverse engineering. Si vous souhaitez sécuriser une clé, vous pouvez vous faire aider par l’intégration du serveur qui vous fournit une clé cryptée lorsque vous appelez le service Web et l’utiliser dans votre code.

0
M.Noman

Vous voulez une approche créative, en voici une.

Quel est le programme principal sur les téléphones qui n'ont pas été décompilés aujourd'hui? Firmwares radio. Pourquoi? Il ne fonctionne pas sur le chipset ARM du téléphone, mais sur un Qualcomm Hexagon qui est de plus en plus présent dans les smartphones. Ce n'est pas x86, ce n'est pas ARM, il utilise une architecture et des instructions propriétaires Qualcomm.

  • La décompilation Java est facile.

  • La décompilation ARM est plus difficile (licences Hex-Rays Decompiler Commencent à 1129 USD ... et le mélange entre le code de pouce et le code standard ARM dans les fichiers binaires est pénible) => vous pouvez essayer de le compiler avec le Android NDK.

  • Il n'y a actuellement aucun décompilateur Hexagon! Et les spécifications QDSP ne sont pas disponibles publiquement, même les versions piratées.

La question est la suivante: un éditeur de logiciel indépendant peut-il utiliser le micrologiciel Hexagon inclus dans les téléphones grand public? Il semble que ce soit la direction prise par Qualcomm. Consultez leur site Web et les produits SnapDragon.

NB: je ne suis ni pro-Qualcomm ni pro-source-fermée. Mais ce fil fait appel à ce genre de solution.

0
KrisWebDev

J'ai mon algorithme sur un serveur et j'appelle ce service à partir de mon application pour smartphone. Un auteur peut désosser mon application smartphone pour voir mon protocole avec mon serveur. Je peux protéger mon algorithme mais je ne peux pas me protéger contre une utilisation non autorisée de mon service. Je dois accepter cette réalité sans solution. Je dois être content que tant que je gagne de l'argent avec mon propre service, je dois vivre avec le potentiel des autres qui siphonnent avec mon service.

0
David