Question:
Instrumentation java dynamique?
JavaSec
2013-04-11 14:37:10 UTC
view on stackexchange narkive permalink

Il ne s'agit pas strictement de «rétro-ingénierie», il est principalement lié à l'instrumentation dynamique.

Donc, de la même manière que strace qui vous permet de voir les appels système effectués par un processus, ou ftrace pour voir les appels de fonction, y a-t-il quelque chose de similaire pour Java?

Ce qui m'intéresse, c'est d'avoir un fichier .jar qui est exécuter dans un javaVM.

Existe-t-il un moyen d'instrumenter ou de tracer tous les appels d'API Java effectués par le code de l'application?

Autrement dit, sans aucune analyse statique du contenu du .jar ou sans aucune modification du contenu de .jar (par exemple pour ajouter des hooks). Idéalement, une solution équivalente à strace ou par ex. une javaVM manipulée

La même chose s'applique sur Android - Existe-t-il un moyen de retracer tous les appels d'API du framework Android (ou d'autres fonctions essentiellement DalvikVM) qu'une application effectue sans aucune modification du fichier APK? Toutes les autres modifications de l'environnement / système sont bien.

Dans mon monde idéal, l'analyste obtiendrait la sortie suivante, tout en exécutant une application UNEDITED ( .jar ou .apk ):

  timestamp1: java.security.SecureRandom.getSeed () appelé. Arguments: (Number) timestamp2: javax.security.cert.X509Certificate.checkValidity () appelé. Arguments: (null) ... timestamp3: java.sql.Connection.prepareStatement () appelé. Arguments: ("SELECT * FROM X WHERE Y = W")  
Dans ce cas, ne serait-il pas plus facile d'analyser le comportement de l'exécutable java.exe, lorsque le fichier .jar lui passait en paramètre?
Je ne sais pas comment cela peut être fait et quel type de résultat cela aurait. L'analyse de l'exécutable java montrerait les appels système qu'il fait au noyau - ce n'est pas ce que je recherche. Je cherche à retracer l'invocation des API Java. De plus, cela ne fonctionnerait pas sur Android, qui est la deuxième cible.
En ce qui concerne Android, vous pouvez utiliser DDMS pour tracer la cible à des fins d'inspection avec le profileur, mais cela n'obtient pas d'arguments. Si vous voulez des appels et des données API, vous pouvez instrumenter la fonction `binder_transaction` dans le noyau via` kprobes`, bien que l'analyse des tampons de transaction soit problématique.
@MathewHall c'est très intéressant et peut être la solution pour Android. Je vais l'examiner! J'imagine que vous instrumenteriez binder_transaction via kprobes en utilisant systemtap?
SystemTap est probablement plus facile oui, bien que vous ayez besoin de pouvoir "analyser" les paquets (args de `binder_transaction`). Le `code` dans les données de transaction est l'index dans le fichier` aidl` du service et le service lui-même apparaît sous la forme d'une chaîne UTF-16 dans le tampon. Les arguments d'objet sont cependant plus compliqués; [ce jeu de diapositives 0xlab] (http://0xlab.org/~jserv/android-binder-ipc.pdf) résume assez bien Binder.
Trois réponses:
perror
2013-04-11 20:19:35 UTC
view on stackexchange narkive permalink

Oracle Java Virtual Machine

Le suivi de l'exécution d'un programme Java peut être effectué via l ' Java Platform Debugger Architecture (JPDA). Ce framework vous permet d'obtenir un contrôle total d'une exécution au sein de la JVM (sans avoir à modifier le code d'origine). Consultez ce didacticiel pour une vue plus détaillée de ce cadre.

Si vous souhaitez l'implémenter vous-même, vous devez utiliser l'interface MethodEntryRequest et intercepter tout appel de méthode.

Mais, si vous êtes paresseux (juste comme moi), vous feriez mieux d'utiliser des projets déjà existants tels que InTrace (voir également la page Projets associés du projet InTrace).

Machine virtuelle Android Java Dalvik

Le traçage d'un programme Android Java peut être effectué via le Dalvik Debug Monitor Server (DDMS) et le framework de débogage Android complet.

Il existe déjà des outils pour suivre l'exécution de programmes tels que les outils Traceview et dmtracedump. Et, enfin, quelques conseils sur la Dalvik JVM.

