Basilica android

sharku.egloos.com



카카오톡 분석하기 (6) - 메시지(대화내용) 복호화 하기 by sharku

이 글을 이해하기 위해서는 [카카오톡 분석하기(1)] 글부터
차례대로 읽으셔야 이해가 됩니다!

또한 이 글을 영리 목적이나 악의적인 목적으로 사용하면
개인적인 처벌이 있을 수 있으니
본인자료 또는 허락된 자료만 사용할 수 있도록 합시다

-------------------------------------------------

ㅠㅠ 이 글을 쓰기위해 이틀정도 코드를 뒤졌습니다...
뒤적뒤적
뒤적뒤적..

드디어 발견했습니다..
리버싱의 길은 역시 험난합니다..

아래 코드가 키포인트였습니다..

기존에 skeleton 부분에 있었던 것은 약간의 낚시성 함수였습니다
실제 암호화와 복호화가 이뤄지고 있는 곳은 바로 util 부분이었습니다.

결론은 아래와 같이
com.kakao.talk.util.n 에 해당하는 파일이 답이었습니다

1. 함수 이해하기
찾아가게 된 경로는 이러합니다..
먼저 이 암호화 함수를 완벽하게 이해해야 합니다..

위에 a와 b에 해당하는 부분은
기본적으로 바뀌지 않습니다.

사용되는 곳도 init 함수(암호화 기능의 초기화)를 쓸때 a 가 사용되고
암호화 키를 만들어낼때 b 가 사용됩니다.

그리고 3번째로 비밀번호와 같은 입력값이 필요합니다
(5)번 글에 있는 함수들이 기본 클래스이고
클래스를 선언 할때 아래와 같이
또 다른 암호화 키를 불러오게 됩니다
이 키는 유동적이지만 복호화와 암호화 할때 동일해야 합니다.

  1. y m = new y(arrayOfByte1);

y라는 클래스가 암/복호화 클래스이며 선언할때 생성자 초기화 값이 필요합니다
그게 arrayOfByte1 부분입니다

2. 함수 찾기
이부분은 함수를 찾기위한 사고과정이기 때문에 다음 챕터로 패스하셔도 됩니다 ㅋ

이제 이 초기화에 필요한 값(키)을 찾기 위해서 어떻게 했느냐

먼저 이 키 값이 따로 저장이 되있을거라는 생각에 한참을 뒤졌습니다
요리저리 message, util, friend, skeleton 등등...
그래도 test 값들만 나오고 정작 원하는 값은 나오지 않았습니다.
여기에 찾아낸 키 값은 두개 입니다
최근 버전 apk 파일에서는 이마저도 없앴더라구요..
그래서 아닌가 보다 싶어서 다르게 생각했습니다.

아마도 키 값을 불러오는 과정을 찾아보자 생각했습니다
그래서 동적 디버깅 환경을 만들려고 디컴파일 하는데
그 과정도 제대로 되지 않았구요..

그래서 할수 없이 클래스들에서 클래스를 찾기로 했습니다.
그래서 message 액티비티들과 friend 액티비티들을 모조리 뒤졌습니다
그리고 값들이 불러와지는 과정들을 찾게된 것이죠
그래서 이 함수를 찾게 된 것이죠..

3. 찾아낸 함수를 분석해보자
[사용한 도구는 jd-gui(java decompiler GUI) 입니다]
  1.     ContentValues localContentValues = new ContentValues();
  2.     String str1 = paramf.j();
  3.     String str2 = paramf.k();
  4.     long l = paramf.i();
  5.     try
  6.     {
  7.       n localn = new n(l);
  8.       str3 = localn.a(str1);
  9.       str4 = localn.a(str2);
  10.       paramf.b(true);
  11.       localContentValues.put("message", str3);
  12.       localContentValues.put("attachment", str4);
  13.       localContentValues.put("v", paramf.F());
  14.       localContentValues.put("id"Long.valueOf(paramf.c()));
  15.       localContentValues.put("type"Integer.valueOf(paramf.d()));
  16.       localContentValues.put("chat_id"Long.valueOf(paramf.h()));
  17.       localContentValues.put("user_id"Long.valueOf(paramf.i()));
  18.       localContentValues.put("created_at"Integer.valueOf(paramf.l()));
  19.       localContentValues.put("client_message_id"Integer.valueOf(paramf.m()));
  20.       return localContentValues;
  21.     }
  22.  

찾아낸 부분은 이부분입니다
여기에서 암호화된 부분은 딱 두부분입니다
message값과 attachment 입니다
두 값은 본 그대로 localn.a 라는 함수에 의해서 암호화 되는것 같이 되어있습니다
str3, str4 값을 만들게 되죠

