Basilica android

sharku.egloos.com



카카오톡 분석하기 (7) - 카카오톡 대화내용 파싱 툴 만들기(jython + jar파일) by sharku

이번 챕터가 마지막이 될것같군요..
카카오톡에 대한 흥미가 떨어졌고..
7이라는 숫자를 좋아하기에...ㅋ
다시 카카오톡을 만진다면 GPS 값이나 전화번호부 등등을 뒤지는게 흥미있을것 같습니다.
하지만 안드로이드 커널쪽이나 쉘코드쪽을 먼저 마무리 하고 싶은 생각입니다.

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

본론으로 들어가겠습니다.


먼저 준비사항입니다.
1. jython 설치
이번에 처음 써보지만 자바클래스를 쓸것이기 때문에
자바 기반으로 짜여져있다는 말에 연동이 잘 될 것이라 생각되어 선택되었습니다.
python으로 한다면 C와 java의 어울리지 않은 궁합때문에 왠지 어렵게 돌아갈수도 있을거란 생각이 듭니다.ㅋ

2. jar 파일들(bc provider) 설치하기
5번글의 내용을 참고하시면 됩니다

끝... 간단합니다. ㅋㅋ
jython이라 java 기반이기에 자바는 물론 깔려있어야 합니다!!

아마 간단하게 끝날거 같은데 간단한 만큼 좀 세밀하게 자잘한 것들도 신경써서 만들어보도록 하겠습니다.


1. jython 설치하기
여기 들어가서

요놈을 클릭하시면

jar 파일을 받을 수 있습니다.

우선 java가 환경변수로 등록되어있다는 가정하에
(환경변수 등록은 내컴퓨터>오른쪽클릭>속성>고급시스템설정>환경변수>시스템변수>PATH 에서 설정해주시면됩니다)
다음과 같이 jar 파일이 있는 폴더에서 실행해줍니다.

뭔가 달라진것 같죠?
맞습니다.... 제가 윈7을 깔게되었습니다..ㅋㅋㅋ
흠흠 각설하고

이렇게 되면 아래와 같은 설치창이 뜨게됩니다.

기본 설정들대로 설치해주면 되겠습니다. 다음다음다음다음 을 누르다보면 설치가 완료가 됩니다.
이것도 역시 환경변수에 등록해줍니다.
(꼭 하지 않아도 됩니다
.py 파일을 불러올때 jython 보다 python이 먼저 튀어나오게 되네요
꼭 등록하지 않아도 진행가능합니다..)

등록 후에 실행해보겠습니다..
이것저것 뜨는데 당황하지 마시구요... 다음과 같이 뜹니다.
이렇게 되면 설치 완료입니다.
(처음 실행이라 마구마구 새로운 패키지들을 불러오고 있습니다.)


2. Jython으로 Java 클래스 연동하기

파이썬이 좋은점은 sqlite3를 자체 지원해주지만
자이썬은 plan to do 라고 합니다.. ㅜㅜ
(java기반이기에 이리저리 가능하겠지만 더 복잡해지니 pass)

이렇게 되면 sqlite3의 db파일 내용 추출은 자동화 하지 않고
이미 db파일에서 추출된 txt파일을 파싱해서
복호화 하는 과정을 거치도록 하겠습니다.
먼저 클래스를 불러와서 한개를 시험해보겠습니다.

우선 클래스를 붙여야겠죠
import 해보겠습니다

우선 jar 파일을 공유하겠습니다..


이 파일을
C:\Program Files\Java\[java 버전]\jre\lib\ext\
폴더 안에다 복사만 해주면 됩니다..

아 그리고 win7으로 바뀌면서 64bit로 바꿨습니다.
그래도 다행히 아직 충돌은 없습니다.. ㅎ


붙여넣기 한 다음에 jython을 실행해주면 맨 처음에 jar 파일을 불러오고 있다는 것을 알 수 있습니다.
처음 불러오면 new 라고 뜨는데 저는 수정한 파일이라서 modified 라고 뜹니다..

3. 코딩........

우선 코드를 올립니다.(수정)

아래는 파일입니다

(수정된 파일입니다)

사용하기 편하게 하려고 예외처리와 진행률(%)을 넣다보니 좀 길어졌네요 ㅋ
대화내용이 많아서 진행률을 추가했습니다.. ㅋ

결과적으로 이런식으로 나옵니다

저작자도 추가해봤습니다.. 히힛 쑥스럽군요..ㅋ

(퍼센트만 보시면 아시겠지만 위아래는 다른파일을 작업중입니다.. ㅋ)
추가 설명을 하자면 에러가 뜨는 부분은
라인단위로 읽어오기 때문에
복호화 되지 않는 값들이 있는 라인은 에러가 뜹니다.
예를 들자면 저는 스키마 구조를 추가해놨기 때문에 에러가 떴습니다.
중간에 에러가 뜨더라도 파일이 생성되는건 문제 없으니 걱정 마셔도 됩니다

