2017-03-02 4 views
1

J'essaie d'inverser l'ingénierie d'une application construite avec une configuration de version.LLDB print swift array ne connaissant que l'adresse hexadécimale

L'information sur mon sujet ressemble à ceci.

* thread #21: tid = 0x876cb, 0x000000010133856c SomeLibSwift`SomeLibSwift.Auth.auth (Swift.Array<Swift.UInt8>) throws -> Swift.Array<Swift.UInt8>, queue = 'com.apple.root.utility-qos', stop reason = breakpoint 1.6 
    * frame #0: 0x000000010133856c SomeLibSwift`SomeLibSwift.Auth.auth (Swift.Array<Swift.UInt8>) throws -> Swift.Array<Swift.UInt8> 

Inscrivez-X0 (adresse 0x181ba4174) contient l'argument nécessaire

lecture mémoire montre quelque chose comme (je l'ai essayé différents formats)

memory read -s1 -fC -c1000 --force 0x181ba4174 

0x181ba4174: ...??._?.......??._?0......??._? 
0x181ba4194: P......??._?p......??._?.......? 
0x181ba41b4: ?._ְ......??._??......??._?.... 
0x181ba41d4: ...??._?0......??._?P......??._? 
0x181ba41f4: p......??._?.......??._ְ......? 
0x181ba4214: ?._??......??._?.......??._?P... 
0x181ba4234: ...??._?p......??._?.......??._? 
.... 

Je trouve que auth func a une telle définition

func auth(_ bytes: Array<UInt8>) throws -> Array<UInt8> 

Donc, tout ce que je veux, c'est obtenir la variable 'bytes' stockée par l'adresse 0 x181ba4174.

Aussi je sais que la méthode « auth » est appelé avec un argument comme celui-ci:

let key = "somekey".utf8 
let result = auth(key) 

Idéalement je veux revenir clé.

Répondre

1

Finalement, j'ai réussi à faire cela.

expr -l Swift -- String(unsafeBitCast(0x181ba4174, to: Array<UInt8>.self)) 

Il donne une sortie comme:

(String) $R0 = "[10, 11, 118, 105, 19, 1]" 

Ensuite, en utilisant Xcode j'ai pu obtenir la clé:

var arr: [UInt8] = [10, 11, 118, 105, 19, 1] 

let data = Data(bytes: arr) 
let key = String(data: data, encoding: .ascii) 

J'ai également écrit une commande au cas où quelqu'un en a besoin.

command regex ptrInt8Array 's/(.+)/expr -l Swift -- String(describing: unsafeBitCast(%1, to: Array<UInt8>.self))/' 

Exécuter par:

ptrInt8Array 0x181ba4174