2017-03-02 4 views
1

릴리스 구성으로 구축 된 응용 프로그램 중 하나를 리버스 엔지니어링하려고합니다.LLDB는 16 진수 주소 만 알고 있습니다.

내 스레드 정보는 다음과 같습니다.

* 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> 

등록 X0 (주소 0x181ba4174는)

메모리 읽기 내가 그 인증의 FUNC은 정의

을 가지고 발견

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

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

(I 해봤 다른 형식) 같은 것을 보여줍니다 필요한 인수를 포함

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

기본적으로 원하는 것은 주소 0에 저장된 '바이트'변수를 얻는 것뿐입니다. x181ba4174.

또한 나는 '인증'방법은 다음과 같이 인수와 함께라는 것을 알고

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

가 이상적으로 키를 다시 싶어.

답변

1

마침내 나는 이것을 할 수있었습니다. 내가 열쇠를 얻을 수 있었다

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

그런 다음 사용하는 엑스 코드 :

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

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

는 또한 누군가가 그것을 필요로하는 경우에 명령을 썼다

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

그것은 같은 출력을 제공합니다.

ptrInt8Array 0x181ba4174 
:

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

하여 실행