轨迹


手机QQ2009聊天记录分析及提取


发布于

这是我的最早一个像程序的程序。

十月十三号用上手机QQ2009了,一看,果然更花哨了。但以前写的手机QQ聊天记录提取程序用不上了,莫办法,重新分析。

一手机QQ2009聊天记录文件的存放位置

C:/System/data/Tencent/QQ/自己的QQ号码/好友的QQ号码/msg.info

假如手机QQ装在E盘的把,上面盘符改成E就是了。

二手机QQ2009聊天记录文件的字符编码

手机QQ2009聊天记录文件的字符编码还是和手机QQ2008聊天记录文件的字符编码一样的,用的是UTF-16

三手机QQ2009聊天记录文件结构分析

和手机QQ2008聊天记录文件不一样了!

注:我用的是十六进制分析

消息分位发送消息和接收消息

发送消息

发送消息的十六进制表示以a8 ??(??表示一个十六进制数)标记开始并以它标记结束,接着用四个字节记录这条消息的序列,接着空出六个字节来,下一个字节是十六进制的80,说明消息是发送消息,从此以后位消息内容,直到,消息结束标记a8 ??。

例如:

发送消息 “不”字的消息的十六进制

a8 024a d5 0a d3 00 00 00 00 00 00800d 4ea8 02

注: a8 02 中的 02 是随机的,但前后统一。

接收消息

发送消息的十六进制表示以a8 ??标记开始并以它标记结束,接着用四个字节记录这条消息的序列,接着空出六个字节来,下一个字节是十六进制的00,说明消息是发送消息,从此以后位消息内容,直到,消息结束标记a8 ??。

接收消息 “不”字的消息的十六进制

a8 064a d5 0a bf 00 00 00 00 00 00000d 4ea8 06

注: a8 06 中的 06 是随机的,但前后统一。

四 提取手机QQ2009的聊天记录

经过分析,提取就简单了。

需要提取手机QQ2009聊天记录的友友可以把你的msg.info文件发给俺:

最后,这是为了师太写的,嘿嘿。

分析有误的地方请指出,一起分享;代码写得差了,请多指教。

补:上网一看,汗,要把手机QQ2008以前聊天记录的导入到手机QQ2009里面来还没人做,俺继续研究,应该不难,手机QQ2008的聊天记录俺有分析及提取的程序,嘿嘿。

下面是提取手机QQ2009聊天记录的Python语言代码:

# Encoding:UTF-8
# FileName:PickupMobileQQ2009Message
# Date:2009_10_14

# from DMQCR.convert import OtoA
# I write this module for convert the expression code to char code

def pickup(path):
    fp = file(path)
    wfp = file(path.replace("info", "txt"), "a")
    while True :
        mark = fp.read(2)  # one message's start and end mark
        if not mark:
            break
        fp.read(10)  # the ten chars are useless for pickup.
        flag = fp.read(1)  # send flag 80 end,00 receive
        message = ""
        while True:
            t = fp.read(2)
            if mark != t:
                message += t
            else:
                message = message.replace("\x20\x00", "")
                message = message.decode("UTF-16")  # if you have some function to convert the expression code to char code,plaese change this line "message=functionname(massage).decode("UTF-16")"
            if "\x80" == flag:
                wfp.write("SEND:" + message.encode("UTF-8") + "\r\n")
                print "SEND: ", message
            else:
                wfp.write("RECEIVE: " + message.encode("UTF-8") + "\r\n")
                print "RECEIVE:", message
            pass  # you can do more
            del message
            break
    fp.close()
    wfp.close()
    del mark, flag, wfp, fp

if __name__ == "__main__":
    print "Running--------"
    pickup("e:\\msg.info")
    print ":-" * 20