
본 글은 연구목적으로 작성된 글이며 불법적 용도로 사용을 금합니다
[참고 논문] 윈도우 환경에서 카카오톡 데이터 복호화 및 아티팩트 분석 연구
1. 들어가며
카카오톡은 국내에서 가장 널리 사용되는 메신저로, PC 버전에서는 대화 기록을 EDB(Extensible Database) 파일 형태로 저장합니다.
하지만 이 파일은 SQLite 기반이지만 AES 암호화되어 있어 일반적인 방법으로는 접근이 어렵습니다.
1편에서는 카카오톡 EDB 파일 복호화 파이썬 코드를 만들어봤습니다.
본 글에서는 uuid, modelName, serialNumber 등을 확인하는 방법과 모든 것들을 다 조합하여 복호화에 성공한 EDB 파일을 sqLite browser 프로그램을 활용하여 내부 구조를 살펴보는 부분(채팅방 목록, 채팅내용, 대화방에 첨부된 이미지 파일)까지 작성해 보도록 하겠습니다.
2. 복호화 실행 코드
아래는 1편에서 작성한 복호화 코드 전체입니다.
이 코드에는 pc에서 확인 가능한 uuid, modelName, serialNumber 가 변수로 설정되어 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
from Cryptodome.Cipher import AES from Cryptodome.Util.Padding import pad import hashlib import base64 def generate_pragma(uuid, modelName, serialNumber): # 데이터 결합 (|로 구분) data = f"{uuid}|{modelName}|{serialNumber}" # 128비트 키와 16바이트 IV 설정 key = bytes.fromhex('하드코딩된 바이트배열-별도 방법으로 추출 필요') iv = bytes([0] * 16) # IV를 0으로 설정 (16바이트) # AES 암호화 객체 생성 cipher = AES.new(key, AES.MODE_CBC, iv) # 데이터 패딩 및 암호화 ciphertext = cipher.encrypt(pad(data.encode(), AES.block_size)) # SHA-512 해시 생성 sha512_hash = hashlib.sha512(ciphertext).digest() # Base64 인코딩된 SHA-512 해시값 리턴 return base64.b64encode(sha512_hash).decode() def generate_key_and_iv(pragma, userId): # Pragma와 userId를 결합하여 512바이트까지 확장 key = (pragma + userId) * (512 // len(pragma + userId) + 1) key = key[:512] # MD5 해싱을 통해 Key 생성 key_hash = hashlib.md5(key.encode()).digest() # Base64 인코딩 후 다시 MD5 해싱을 통해 IV 생성 iv = hashlib.md5(base64.b64encode(key_hash)).digest() return key_hash, iv def decrypt_database(key, iv, encDB): decDB = b'' # 복호화된 데이터 저장 i = 0 while i < len(encDB): # 4096바이트씩 AES128 CBC 모드로 복호화 cipher = AES.new(key, AES.MODE_CBC, iv) decrypted_data = cipher.decrypt(encDB[i:i+4096]) # 복호화된 데이터 저장 decDB += decrypted_data i += 4096 return decDB uuid = "pc에서 확인가능" modelName = "pc에서 확인가능" serialNumber = "pc에서 확인가능" # Pragma 생성 pragma = generate_pragma(uuid, modelName, serialNumber) # Key & IV 생성 userId1 = "별도 방법으로 확인" key1, iv1 = generate_key_and_iv(pragma, userId1) # 암호화된 데이터 읽기 input_filename = 'chatLogs_00.edb' encDB = read_encrypted_data_from_file(input_filename) # 복호화 수행 decDB = decrypt_database(key1, iv1, encDB) # 복호화된 데이터 저장 output_filename = 'chatLogs_00.edb_output1' save_to_file(decDB, output_filename) print("Decrypted data saved to ", output_filename) |
2. 변수확인
- regedit를 실행합니다.

2. 아래 위치에서 변수에 들어갈 값을 확인합니다.

3. SQLite를 활용하여 파일 내용 확인
카카오톡 EDB 파일이란?
- 역할: 카카오톡 PC 버전은 대화 기록을
chatLogs_{chatId}.edb
파일에 저장합니다. - 특징: SQLite 기반이지만 AES 알고리즘으로 암호화되어 있어 직접 조회가 불가능합니다.
파일의 위치
Windows 환경에서 EDB 파일은 다음 경로에 저장됩니다:
1 |
C:\Users\사용자명\AppData\Local\Kakao\KakaoTalk\users\{userDir}\chat_data\chatLogs_{chatId}.edb |
여기서 {userDir}
은 각 사용자별 고유 디렉토리이며, {chatId}
는 특정 채팅방을 식별하는 값입니다.
- 우선 SQLite를 아래 공식 사이트에서 다운받습니다.
https://www.sqlite.com/download.html
2. 설치 후 실행하여 복호화하기 전 edb파일을 실행해보면 열리지 않습니다.

3 . 위 복호화 파이썬 코드를 활용하여 파일을 복호화합니다.
4. 복호화된 파일을 SQLite를 이용해 열어보면 먼저 테이블 구조가 보입니다.

5. 여기서 데이터 탐색 탭을 누르고 chatLogs 테이블로 이동해보면 아래처럼 대화내용이 나타나게됩니다.

4. 마무리 및 다음글에 대한 예고편
본 글에서는 카카오톡 PC 버전의 EDB 파일을 복호화하고 뷰어를 사용해 확인하는 방법을 알아봤습니다.
반응이 좋으면 다음 글에서는 첨부파일(이미지, 동영상)을 복호화 하여 확인하는 방법에 대해 알아보겠습니다.
- 하드코딩된 바이트배열은 kakaotalk.exe 파일에 대한 리버스엔지니어링 등이 필요한 부분으로 공개적으로 자세하게 설명드리기는 어렵습니다.
⚠️ 주의사항: 본인의 데이터가 아니라면 복호화를 시도하지 말아야 하며, 법적 문제를 유의해야 합니다.
글을 읽으시면서 궁금한 내용이나 정보교류를 원하시는 경우 댓글로 남겨주시면 확인 후 답변 드리겠습니다
안녕하세요, 카카오톡 edb 복호화 관련해서 정성스럽게 남겨주신 글 잘 읽었습니다.
저도 리버싱 엔지니어링과 포렌식에 관심이 많아서 해당 주제로 연구를 여러방면으로 해보았는데 바이트 배열을 찾는 과정에서 진척이 없어서 이렇게 실례를 무릅쓰고 질문 남깁니다.
혹시 해당 복호화에서 사용된 바이트 배열을 얻는 리버싱 엔지니어링 과정에서 조언이 가능하시다면 아래 이메일로 연락 하셔서 도움 받을 수 있다면 감사하겠습니다.
markyab@naver.com
기재된 이메일로 안내드렸습니다!!