
본 글은 연구목적으로 작성된 글이며 불법적 용도로 사용을 금합니다
1. 들어가며
카카오톡은 국내에서 가장 널리 사용되는 메신저로, PC 버전에서는 대화 기록을 EDB(Extensible Database) 파일 형태로 저장합니다.
하지만 이 파일은 SQLite 기반이지만 AES 암호화되어 있어 일반적인 방법으로는 접근이 어렵습니다.
본 글에서는 카카오톡 EDB 파일의 구조와 복호화 방법, 그리고 삭제된 메시지 복구 및 미디어 파일 분석 방법을 소개합니다.
[참고 논문] 윈도우 환경에서 카카오톡 데이터 복호화 및 아티팩트 분석 연구
Journal of The Korea Institute of Information Security & Cryptology
VOL.33, NO.1, Feb. 2023
2. 카카오톡 EDB 파일의 구조
카카오톡 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}
는 특정 채팅방을 식별하는 값입니다.
3. 카카오톡 EDB 파일 복호화 과정
카카오톡 PC 버전은 데이터베이스 파일을 AES-128-CBC 방식으로 암호화합니다.
이를 해독하려면 사용자의 하드웨어 정보(디스크 정보) 및 계정 정보를 이용해 복호화 키를 생성해야 합니다.
3.1. 암호화 키 생성 과정
카카오톡 EDB 파일은 사용자의 하드웨어 정보를 기반으로 한 키를 사용하여 AES 암호화됩니다.
따라서 키를 생성하기 위해서는 UUID, 하드디스크 모델명, 시리얼 번호가 필요합니다.
이러한 정보를 결합하여 Pragma 값을 생성합니다.
이 과정은 논문에서 다음과 같이 설명하고 있습니다
하드 코딩된 바이트 배열을 키로 하여, UUID와 ModelName, SerialNumber를 연접한 결과에 AES 암호화를 수행한다.
위 결과에 대해 SHA512 해싱 수행 후, Base64 인코딩을 수행하면 Pragma가 생성된다.edb 복호화 pragma 생성
이를 코드로 구현하면 다음과 같습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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() |
3.2. Key 및 IV 생성
생성된 Pragma 값과 userId
를 결합하여 AES 키와 IV를 생성합니다.
이 과정은 다음과 같이 진행됩니다:
Pragma와 userId를 512바이트가 될 때까지 반복하여 연접한 후 MD5 해싱을 수행하면 Key가 생성된다.
생성된 Key에 대해 Base64 인코딩 후 MD5 해싱을 수행하면 IV가 생성된다.

이를 코드로 구현하면 다음과 같습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import hashlib import base64 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 |
4. 카카오톡 EDB 데이터 복호화
생성된 키와 IV를 사용하여 카카오톡 EDB 파일을 복호화합니다.
논문에서는 다음과 같이 설명하고 있습니다:
생성한 key, iv 쌍을 이용하여 페이지 크기인 4,096바이트 별로 AES 복호화를 수행한다.