wow, c'est exactement ce que je cherchais, et je ne savais même pas que de telles choses existaient. Merci d'avoir ouvert les yeux sur cela, cela devrait être parfait pour le code java.
Cependant, tous ces outils dépendent de la fonctionnalité javaagents, qui n'est pas prise en charge sur Dalvik, donc cela ne fonctionnerait pas sur Android. Je suppose que je devrais avoir une autre question plus spécifique à Android.
Ma faute, je n'ai pas remarqué que vous aviez demandé spécifiquement Dalvik JVM (je pensais que la balise 'android' aurait dû sonner une cloche ...). Et je ne connais pas grand chose à la JVM Android. Pardon. : - /
Le plus proche que je pourrais trouver pour Dalvik JVM semble être le [Dalvik Debug Monitor Server] (http://developer.android.com/tools/debugging/ddms.html) (DDMS) et le [cadre de débogage Android] complet ( http://developer.android.com/tools/debugging/). Vous semblez pouvoir extraire une trace avec les [outils Traceview et dmtracedump] (http://developer.android.com/tools/debugging/debugging-tracing.html). Mais je ne l'ai jamais essayé.
J'ai essayé cela, mais il ne semble pas être en mesure de donner des arguments pour les méthodes, je poursuivrai mes recherches. Je viens également de découvrir que dalvikVM peut être lancé indépendamment, en utilisant «dalvikvm» sur un shell adb, et qu'il prend en charge une sorte d'option -agentlib pour lancer jdwp. Je me demande si c'est utile d'une manière ou d'une autre. [http://www.netmite.com/android/mydroid/2.0/dalvik/docs/debugger.html]
Ange
2013-04-11 14:44:48 UTC
view on stackexchange narkive permalink

Vous pouvez instrumenter Java en utilisant un agent, qui manipulera le bytecode du fichier chargé (en utilisant Asm est recommandé pour la manipulation de bytecode).

Vous pouvez utiliser le plugin Bytecode Outline d'Eclipse pour déboguer l'exécution.

C'est un bon tutoriel sur le sujet.

Merci pour cela, c'est bien. Cependant, cela implique de manipuler le fichier jar, en insérant essentiellement des crochets. Je cherche surtout à tout faire sans jamais toucher au fichier .jar, à l'examiner passivement. Cela permettrait l'analyse du code `` protégé '' (par exemple, le code qui utilise la protection de l'intégrité via une autre bibliothèque, est fortement obscurci, etc.). Peut-être qu'une VM java ou dalvik manipulée pourrait fonctionner, de sorte que les appels d'API se consignent quelque part (?).
Hmm je viens de lire l'article que vous avez envoyé à nouveau, il semble que cela n'implique pas de manipulation de l'application .. hm, toujours à la recherche!
Mathew Hall
2013-04-11 20:36:20 UTC
view on stackexchange narkive permalink

AspectJ peut être utilisé pour ce faire sur la JVM, via le tissage au moment du chargement. Il est construit sur Asm mais il y a plus d'abstraction (pas de bytecode). Le traçage des appels de méthode est assez simple: définissez d'abord un filtre correspondant aux "pointcuts" qui vous intéressent, puis spécifiez les actions que vous souhaitez effectuer ("conseil").

La syntaxe est un peu maladroit cependant:

  aspects du paquet; import java.util.logging.Level; import java.util.logging.Logger; import org.aspectj.lang.Signature; aspect Trace {pointcut traceMethods () : (exécution (* * (..)) &&! cflow (dans (Trace))); before (): traceMethods () {Signature sig = thisJoinPointStaticPart.getSignature (); String line = "" + thisJoinPointStaticPart.getSourceLocation (). GetLine (); String sourceName = thisJoinPointStaticPart.getSourceLocation (). GetWithinType (). GetCanonicalName (); Logger.getLogger ("Tracing"). Log (Level.INFO, "Call from" + sourceName + "line" + line + "to" + sig.getDeclaringTypeName () + "." + Sig.getName ()); }}  

Compilez avec: ajc -outxml -outjar aspects.jar Trace.java .

Pour exécuter FooClass avec le tisserand, exécutez :

  java -javaagent: aspectjweaver.jar -cp aspects.jar: $ {target_jar_name} FooClass  
Notez que cela ne fonctionnera pas pour les applications obscurcies (ou juste celles compilées sans informations de débogage).


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...