결과 파일은 talk.csv 라는 파일입니다
쉼표로 구분해놨기 때문에 엑셀등으로 열면 잘 열어질 겁니다.

사용 방법은
별도 경로지정 하면 길어지기에
위와 같이 C:\jython27 폴더에
dec.py
kakao_db.txt(sqlite3 에서 빼온 자료)
두 파일을 같이 둔 상태에서 실행해야 합니다.
그러면 jython27 폴더에 talk.csv 파일이 생성됩니다

제 파일은 총 3만여건의 메시지들이 복호화 되었습니다.

파이썬이나 자이썬이나 비슷하기때문에 추가로 수정이 필요하신분들은 수정해서 쓰셔도 됩니다
출처는 꼭 밝히시구요 ㅋㅋ

이렇게 대화내용 뿌시기 대장정이 막을 내립니다!!! ㅠㅠ

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

엑셀에서 csv 파일을 열어보니 메모장에서는 잘 열리던게 깨져서 나오더군요
인코딩 문제인데..
그래서 수정해서 올렸습니다
csv 파일 첫부분에 문장 하나만 추가했습니다.

그리고 추가로 csv 파일이 열려있을때 에러가 뜨도록 했습니다.


------------------------------------------
130928
안된다하시는분이 몇몇 계셔서
에러 미처리 버전을 추가합니다.


다른분들걸로 해보니 잘 돌아갑니다.
그래서 위 파일을 추가했습니다. 에러메시지가 나오는 버전입니다.
위 파일을 돌려보시고
에러가 뜨는 문구를 답글로 달아주시면 도움 닿는데까지 도와드리겠습니다^^

또 한가지는 위 파일을 돌려보기 전에
제일 큰 문제는 bc provider 만 설치하면 대부분의 문제는 해결될듯 싶습니다.(5번글의 내용을 참고)

핑백