이를 코드로 구현하면 다음과 같습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from Cryptodome.Cipher import AES 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 |
5. 복호화 실행 예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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) |
6. 마무리 및 다음글에 대한 예고편
본 글에서는 카카오톡 PC 버전의 EDB 파일을 복호화하는 방법에 대하여 소개했습니다.
다음 글에서는 uuid, modelName, serialNumber 등을 확인하는 방법과 모든 것들을 다 조합하여 복호화에 성공한 EDB 파일을 sqLite browser 프로그램을 활용하여 내부 구조를 살펴보는 부분(채팅방 목록, 채팅내용, 대화방에 첨부된 이미지 파일)까지 작성해 보도록 하겠습니다.
- 하드코딩된 바이트배열은 kakaotalk.exe 파일에 대한 리버스엔지니어링 등이 필요한 부분으로 공개적으로 자세하게 설명드리기는 어렵습니다.
⚠️ 주의사항: 본인의 데이터가 아니라면 복호화를 시도하지 말아야 하며, 법적 문제를 유의해야 합니다.
이 글은 chatGPT 4o 버전에 해당 논문을 인식시켜 기본 글의 구조를 작성하고 논문을 기초로 만든 코드를 결합시켜 만든 글입니다.
글을 읽으시면서 궁금한 내용이나 정보교류를 원하시는 경우 댓글로 남겨주시면 확인 후 답변 드리겠습니다
하드코딩된 바이트 배열은 구할 수 있는 방법이 없을까요?
기재해주신 이메일로 안내드렸습니다.
저도 하드코딩된 바이트 배열 확인하는 방법 부탁드립니다.
기재된 이메일로 안내드렸습니다!
저도 하드코딩된 바이트 배열 확인 할 수 있는 방법 궁금합니다.
기재해주신 이메일로 답변 드렸습니다. 즐거운 코딩되세요~
안녕하세요.
자바 개발자인데 처음으로 파이썬하면서 VS Code툴쓰면서 파이썬 설치하고 포스팅보면서 과정 따라가고 있습니다.
코드에서 하드코딩된 바이트배열을 확인할 수 있는 방법이 궁금합니다.
도움 받을수 있을까요?
도움주신다면 정말 감사하겠습니다!!
안녕하세요. 현재 VS Code에서 파이썬을 설치하고 과정을 따라가고 있습니다.
현재 실행 중인 코드에서 하드코딩된 바이트배열을 확인할 수 있는 방법이 궁금합니다. 이에 대한 도움을 주실 수 있을까요?
도움을 주신다면 정말 감사하겠습니다.
기재해주신 이메일로 답변 드렸습니다. 즐거운 코딩되세요~
저도 하드코딩된 바이트 배열 확인 할 수 있는 방법 궁금합니다. 여기서 막히네요.
기재된 이메일로 안내드렸습니다.
안녕하세요. 좋은 정뷰 감사합니다.
하드코딩된 바이트배열 확인할 수 있는 방법이 궁금합니다. 이 부분에서 막히네요.
하드코딩된 바이트 배열을 확인하는 방법이 궁금합니다.
도움 주시면 감사하겠습니다.
즐거운 하루되세요.
안녕하세요. 포스팅하신 글을 따라 실행해보고 있는데요.
다 모르겠는데.. 하드코딩된 바이트배열에 대해선 어떻게 찾아야할지 감이 안와 도움을 요청 드리고자 합니다.
찾는 방법이 있으면 가르침 부탁드립니다.
기재된 이메일로 안내드렸습니다!!
안녕하세요. 올려주신 글 보고 따라해보고 있는 개발자입니다.
혼자서 이것저것 해봤는데 바이트배열 찾기가 도저히 안돼서 댓글 남깁니다..
도움주시면 정말 감사하겠습니다!
기재된 이메일로 안내드렸습니다!!
저도 하드코딩된 배열을 알아보고싶습니다만 도무지 방법을 못찾겠네요 ㅜㅜ 지푸라기라도 잡고싶은 심정으로 요청댓글 한번 남겨봅니다 ㅜㅜ 부탁드립니다!!!!
기재된 이메일로 안내드렸습니다!
안녕하세요. 작성해주신 글을 보고 파이썬으로 작업해보고 있습니다.
‘하드코딩된 바이트배열’ 추출하는 방법이 궁금합니다.
가르쳐주시면 감사하겠습니다.
기재된 이메일로 안내드렸습니다!
제가 댓글을 남겼었는데 승인이 필요하다는 내용을 본 것 같은데 그것도 사라져서 다시 남깁니다!
저도 다른 분들과 마찬가지로 하드코딩된 128비트 키를 얻어보려고 디버그 툴로 중단점을 따라가면서 얻어보려고 노력해봤고.. 우회까지 해봤는데 별다른 방법을 찾지 못해서 도움을 얻고자 댓글을 남깁니다!! 부탁드립니다!!!!
기재된 이메일로 안내드렸습니다!
리버싱선배님 정말 흥미롭고 많은 가르침을 주서서 감사합니다.
정독을 하고 힌트가 있지 않을까 하고 열심히 책도 보고 타 글 까지 읽어보았는데요 정말 모르겠습니다. 수학문제를 풀다 방법을몰라 해답지를 보고 아하! 하는 느낌을 받고 성장하고 싶은데 틈내서 맨땅공부하고 있는데요 정말 어렵습니다. 저도 기회가 된다면 해답지를 보고싶습니다. 시간내주셔서 감사합니다. 혹 그전에 풀리면 좋겠지만 멘탈이 흔들리고 있습니다.
조금더 도움이 필요합니다 선배님
기재된 이메일로 안내드렸습니다!
안녕하세요. 작성해주신 글을 보고 따라서 작업해보려 하는데 하드코딩된 바이트배열 추출하는 방법 공유해주실 수 있나요?
기재된 이메일로 안내드렸습니다!
관련 블로그 글을 싹다 참고해도 하드코딩된 바이트배열 찾는 방법을 잘 모르겠네요. 메신저 포렌식 공부하고 있는데 도와주실 수 있으실까요? 부탁드립니다!
기재된 이메일로 안내드렸습니다!
안녕하세요 Hex 에디터나 디버거, 리버스 툴(IDA, x64dbg 등)로 어떻게 접근해야 할지 막막합니다.
특히 const uint8_t KEY[16] = {…} 같은 하드코딩 배열이 있을 때,
이를 찾는 패턴이나 효과적인 분석 흐름이 궁금합니다. 이메일로 방법좀 받아볼수있을까요?
기재된 이메일로 안내드렸습니다!
하드코딩된 바이트배열을 찾는 디버깅 관련 글을 작성 준비 중에 있습니다.
감사합니다.
복호화 성공 회신메일 잘 받았습니다! 블로그 자주 방문 부탁드립니다!
하드코딩된 128비트 키를 얻는방법을 알고싶습니다
기재된 이메일로 안내드렸습니다!
혹시 이 방식이 25년 5월 11일 이후에도 유효한 방식일까요?
암호화 방식이 바뀐건지 아니면 하드코드된 키값이 바뀐건지 저만의 현상인지 궁금해서요.
현재 업데이트로 인해서 카카오톡 데스크탑 클라이언트 v25 이상입니다.
그리고 혹시 가능하시다면 ‘하드코딩된 바이트배열’ 추출하는 방법에 대해서 알려주실 수 있으실까요?
카카오톡PC ver.25.4.1.4484에서 정상적으로 복호화되는걸로 확인되었습니다.(2025.5.18. 19:22 기준)
안녕하세요 선배님!
하드코딩 된 바이트배열 추출하는 방법 좀 알고싶습니다. 부탁드립니다.
미리 감사합니다.
안녕하세요. 네 편에 달하는 정성담긴 복호화 게시글 잘 읽었습니다.
가능하다면 하드코딩된 바이트 배열 추출법에 대해 공유받고 싶습니다! 감사합니다.
기재된 이메일로 안내드렸습니다!
하드코딩된 바이트배열 부분 도움 요청드립니다 ㅠㅠ
기재된 이메일로 안내드렸습니다!
하드코딩된 바이트 배열을 어떻게 찾아야할까요 ? 공유가 가능하시다면 부탁드립니다
기재된 이메일로 안내드렸습니다!
분석공부해보고있는 학생입니다. 저도 key 구하는거에서 막혀잇는데 도움좀 요청드립니다 ㅠ
기재된 이메일로 안내드렸습니다!
Pragma key 값을 알 수 있을까요 ?
X64dbg를 사용해서 알아내려하는데 쉽지않네요
디버거 활용하여 찾는게 쉽지가 않습니다..
기재된 이메일로 안내드렸습니다!
저도 디버거로 찾고 있는데 쉽지 않네요..
힌트라도 주시면 감사하겠습니다!
기재된 이메일로 안내드렸습니다!
댓글이 안 올라갔었네요..
다시 글 올려봅니다
카카오톡이 themida 3.x 로 패킹 되어 있어서 분석이 진짜 쉽지 않네요
보이는 symbol도 다 관련 없어 보이는 것들이고…
혹시 관련 부분 도움좀 받을 수 있을까요??
기재된 이메일로 안내드렸습니다!
하드코딩된 바이트 배열 확인하는 방법이 궁금합니다!
기재된 이메일로 안내드렸습니다!
저도 하드코딩된 바이트 배열 확인방법을 알고 싶습니다!
기재된 이메일로 안내드렸습니다!
하드코딩된 바이트 배열을 추출하는 방법좀 부탁드립니다
기재된 이메일로 안내드렸습니다!
안녕하세요.. 제가 소송건으로 카톡 내용을 복구해야 하는 상황인데 도움 받을 수 있을까요?
기재된 이메일로 안내드렸습니다!
저도 하드코딩된 바이트 배열 방법 확인하는 방법 좀 알려주실수 있을까요?
기재된 이메일로 안내드렸습니다.
안녕하십니까, 급히 카카오톡 대화 내용을 복구하여야 할 일이 있어 따라하고 있는데, 혹시 하드코딩된 바이트 배열을 추출할 수 있는 방법이 있을지 알려주신다면 감사드리겠습니다.
기재된 이메일로 안내드렸습니다.
저도 하드코딩된 바이트 배열 확인 할 수 있는 방법 궁금합니다.
기재된 이메일로 안내드렸습니다.
Pragma key 값을 알 수 있을까요 ?
기재된 이메일로 안내드렸습니다.
좋은 글 감사합니다.
하드코딩된 바이트 배열 확인 방법 알 수 있을까요?
기재된 이메일로 안내드렸습니다.
안녕하세요! 하드코딩 된 바이트배열 추출하는 방법 알려주실수 있으실까요?? 부탁드립니다.
기재된 이메일로 안내드렸습니다.
안녕하세요! 연습으로 따라하는중인데 하드코딩 된 바이트배열 추출하는 방법 부탁드릴수있을까요?
기재된 이메일로 안내드렸습니다!