十月十三号用上手机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 02 4a d5 0a d3 00 00 00 00 00 00 80 0d 4e a8 02
注: a8 02 中的 02 是随机的,但前后统一。
接收消息
发送消息的十六进制表示以a8 ??标记开始并以它标记结束,接着用四个字节记录这条消息的序列,接着空出六个字节来,下一个字节是十六进制的00,说明消息是发送消息,从此以后位消息内容,直到,消息结束标记a8 ??。
接收消息 “不”字的消息的十六进制
a8 06 4a d5 0a bf 00 00 00 00 00 00 00 0d 4e a8 06
注: a8 06 中的 06 是随机的,但前后统一。
四
提取手机QQ2009的聊天记录
经过分析,提取就简单了
下面是提取手机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
最后,这是为了师太写的,嘿嘿。
分析有误的地方请指出,一起分享;代码写得差了,请多指教。
补:上网一看,汗,要把手机QQ2008以前聊天记录的导入到手机QQ2009里面来还没人做,俺继续研究,应该不难,手机QQ2008的聊天记录俺有分析及提取的程序,嘿嘿。