덧글

  • 해탈 혹은 구켠 2013/09/01 01:56 #

    제가 파이썬을 공부중인데... 자이썬(?)이라.. 많이 공부해야겠군요 ㅠ
  • sharku 2013/09/01 04:24 #

    자바 기반이란것 빼곤 문법이 다 똑같아요.. ㅋ
  • 보름달 2013/09/27 01:19 # 삭제

    강자 보고 열심히 공부해보고있습니다.
    그런데 저도 윗분처럼 최종 테스트에서 error 만 계속떠버리네요. ㅜㅜ
    chat_logs 부분에서 파싱할때 데이터 형식이 바뀐거 같은데.. 수정된 버젼은 없는건가요?~
    감사합니다.
  • sharku 2013/09/28 09:36 #

    윗글 제일 아래부분에 추가한 파일 다운받아서 돌려보시고 에러메시지 나오시면 알려주시는대로 살펴봐드리겠습니다^^
  • 초보자 2013/10/06 06:01 # 삭제

    안녕하세요. 카카오톡 친구목록에서 알아야할것이 있어서,
    공부하다가 여기까지왔네요. 이틀가량 블로그에 살다시피하면서,
    설치하고 공부하고 정말 열심히해서, 카카오톡 대화내용추출하고 복호화하는데까지
    성공했습니다!^^ 정말 감사하고요,
    혹시 카카오톡 디비안에 있는 friend 테이블을 복호화 할순없을까요?
    아무리 혼자 해보려고해도 답이 안나오네요..
    카카오톡 관련해서 흥미가 떨어지셧다는건 글을 통해서 알지만,
    혹시나 friend 테이블을 복호화할 방법을 강좌나 만들어서
    보여주시는건 힘들까요?^^;; 지금 몇일째 전전긍긍하고있는데,
    한참 고민하다가 댓글 남겨보았습니다.
    강좌 정말 알차게 잘보았구요, 오늘도 좋은 하루되세요~
  • sharku 2013/10/12 02:19 #

    friend 쪽은 솔직히 좀 어렵네요..
    비슷한거 같으면서도 몇번 봐도 알기 어렵고 해서...
    저도 모른다는게 답이겠네요.. ^^;;
    아쉽겠지만 친구목록은 한번 찾아보셔도 좋을거같습니다. ㅎ
  • 지나가다 2013/10/20 14:10 # 삭제

    Friends 테이블은.. current user의 user-id를 이 글의 방법과 동일하게 padding 하셔서 그걸 IV로 복호화하시면 됩니다. encrypted 된 건지 안된건지 확인하는 routine이 필요하고요, 그 외에는 기술적으로 별로 특이한 부분이 없습니다. current user의 user-id를 추출하는게 문제가 되겠는데.. 이건 kakaotalk.db를 빼오실 줄 아는 분이라면 능히 하실 수 있으리라 믿습니다.
  • 케지드 2013/11/09 13:54 # 삭제

    안녕하세요. 좋은 정보 감사합니다.
    글을 찾다 좋을 글을 보게 되어 쭉 따라해봤는데요. 최종적으로는 안되서 문의 드려 봅니다.

    C:jython2.5.3>jython dec_no_excpt.py kakao_db.txt
    File "dec_no_excpt.py", line 28
    i += 1
    ^
    IndentationError: unindent does not match any outer indentation level

    명령을 실행하고 나면 위와 같은 메시지가 나오는데요.. 어찌해야될지요..
    감사합니다.
  • 잇힝요 2013/12/14 19:18 # 삭제

    들여쓰기 문제입니다. 파이썬을 설치하신후 dec.py 파일을 IDLE 로 열어서 28번째줄의
    i += 1 앞의 모든 공백을 지워주시면됩니다.
  • 조경민 2013/11/09 13:58 # 삭제

    들여쓰기 문제였을까요? 저 에러가 들여쓰기 문제라고 해서 수정했더니 다른 에러나 나와 보니 java.lang.RuntimeException: java.lang.RuntimeException: java.security.NoSuchProviderException: Provider BC not found 나오네요 BC 세팅 함 더 해보고 안되면 다시 여쭤보겠습니다... ㅜㅜ 감사합니다.
  • 조경민 2013/11/09 14:01 # 삭제

    아.. 정상 복호화 되었습니다. 감사합니다..~~~
  • sharku 2013/11/09 22:08 #

    네 잘 되었다니 다행이네요 ㅎ
    어떻게 해결됐는지도 이야기해주시면 감사하겠습니다 ^ㅡ^
  • 조경민 2013/11/10 23:33 # 삭제

    ㅋㅋ 제가 바보처럼 5번 글에서 세팅하는security.provider.#=org.bouncycastle.jce.provider.BouncyCastleProvider
    라인을 jre/lib/security/java.security 파일의 마지막에 그냥 추가해서 안됬더라구요. 해당 라인을 저 위쪽 security.provider 마지막에 추가하고 #표시에 레코드 숫자를 써줬더니 바라 해결됬습니다.;; 혹시 저같은 분 있을까봐 좀 자세히 적어봤습니다.
  • sharku 2013/11/11 18:32 #

    감사합니다 ㅎ
  • 0u0 2013/11/26 03:00 # 삭제

    ImportError: No module named kakao
    이 오류 해결법은 없는건가요?
    jar 파일도 맞게 넣었습니다
  • sharku 2013/11/27 08:16 #

    jar파일이 인식이 안된거같은데 java 폴더가 여러개 있어서 자이썬이 로드를 한곳만 할수도 있습니다

    간단한해결책은 java라고된 폴더밑에 버전별로 모든 ext폴더에 jar파일을 복붙해보시고
    jython으로 자이썬을 실행할때 kakao.jar 모듈을 불러오는지 메시지 확인을 하시면 될겁니다
  • 하이 2013/12/06 20:06 # 삭제

    이건 다른질문인데요 카톡에서 device_uuid가있짢아요 이값은 어떻게생성되는건가요?
  • sharku 2013/12/14 16:32 #

    그 값은 잘 모르겠습니다 ^^
  • 잇힝 2013/12/14 19:21 # 삭제

    dec.py 파일의 들여쓰기 문제를 수정하여 테스트 해 보았더니 정상 복호화는 됩니다.
    다만, db 파일속에 이미 나간 대화방 (즉 삭제된 대화)의 내용은 포함되어 있지 않은것 같습니다.
    복호화 알고리즘은 연구가 되었으니 카카오톡에서 chat log를 임시로 저장하는 디렉토리를 찾아내서 삭제전의 대화내용을 빼와야할것같은데... 흠... 복구서비스를 해주는 회사들도 sharku 님이 연구해내신 알고리즘을 통하여 최종 복호화는 하는것 같은데 db의 임시파일이 어디 저장되는지를 알아내야 삭제된 대화내용도 가져올 수 있겠네요
  • ㅠㅜ 2013/12/28 16:15 # 삭제

    java -jar jython-installer-2.7-b1.jar
    이라고 쳤는데
    자꾸 에러가 났다고 떠요 어떡하죠??
  • 2014/06/10 05:41 # 비공개

    비공개 덧글입니다.
  • 안녕하세요. 2014/06/22 16:32 # 삭제

    반갑습니다.
    카카오톡 대화목록 복호화 잘읽었습니다.^^
  • 안녕하세요 2014/06/23 20:25 # 삭제

    안ㄴ옇세요 제가진짜 급하게 찾는게있어서 그런데 혹시 프랜드 파일을 복호화해서 읽을 순없을까요??
    혹시 도와주실수있으신가요 ㅠㅠ? 정말급하고 꼭찾아야해서 ..
    사람의 아이디를찾고싶은데 안나와서 4일째날밤을새며 찾고있씁니다 도와주실수있으면 메일주소좀 알려주세요 부탁드립니다.ㅠㅠ
  • 파이팅!! 2014/06/28 20:55 # 삭제

    Attribution : sharku (sharku7@gmail.com) by CC
    Package with kakao.jar
    Traceback (most recent call last):
    File "dec_no_excpt.py", line 23, in <module>
    tmp = y.doDec(uid_int,pl)
    at com.kakao.y.de(y.java:81)
    at com.kakao.y.doDec(y.java:98)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

    java.lang.RuntimeException: java.lang.RuntimeException: javax.crypto.BadPaddingE
    xception: pad block corrupted

    에러뜨는데 원인 알 수 있을까요..
    패딩이 잘못됫다는건지..
  • Loverainjh 2014/10/15 17:34 #

    지금도 이 글을 보시려나 모르겠는데 하나 여쭤보겠습니다.
    아이폰과 안드로이드의 대화 sqlite 파일은 비슷한 데
    보니까 구조가 다르네요.
    파일을 백업해 놓은 sqlite의 대화를 복호화 하고 싶은데
    아이폰의 sqlite 파일을 복호화 하려면
    기존 만드신 소스를 어떻게 수정하면 될지 힌트좀 주실 수 있으신가요??
  • 블링블링한 빙하 2014/11/10 21:02 #

    안녕하세요. 저도 바로 위에분과 같은 질문때문에 댓글 남깁니다.
    아이폰에서 백업해놓은 Message.sqlite 파일을 이용하여 복호화 하려고 시도 하였는데
    추출한 대화 형식이 달라서 그런건지
    java.lang.RuntimeException: java.lang.RuntimeException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    에러가 뜨네요.

    대화내용은 sqliteBrowser 를 통해서 추출하였고 형식은 cvs 와 text로 둘다 추출하였습니다.
    cvs 파일은 각 열에 id chatID userID 등등이 정렬되어 있고
    text로 추출할 경우에는 각 문항사이에 | 와 같은 기호를 넣을 수 있는 옵션이 있습니다.

    혹시 소스를 수정해야 한다면 어떤부분에서 어떻게 수정해야 하는지 알 수 있을까요?
    부탁드리겠습니다.

    24213|54738283728236|103413657|1382926251|520096433892327424|2|1|bGnGVs5pINv9jt24EBIheg==|"3VREzj1rTWIYym6FI6TkFILWPU5alMVjts4z+xdXEJ5BW2sDN4AtbPuqN1FufF+w
    kPQk1lxSN5WWkaWun4BMqom0t/wa787etf2/oyo3cGy0hq+Bug/7wGtnU14Dxy8c
    eyUjY0bLIwL1rLDE083pZEDHLPJMponROPUNiDmP7IGmmq2MCBS0a8cx5udZNzXf
    +tdbHJacuQsYqHSf/bblCr+VbqGBPby4ro499ZU1HEvov9CbGQqmlmR5CX4xnlFF
    Efe8AKS5gC+C8/GTfEAQnCxr2rq6zXn7OKIJ1ZNmB1U7z20MYf0KcJFRcbS+iw+o
    1A9vSM4JaNv7A0nubA4Oflg42DcYX/vVrJYQ5BGBEQzJHNdFjjTN0zWbI9pFrUkq
    7rwoxLDAG+U212sDQymQ8peW3ghHFV0WqJE0R/j7W+Y="|404630325.566241|404630326|1|90|120|http://th-m7.talk.kakao.com/th/talkm/oWegc1YpbR/KEEYxRoaCynLJXFEriDVr0/nzdnse5ui1k4_90x120.jpg||||||||"{""cv"":""1.0"",""protocolName"":""IMGREL""}"
    텍스트 파일로 추출할 경우 이런식으로 나옵니다.
  • 깨알같은 얼음왕자 2015/01/08 18:37 #

    안녕하세요.
    몇일째 진도가 안나가네요 ㅠ
    당췌 무엇이 문제 일까요.? 조언좀 부탁드립니다.

    File "dec_no_excpt.py", line 21, in <module>
    uid_int = int<line.split<>'|'[4]>
    ValueError: invalid literal for int<> with base 10: user_id
  • 2015/01/18 16:45 # 비공개

    비공개 덧글입니다.
  • 2016/09/02 21:13 # 비공개

    비공개 덧글입니다.
※ 로그인 사용자만 덧글을 남길 수 있습니다.