web-dev-qa-db-fra.com

Cacher des chaînes dans du code obscurci

Je viens de dissimuler mon code Android à l'aide de proguard, puis de le décompiler. Il y a un certain nombre de chaînes que j'aimerais vraiment cacher aux regards indiscrets. Quand j'ai décompilé mon code, les chaînes étaient là pour que tout le monde puisse les voir ... et les changer. Une des chaînes est une URL vers mon serveur de licences et ils pourraient en fait changer l’URL pour pointer vers un faux serveur (car je communiquerai le code du serveur au public). Quel est le meilleur moyen de cacher ce type d’information?

De plus, j'ai remarqué que les chaînes de la classe R sont toutes des nombres aléatoires, mais je ne trouve pas la classe R dans le code décompilé. Où est-ce?

Exemple d'ennemi je vois: new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);

2130903058 est un fichier de mise en page mais à quoi se rapporte-t-il? Le chiffre ne signifie rien à moins qu'il ne pointe vers une sorte d'adresse.

55
jax

En supposant que vous soyez satisfait d’obscur au lieu d’être sécurisé, il existe un certain nombre de mécanismes que vous pouvez utiliser, mais les obfusateurs tels que proguard ne pourront pas vous aider.

Pour ce faire, vous devrez encoder ou chiffrer la chaîne vous-même. L’approche que vous allez utiliser dépend de ce sur quoi vous essayez de vous défendre. Si vous essayez simplement de vous cacher d’une inspection évidente, un encodage peut suffire (voir Android). .util.Base64, http://developer.Android.com/reference/Android/util/Base64.html ). Notez que l'encodage est AUCUNE SÉCURITÉ et que tout ce qu'il aura à faire sera de supprimer la référence évidente à votre site.

Si vous essayez de vous défendre contre quelque chose de plus, vous pouvez alors procéder au chiffrement de la chaîne. Pour ce faire, vous devez utiliser un chiffrement symétrique tel que AES via javax.crypto.Cipher, http://www.androidsnippets.org/ snippets/39/index.html fournit un exemple d'utilisation décent. Encore une fois, c’est plus gênant que d’être sûr d’être des hackers, car vous aurez besoin de stocker la clé quelque part dans votre pot, annulant ainsi toute sécurité cryptographique.

Pour clarifier cela, les étapes de base seraient les suivantes:

  1. Créez manuellement un cryptage de votre chaîne en utilisant une clé connue.
  2. Convertissez votre code pour utiliser une version décryptée de cette chaîne, exemple:

Avant:

public class Foo {
    private String mySecret = "http://example.com";

    ...
}

Devient:

public class Foo {
    private String encrypted = "<manually created encrypted string>";
    private String key = "<key used for encryption";
    private String mySecret = MyDecryptUtil.decrypt(encrypted, key);

    ...
}

Une (bonne) alternative à tout cela consiste à utiliser une solution tierce telle que le serveur de licences que Google fournit http://Android-developers.blogspot.com/2010/07/licensing-service-for-Android. html . Cela peut être plus sûr que quelque chose que vous faites vous-même, mais est soumis à des limitations très similaires à ce que j'ai décrit ci-dessus.

32
Mark Hibberd

ce que j'ai fait était de créer une longue liste de chaînes statiques dans ma classe d'utilité globale. Quelque part dans la longue liste de chaînes, je mets mon mot de passe par plusieurs morceaux.

avec mon code, il est facile de voir quels sont les vrais mots de passe - mais une fois que l'obfuscateur se mettra au travail, toutes les statistiques statiques auront un nom tel que A, B, C, etc., et il ne sera plus facile de les repérer.

7

J'ai utilisé ROT47. Ce n'est pas très sécurisé, mais facile à utiliser et à mettre en œuvre, car c'est un encodeur/décodeur symétrique

2
w_g

Vous devriez chercher sur Google "Juste un autre pirate informatique Perl". Ce sont des programmes qui affichent une chaîne avec du code obscurci. Il y a aussi beaucoup d'exemples dans d'autres langues que Perl sur le net.

Entrée Wikipedia

1
iuiz

Vous pouvez utiliser DexGuard pour chiffrer des chaînes, probablement plus efficacement que vous ne pourriez le faire manuellement, sans alourdir le code source.

0
Ahmad Ronagh