상세 컨텐츠

본문 제목

세 번 실패하고 바꾼 질문 — SQLCipher raw key가 전환점이었다, 카톡대화방 복호화2

서버·개발/코드 노트

by 사이 (SAI) 2026. 7. 26. 17:31

본문

728x90
반응형

Windows 카카오톡 DB 복호화의 전환점은 더 많은 키 조합을 계산한 순간이 아니라 질문을 바꾼 순간이었습니다.
2026년 7월 개발 기록 기준으로, 실행 중인 프로그램이 실제로 쓰는 SQLCipher raw key 흐름을 따라가자 41개 DB와 141,328개 메시지를 구조화할 수 있었습니다.
4부작 두 번째 편에서는 v2 흐름의 역할과 대화방·사용자 이름을 다시 연결한 과정을 설명합니다.

키를 만드는 공식을 추측하는 대신, 내 PC에서 실행 중인 KakaoTalk이 내 DB를 열 때 실제로 사용하는 키를 검증하는 쪽으로 방향을 바꿨습니다.


세 번 실패한 뒤 무엇을 다르게 봤나

앞선 시도는 모두 하나의 가정에서 출발했습니다.
userId와 고정 값을 알아내면 모든 DB에 쓸 키를 다시 계산할 수 있다는 생각이었습니다.
하지만 현재 설치된 KakaoTalk PC에서는 공개된 구버전 조합이 실제 DB를 열지 못했습니다.
새 가정은 단순했습니다.
프로그램이 대화방 DB를 이미 열었다면 필요한 raw key도 실행 중인 상태 어딘가에서 사용되고 있다는 것입니다.

키 생성 공식을 적은 종이에서 실행 중인 DB 흐름으로 화살표를 돌리는 고정 2D 남성 개발자

728x90


v2 명령 네 개는 어떻게 나뉘었나

한 명령에 모든 일을 넣지 않고 키 복구, DB 복호화, 데이터 통합을 단계별로 분리했습니다.
어디서 실패했는지 확인하기 쉽고, 이미 확보한 키가 있다면 오래 걸리는 복구를 반복하지 않아도 됩니다.

명령 역할
v2recover 현재 열린 본인 DB에 맞는 raw key를 검증해 저장
v2decrypt 저장된 키로 대화 DB를 SQLite로 복호화
v2collect 메시지와 메타데이터를 하나의 DB로 통합
v2sync 기존 키로 복호화와 통합을 다시 실행
python -m kwin v2recover
python -m kwin v2decrypt
python -m kwin v2collect
python -m kwin v2sync

이 명령은 본인 PC와 본인 계정의 로컬 데이터에만 사용해야 합니다.

SQLite 표식 하나가 실제 데이터로 바뀌기까지

키 후보는 많아도 실제 DB를 열지 못하면 의미가 없습니다.
v2recover는 후보를 저장하는 데서 끝내지 않고 현재 chatLogs DB로 검증해 맞는 키만 남기도록 만들었습니다.
최초 성공 기록에서는 41개 DB를 복호화했고 141,328개 메시지를 하나로 모았습니다.
연락처 7,858개, 대화방 509개, 방-멤버 관계 8,016개도 함께 수집됐습니다.
개인적으로는 성공 메시지보다 이 수치들이 더 중요했습니다. 파일 하나를 여는 실험이 실제 요약 자동화에 쓸 데이터 구조로 넘어갔다는 증거였기 때문입니다.

41개 DB가 하나의 통합 메시지 DB로 모이는 것을 확인하며 안도하는 고정 2D 남성 개발자

반응형


메시지만 모아서는 대화가 되지 않았다

chatLogs에는 메시지가 있지만 사람이 알아볼 대화방 이름과 작성자 이름은 다른 메타데이터에 흩어져 있었습니다.
chatListInfo와 rooms 계열에서 chatId와 방 이름을 연결했습니다.
TalkUserDB.sqlite에서는 userId와 로컬에 캐시된 닉네임을 찾고, chatMembers로 방별 참여 관계를 맞췄습니다.

chatLogs → 실제 메시지
rooms·chatListInfo → 대화방 이름
TalkUserDB → 사용자 이름
chatMembers → 방별 참여 관계

이 과정을 거쳐야 숫자로 된 chatId가 실제 대화방 목록으로 보입니다.

메시지와 대화방과 사용자와 멤버 카드를 하나로 연결하는 고정 2D 남성 개발자


오픈채팅 이름은 왜 일부 비어 있을까

복호화가 성공해도 모든 이름이 자동으로 생기지는 않습니다.
chatMembers에 userId가 있어도 KakaoTalk PC의 로컬 캐시에 해당 닉네임이 없으면 오프라인 도구가 이름을 만들어낼 근거가 없습니다.
이 경우 알 수 없는 사용자가 보이는 것은 복호화 실패가 아니라 로컬에 저장된 정보의 한계입니다.
필요한 대화방을 직접 열어두면 해당 방의 키와 메타데이터가 로드될 가능성이 높아졌지만, 없는 정보를 복원한다고 표현해서는 안 됩니다.

이름이 연결된 사용자 카드와 로컬 캐시가 없어 비어 있는 카드를 구분하는 고정 2D 남성 개발자

다음 편에서는 이 명령줄 흐름을 React와 Python 로컬 서버로 감싸 처음 사용하는 사람도 버튼 두 개로 다룰 수 있게 만든 과정을 이어가겠습니다.
 
 

728x90
반응형

관련글 더보기

댓글 영역