Forensics/Iphone Forensics

[iOS Forensics] iPhone 연락쳐 포렌식

pental 2021. 2. 9. 15:56

오늘은 iPhone에 저장되어있는 연락쳐를 포렌식 해보도록 하겠습니다.

먼저 아이폰의 백업 파일을 추출해서 사용하겠습니다. 상황에 따라 본인에 맡게 사용하시면 될거 같습니다.

백업 파일 추출에 관해서 연락이 많은데, 이 부분에 대해서는 현재 아이폰 포렌식 도구를 만들고 있습니다.

github.com/kim-do-hyeon/iphone-forensics

 

kim-do-hyeon/iphone-forensics

iPhone Forensics Tool. Contribute to kim-do-hyeon/iphone-forensics development by creating an account on GitHub.

github.com

해당 도구를 사용하시면 추출이 가능합니다.


먼저 연락쳐가 저장되어 있는 데이터베이스의 위치는 다음과 같습니다.

\HomeDomain\Library\AddressBook\AddressBook.sqlitedb

해당 위치를 찾아가보면 다음과 같은 파일들이 있습니다.

이중에서도 AddressBook.sqlitedb 파일을 사용할 예정입니다. 먼저 DB Browser for SQLite 프로그램을 사용해 확인해 보도록 하겠습니다.

데이터 베이스의 구조는 위 사진과 같습니다.

여기서 확인해 봐야할 테이블은 두가지 입니다.

ABPerson 테이블과 ABMultiValue 테이블 입니다. 각각 아래 사진과 같습니다.

 ABPerson 테이블에는 이름이 저장되어 있고, ABMultiValue 테이블에는 전화번호가 저장되어 있습니다.

결론 먼저 말씀 드리면, ABPerson 테이블의 ROWID 칼럼과 ABMultiValue 테이블의 record_id 가 동일한 경우 해당 이름의 연락쳐가 됩니다.

예를 들어서 ROWID가 10인경우 ABMultiValue 테이블의 record_id의 값을 확인해야 합니다.

자동으로 가져오는 소스를 작성해 보겠습니다.

def addressbook_artifact():

    # Address Book Artifact
    # C:\Users\pental\Desktop\iphone-forensics\extract_file\HomeDomain\Library\AddressBook\AddressBook.sqlitedb

    addressbook_location = pathlib.Path(str(pathlib.Path(os.getcwd() + "/extract_file/HomeDomain/Library/AddressBook")) + "\\AddressBook.sqlitedb")
    conn = sqlite3.connect(addressbook_location)

    cur_ABPerson = conn.cursor()
    cur_ABPerson.execute("SELECT ROWID, First, Last FROM ABPerson")
    ABPerson = cur_ABPerson.fetchall()

    cur_ABMultiValue = conn.cursor()
    cur_ABMultiValue.execute("SELECT record_id, value FROM ABMultiValue")
    ABMultiValue = cur_ABMultiValue.fetchall()

    addressbook = []

    print("\n========== PRINT_TYPE ==========")
    print("'Name' , 'Value'")
    print("================================\n")

    for i in range(len(ABPerson)):
        for j in range(len(ABPerson)):
            if ABMultiValue[i][0] == ABPerson[j][0] :
                if str(ABPerson[j][2]) == str(None) :
                    name = ABPerson[j][1]
                else :
                    name = str(ABPerson[j][2]) + str(ABPerson[j][1])
                value = [name, ABMultiValue[i][1]]
                print(value)
                addressbook.append(value)
    conn.close()

잘 출력되는것을 확인 할 수 있습니다.

감사합니다. 오탈자나 문의는 댓글을 통해서 남겨주세요!