그래서 n 클래스를 들어가서 a 함수가 어떻게 동작하는지 봅시다
맨 위에 그림파일로 된 소스에 a 함수가 있습니다
간단히 요약하자면 a 함수는 long paramLong 값을
byte[] arrayOfByte1 값으로 바꿔주는 역할을 합니다
long 에서 byte 배열값이죠

곧 키에 필요한 값입니다
그럼 이 키값에 어떤 값을 집어넣느냐 보면

바로 l 이 들어갑니다

l 이 어디서 오냐면 paramf.i() 함수로 불러오는 값입니다
이 값은 선언부를 보면 f paramf 로 값을 불러오고 있습니다
바로 f 클래스값입니다
이제 f 클래스에서 i 함수가 키를 생성한다는 것을 알 수 있습니다

(com.kakao.talk.model.f 클래스입니다)
그래서 i 함수를 들어가보면 허무하게도..
f 값을 불러오고 있습니다..

f 값은 ctrl + F 를 사용해서 "this.f" 로 검색을 합니다

그러면 이런 부분을 찾을 수 있습니다.
p.aS 부분을 불러오고 있음을 알 수 있습니다

p 는 이전에 삽질하면서 알아낸 함수인데
(com.kakao.talk.b.p 입니다)
여기는 skeleton 의 a,b 값(salt와 iv 값)을 사용합니다
그리고 고정된 key 값이 있고 암호화된 함수를 복호화해서 각 변수에 저장합니다.

그 중에 aS 라는 변수에 저장된 값은
L4nIXiH5R+SvY5LILEBxHA== 이며
복호화 된 값은 AutherId 입니다

이걸로도 약간 부족한데
조금 더 검색해보면

이 부분에서 회색부분에

  1. localStringBuilder.append("ChatLog [id=").append(this.a)
    .append(", type=").append(this.c)
    .append(", chatRoomId=").append(this.e)
    .append(", userId=").append(this.f)
    .append(", message=").append(this.b)
    .append(", attachment=").append(this.g)
    .append(", createdAt=").append(this.i);
이렇게 끊어서 보면
userId 부분에 this.f 값이 들어가게 됨을 알 수 있습니다
그래서 f 값은 userId 이며
암/복호화에 쓰이는 값은 userId 임을 알 수 있습니다..

그래서 userId 를 통해 복호화 하면 성공입니다..


4. txt 파일에서 값 가져오기
userId는
sqlite 에 들어가서 .schema chat_logs 를 통해서 보면
카카오톡 대화내용 가져오기 글을 참고하셔요 ㅎ

CREATE TABLE chat_logs (
  _id        INTEGER PRIMARY KEY AUTOINCREMENT,
  id          INTEGER NOT NULL,
  type        INTEGER,
  chat_id     INTEGER NOT NULL,
  user_id     INTEGER,
  message     TEXT,
  attachment  TEXT,
  created_at  INTEGER,
  deleted_at INTEGER DEFAULT 0,
  client_message_id INTEGER,
  v TEXT
);

위 값중에 5번째, message 값 바로 앞에 있다는 것을 알 수 있습니다.
이전에 txt 파일로 빼낸 파일을 열어서
해당하는 message와 user_id 값을 가져오기만 하면 됩니다.
당연한거지만 message 에 따라서 user_id도 달라집니다.


5. 완성.. 복호화!!

다음은 완성된 코드 입니다
제일 많이 변화된 main 함수만 올리겠습니다
y 클래스에서 a,b 값을 5번 글에 있는 salt, password 값에 붙여넣기만 하면 됩니다.




다음은 실행한 결과값입니다.


"오오"라는 글을 복호화했습니다.. ㅋㅋ

이상 장대한 복호화 과정이 마무리되었고
다음에는 이 모든걸 파이썬을 이용해 자동화 파싱을 해보도록 하겠습니다..ㅎ

