Ich möchte Dex-Dateien umwandeln / instrumentieren. Die Ziele der Transformation umfassen die Messung der Codeabdeckung. Beachten Sie, dass die Quelldateien nicht verfügbar sind. Instrumentation Dex ist also die einzige Option.
Ich frage mich, ob es eine existierende Codebasis gibt, die ich als Beispiele betrachten könnte, um ein Werkzeug zu schreiben, um mein Ziel zu erreichen.
Ich kenne das Smali-Projekt und eine Reihe anderer Projekte, die auf Smali aufbauen. Keines dieser Projekte ist jedoch ein gutes Beispiel für meinen Zweck.
Ich suche nach Code, der automatisch den smali-Code oder die dexlib-Darstellung transformiert, aus der smali generiert wird. Die spätere Option wird für meinen Zweck bevorzugt, da der Overhead der Generierung von Smali vermieden werden kann.
In einigen Fällen führt smali selbst eine kleine Menge an Instruktionsumschreiben durch, während es eine Dex-Datei wieder zusammensetzt. Dinge wie das Ersetzen eines Const-Strings durch einen Const-String / Jumbo oder eines Goto-Befehls durch einen "Größeren", wenn das Ziel außerhalb des Bereichs liegt. Dazu müssen die Anweisungen in der Anweisungsliste durch möglicherweise größere ersetzt und die entsprechenden Korrekturen korrigiert werden.
CodeItem.fixInstructions ist die dafür verantwortliche Methode.
Zusätzlich gibt es die asmdex-Bibliothek . Ich bin nicht so vertraut damit, aber es klingt, als wäre es relevant für das, was Sie tun wollen.
Es ist eine Menge Code, aber dx ist DexMerger ist ein Beispielprogramm, das Dex-Dateien transformiert. Es ist ziemlich kompliziert durch die Tatsache, dass es die Größe der Ausgabe erraten muss, um Vorwärts-Referenzen funktionieren zu lassen.
Sie müssen auch eine Infrastruktur erstellen, um Dalvik-Anweisungen neu zu schreiben. DexMerger InstructionTransformer führt ein seichtes Neuschreiben durch: Es passt Offsets von einem Mapping zum anderen an. Um die Codeabdeckung zu messen, müsste Ihr Instruction-Rewriting wahrscheinlich viel ausgefeilter sein.
Eine weitere Option, die kürzlich verfügbar wurde, ist Dexpler . Es ist eine Erweiterung von Soot, einem Framework für die Analyse und Instrumentierung von Java-Programmen. Dexpler liest die .apk-Dateien ein und konvertiert sie in das Zwischenformat von Jimple. Jemple-Code kann dann beliebig instrumentiert werden und schließlich in eine neue apk-Datei ausgelagert werden.
(Für die Aufzeichnung beantworte ich meine eigene Frage hier)
Irgendwann habe ich kein Werkzeug gefunden, das meinen Anforderungen entspricht. Also habe ich mein eigenes Tool namens Ella erstellt, basierend auf DexLib. Out-of-the-Box, es macht ein paar Dinge wie die Messung von Code-Abdeckung, Aufzeichnung von Methoden-Traces, etc. Aber es kann leicht erweitert werden, um andere Arten von Transformationen zu tun.
Ich weiß, es ist ein bisschen spät, aber nur für den Fall, dass Sie immer noch interessiert sind oder vielleicht für einige andere Leser. ASMDEX wurde bereits erwähnt. Und ich denke, das ist im Moment die beste Wahl für das, was Sie erreichen wollen.
Um neue Register hinzuzufügen, werfen Sie einen Blick auf die Klasse org.ow2.asmdex.util.RegisterShiftMethodAdapter. Es ist nicht perfekt! Tatsache ist, dass es schrecklich ist, wenn vorhandene 4-Bit-Befehle geändert werden, wenn ein Register hinzugefügt wird, würde bedeuten, dass ein Register am Ende 0xF ist und nicht in 4 Bits passt.
Aber es sollte ein guter Anfang sein.