Forensics/Iphone Forensics

[iOS Forensics] iPhone SMS (문자) 포렌식

pental 2021. 2. 10. 11:52

Phone에 저장되어있는 캘린더를 포렌식 해보도록 하겠습니다.

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

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

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

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


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

\HomeDomain\Library\SMS\sms.db

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

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

살펴보아야 할 테이블은 message 테이블과 handle 테이블입니다.

message 테이블에는 다음과 같은 요소가 들어있습니다.

text 칼럼에는 메시지의 내용이 담겨져 있습니다. 그럼 왜 handle 테이블이 필요할까요?

답은 message 테이블에는 어떤 사용자가 보냈는지를 확인 할 수가 없습니다. 더문다나 guid 칼럼과 account_guid를 바탕으로 전화번호를 추출하려고 해도 확인 할 수가 없습니다.

일단 handle 테이블을 살펴보도록 하겠습니다.

handle 테이블id 칼럼에는 전화번호service칼럼에는 sms의 종류가 담겨져 있습니다.

여기서 확인해야 할 것은 ROWID입니다. message 테이블handle_id 칼럼과 같은 요소를 찾아야지만 휴대폰 번호를 확인 할 수가 있습니다.

위가 message 테이블, 아래가 handle 테이블입니다.

이것을 바탕으로 코딩을 해보면 다음과 같습니다.

def sms():
    
    # SMS Artifact
    # C:\Users\pental\Desktop\iphone-forensics\extract_file\HomeDomain\Library\SMS\sms.db

    sms_location = pathlib.Path(str(pathlib.Path(os.getcwd() + "/extract_file/HomeDomain/Library/SMS")) + "\\sms.db")
    print(sms_location)
    conn = sqlite3.connect(sms_location)

    cur_message = conn.cursor()
    cur_message.execute("SELECT text, account_guid, handle_id, date, date_read, date_delivered, service FROM message")
    message_items = cur_message.fetchall()

    cur_caller_id = conn.cursor()
    cur_caller_id.execute("SELECT destination_caller_id FROM message")
    caller_id = cur_caller_id.fetchall()
    caller_id = str(caller_id[0])
    caller_id= caller_id.replace("('",'').replace("',)",'')

    cur_handle = conn.cursor()
    cur_handle.execute("SELECT ROWID, id, service FROM handle")
    handle_items = cur_handle.fetchall()

    for i in range(len(message_items)) :
        message_items[i] = list(message_items[i])
    for i in range(len(handle_items)) :
        handle_items[i] = list(handle_items[i])

    message_list = []
    
    for i in range(len(message_items)) :
        for j in range(len(handle_items)) :
            if message_items[i][2] == 0 :
                Phone_Number = caller_id
                Message = message_items[i][0]
                Message_Type = message_items[i][6]
                Date = src.util.cocoa_date_to_human_date_nano(message_items[i][3])
                if message_items[i][4] == 0 :
                    Read_Date = 0
                else :
                    Read_Date = src.util.cocoa_date_to_human_date_nano(message_items[i][4])
                if message_items[i][5] == 0 :
                    Delivered_Date = 0
                else :
                    Delivered_Date = src.util.cocoa_date_to_human_date_nano(message_items[i][5])
                message_list.append([Phone_Number, Message, Date, Read_Date, Delivered_Date])
                break
            elif message_items[i][2] == handle_items[j][0] :
                Phone_Number = handle_items[j][1]
                Message = message_items[i][0]
                Message_Type = message_items[i][6]
                Date = src.util.cocoa_date_to_human_date_nano(message_items[i][3])
                if message_items[i][4] == 0 :
                    Read_Date = 0
                else :
                    Read_Date = src.util.cocoa_date_to_human_date_nano(message_items[i][4])
                if message_items[i][5] == 0 :
                    Delivered_Date = 0
                else :
                    Delivered_Date = src.util.cocoa_date_to_human_date_nano(message_items[i][5])
                message_list.append([Phone_Number, Message, Message_Type, Date, Read_Date, Delivered_Date])
                break

    print("\n========== PRINT_TYPE ==========")
    print("'Phone Number' , 'Message', 'Message_Type', 'Date', 'Read_Date', 'Delivered_Date'")
    print("================================\n")

    for i in message_list :
        print(i)

코드 상에 date, read_date, deliver_date는 각각 날짜, 읽은 날짜, 전달된 날짜입니다.

빨간색으로 표시한 항목과 안한 부분은 보면, imessage의 경우 전달된 시간이 나타나지만, 일반 SMS 에는 그런 기능이 없기 때문입니다.

출력결과 잘 나타나는 것을 확인 할 수 있습니다.

본 소스는 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

읽어 주셔서 감사합니다. 다른 문의나 오탈자는 아래 댓글을 통해서 남겨주시면 감사하겠습니다!