덧글

  • Ithilien 2013/07/28 20:23 #

    오오오오. 드디어 카톡 대화로그의 백업이 가능해지는건가요. 최종장 기대합니다!
  • sharku 2013/07/30 16:45 #

    네 감사합니다^^
  • ㅠㅠ 2013/07/30 11:33 # 삭제

    N/o4+G1AKM4S/OuQqGpT5w==
    해석해주실수있으신가요..
  • sharku 2013/07/30 16:46 #

    글을 제대로 안읽어보신듯 합니다..
    해당하는 대화내용의 user_id 항목이 있어야 하고
    본인 대화내용이 아닌듯 한데
    타인의 동의 없이 복호화하는 것은 불법입니다.. ㅜ
  • 반가운정보입니다 2013/08/01 23:03 # 삭제

    카카오톡 분석하기1부터 읽었는데 이해가 안됩니다. 월급때문에 카카오톡 대화내용 복구가 필요한데요. 사장이 거짓말을 해서.. 카카오톡 대화내용 sd카드로 내보내기 했는데 실수로 지웠는데 내파일에서는 복구가 안되나요? 이거 너무 어려워서 좌절입니다. 알려줘도 못하네요
  • sharku 2013/08/02 10:53 #

    sqlite 통해서는 db 파일추출 하셨나요? 거기 참조하면 가능합니다
  • vera 2013/08/03 01:51 # 삭제

    갤럭시노트2라 mtp여서 컴퓨터와 연결이 안되고, 어렵고 복구업체에 전화 해야할것 같습니다. 답변 감사드립니다.
  • 궁금남 2013/08/09 21:37 # 삭제

    흠.. 글의 주제에는 살짝 벗어나는데요, 혹 카톡에서 주고 받은 이미지 파일들의 저장 위치 아십니까? 그러니까 수동으로 다운로드 받지 않았을 경우에요. 제가 추측하기로 서버에 있고 로컬에는 저장하지 않는 것 같은데.. 루팅해서 data 디렉터리를 뒤져봐도 별 게 없고.. 주제와 관련 없는 질문 드려 죄송합니다. ^^;
  • sharku 2013/08/19 08:26 #

    이미지 파일들은 서버와 주고받는걸로 알고있습니다 ㅎ
  • TheK 2013/10/18 01:56 # 삭제

    캐시를 지우지 않으셨다면 캐시를 저장하는 디렉터리에 있을 듯 합니다.
  • 궁금이 2013/08/11 13:51 # 삭제

    안녕하세요
    1부터 다 읽어보았습니다 정말 수고많으셨고 고생하셨습니다^^

    근더, 제가 DB파일 열어서 채팅룸 로그 테이블 열어서 보는 수준이라 다 이해는 안되네요 ㅎㅎ
    제가 하고자하는건
    채팅방에 들어가지않고도 대화내용을 보려고 하는건데요
    DB파일만 복호화하면 될거같은데
    님께서 만들실거라는 프로그램만 이용하면
    저혼자서도 가능할까용??
  • sharku 2013/08/19 08:28 #

    가능할거같습니다 ㅋ 그런데 아직은 안만들어봐서 세부 기능은 어떻게 될지는 모르겠네용 요즘 바빠져서 다음글이 언제나올지 저도 기대되네요 ㅋㅋ
  • k333123 2013/08/18 19:12 # 삭제

    올려주신 자료들 덕분에 개인 용도로 사용할 카톡 복호화 프로그램 잘 만들었습니다^^
    감사합니다~
  • sharku 2013/08/19 08:28 #

    네 도움이됐다니 다행이네요 기회가되면 그 프로그램 작성기나 소스를 보고싶군요!!ㅋ
  • k333123 2013/08/19 12:52 # 삭제

    원래 c#을 주로써서 java의 코드를 c#으로 옮기려다 막힐만한 부분들이 좀 있어서^^;
    java코드를 조금 수정해서 키값이랑 암호화 대화 내용을 인자로 넣고 빈칸으로 각 키값 및 대화내용을 나눠서 처리하게 만들고 c#으로는 실제 DB파일 읽어와서 파싱해서 CMD창에서 java코드를 동적으로 실행하는 방식으로 했습니다^^;;; 인자의 길이가 너무 길어지면 java에서 오류가 뜨길래 인자를 300개 항목 정도로 나눠서 넣어주는 처리정도만하고... 밥상에 숟가락 하나 올렸죠뭐^^;;
    아참, 이유는 모르겠지만 특정 문자에서 오류가 나더라구요... 특수 문자 때문인거 같은데...저는 그냥 예외처리로 날려버렸지만...알아두면 좋을듯합니다^^
  • sharku 2013/08/19 14:35 #

    우와!! 감사합니다 ^^
  • 부탁드려요 ㅠ 2013/08/23 19:12 # 삭제

    태그를이용한 간단한 카카오톡실행어플을 만들고있는데요 카카오톡클래스명을 알수있을까요?ㅠ패키지명밖에몰라서..
  • 2013/08/23 19:13 # 삭제 비공개

    비공개 덧글입니다.
  • sharku 2013/08/23 22:35 #

    어떤 클래스를 말하시는지 저두 잘 모르겠습니다 ^^;;
  • 궁금증 2013/08/26 08:42 # 삭제

    혹시 카카오톡에 GPS정보도 들어가있나요??

    카카오톡 구버전보면 GPS정보 저장되었다는 글을 본적이 있어서요.

  • sharku 2013/08/26 12:12 #

    그건 모르겠네요 찾아볼만 하겠네요ㅎㅎ
  • wireless 2013/08/26 21:37 #

    안녕하세요 언제나 블로그 잘보고 있습니다ㅎ

    혹시 복호화 프로그램 만들고 계시나요??

    글 참고해서

    c기반으로 만들려는데 제 전문 분야가 아닌지라 계속 오류가 떠서요 ㅠㅠ

    염치없지만 완성하셨으면 소스코드나 프로그램 공유해 주실수 있나 싶어서요ㅎ
  • sharku 2013/08/27 16:23 #

    요즘 바뻐서 작업을 못하구있는데 완성되면 올려드릴게요 ^^
  • wireless 2013/08/27 20:24 #

    네~기다리고 있겠습니다ㅎ

    혹시라도 무선 쪽에 질문있으시면 언제든 물어보세요!

    너무 도움만 받게되서 저도 도움이 된다면 좋을것 같네요ㅋ
  • 놀랍네요 2013/09/09 17:34 # 삭제

    개인적인 툴 제작에 큰 도움이 되었습니다.

    정말 감사합니다.

    염치 불구하고 하나만 더 여쭤보고 싶습니다.

    Chat_Logs 테이블의 Message 내용은 user_id 가 키값이 되는 반면에,

    Friends 테이블의 내용들은 user_id 로 복호화 되지 않는데, 혹시 다른 키값이 있는것인지요?
  • sharku 2013/09/10 19:04 #

    friend 쪽은 잘 모르겠습니다 ^^;;
    여유가 된다면 파보겠지만 아마도 안할듯싶습니다
    찾으신분이 있으시다면 알려주시면 고맙겠습니다 ㅎ
  • 슬프네요 2013/09/13 00:14 # 삭제

    어흐.. 쉽지가 않네요 ^^;;

    sharku 님이 2 장에서 낚시성 Method 로 파악한 skeleton 쪽 method 가

    Friends 에서 쓰이는 듯 하네요.

    최종적으로 똑같이 util 쪽 message 복호화 method 를 이용하는 건 맞는거 같은데, 그전에

    낚시성 Method 를 이용해서 키값을 만들고 , 이 키값을 util 쪽 복호화 method 키로 쓰는듯 하네요.

    어렵습니다. ㅠㅠ

    진척사항 있으면 더 글 달겠습니다 !
  • sharku 2013/09/14 19:55 #

    카카오톡 3.7.0 버전으로 살펴보시구요 그래야 클래스명을 따라갈수 있습니다

    com.kakao.talk.db.model 에서 aa 클래스가 암호화 하는 클래스구요
    여기도 역시 암호화에는 n 클래스를 사용하구요

    여기에서 key 값이 data 값과 똑같습니다
    전화번호를 암호화 할때 "키값은 전화번호"가 됩니다
    전화번호를 복호화 하려면 상대방 전화번호를 알아야겠죠..

    그리고 중간에 키값을 string 값으로 바꾸는 함수가 있는데
    com.kakao.talk.m 에서 du 클래스를 보시면 됩니다 ^^
    du 클래스는 뭐하는건지 모르겠어서 우선 여기까지만 찾아봤습니다 ㅎ
  • 궁금 2014/05/24 13:53 # 삭제

    올리신 방법대로하면 대화내용 복구할수있을까요?? 정말중요한내용이었는데 대화방을나가서 ....
  • sharku 2014/05/27 19:31 #

    저도 안해봐서 잘 모르겠네요.. 삭제글은 이미 db 파일에서 지워져서 복구가 안된다는 말도 있던데 어렵지 않으니 직접 해보시고 결과 알려주시면 감사하겠습니다~~
  • 깜찍한 둘리 2014/08/11 21:13 #

    안녕하세요

    카톡 db에 암호화로 저장된 친구목록번호들

    이거 다시 번호로 복호화 가능한가요?

    쭉 읽어봤는데 일반인에겐 너무 어렵네요 ㅠㅠㅠ
  • 성격급한 제비갈매기 2014/12/04 02:14 #

    안녕하십니까 sharku님!

    카카오톡 PC DB 1년 전 대화파일을 가지고 있는데 복호화를 못해서 1년 내내 보관만 하고 있습니다.
    .edb 파일 복호화 방법 혹은 프로그램이 있다면 꼭 부탁 드립니다.
    developing@naver.com 입니다. 꼭 부탁드려요..
※ 로그인 사용자만 덧글을 남길 수 있습니다.