Trao đổi với tôi

http://www.buidao.com

7/4/10

[Crypto] Decode archive Yahoo Mesenger

Reflink: http://virusvn.com/forum/showthread.php?p=14847#post14847
Poster: DungCoi

Cái này hồi tháng trước mình có hứa sẽ viết.
Nhưng giờ mình vẫn còn bận đủ thứ nên viết thật lẹ để khỏi bị nói là thất hứa. Cũng khá đơn giản nên mình trình bày vắn tắt.

Archive Yahoo Mesenger : Là chức năng lưu trữ các tin nhắn của YM khi người dùng chat để sau đó người dùng có thể mở ra mà đọc lại

Nơi lưu trữ :
Theo mình tìm hiểu trên máy mình thì YM 10 lưu trữ trên 2 nơi :
Các đường dẫn lưu log :
Quote:
C:\ProgramData\Yahoo!\Messenger\Profiles\Nick người dùng: Ít, thiếu
C:\Users\NguyenDung\AppData\Local\VirtualStore\Program Files\Yahoo!\Messenger\Profiles : Lưu trữ đầy đủ
NguyenDung : User trên máy người dùng

Ở máy bạn, nếu bạn muốn xác định chúng thì mẹo nhanh nhất là search các tên file trong hệ thống bằng string : Nick của bạn

Đặc điểm :
Các logchat lưu theo từng ngày kèm theo tên người dùng mà bạn chat
Ví dụ :
Quote:
C:\Users\NguyenDung\AppData\Local\VirtualStore\Pro gram Files\Yahoo!\Messenger\Profiles\dungcoivb\Archive\ Messages\chanh_levankhtn\20100327-dungcoivb.dat
Mã hóa bằng thuật toán xor

Cấu trúc file log :
Mỗi file log sẽ gồm nhiều cấu trúc xếp lần lượt với nhau tạo thành :



Ở đây :
Date : Thời gian tin nhắn truyền đi hay nhận được (Tính theo giờ phút giây)
Chưa rõ : 4 byte này không rõ là gì, không quan tâm luôn
From : Gồm 2 giá trị
0 : Nội dung bạn gửi
1 : Nội dung đứa còn lại gửi


Len : Độ dài phần nội dung
Nội dung : Lấy theo độ dài từ Len
4 byte NULL để kết thúc từng struct

Cách thức giải mã :
1. Đọc lấy ra từng khối dữ liệu như struct trên
2. Do dữ liệu chỉ bị mã hóa ở Nội dung, nên chúng ta chỉ cần tìm cách giải mã nó

Các bạn có thể xem đoạn code sau :
Quote:
Private Function decodeArchive(ByVal strUserName As String, ByVal strBody As String) As String
Dim lCount As Long
Dim strRet As String

Dim lCountUser As Long
lCountUser = 1

strRet = ""
For lCount = 1 To Len(strBody)
strRet = strRet & Chr(Asc(Mid(strBody, lCount, 1)) Xor Asc(Mid(strUserName, lCountUser, 1)))

lCountUser = lCountUser + 1
If lCountUser > Len(strUserName) Then
lCountUser = 1
End If
Next
decodeArchive = strRet
End Function
Mình sẽ giải thích như sau :
Cho chuỗi strBody là phần Nội dung
strRet là chuỗi kết quả giải mã (Nội dung ban đầu)
(Cho vị trí của mảng bắt đầu từ vị trí 1)
Cho chuỗi strUserName là nick của bạn

strRet[1] = strBody[1] Xor strUserName[1]
strRet[2] = strBody[2] Xor strUserName[2
strRet[3] = strBody[3] Xor strUserName[3]
strRet[4] = strBody[4] Xor strUserName[4]
strRet[n] = strBody[n] Xor strUserName[5][m]

Bạn chú ý, giá trị cần Xor chỉ đếm tới bằng độ dài User Name (Ở đây là Len(strUserName))
Sau đó sẽ trở lại giá trị 1, rồi cứ thế lại đếm lên

Ví dụ : strUserName = "dung"
strRet[1] = strBody[1] Xor strUserName[1]
strRet[2] = strBody[2] Xor strUserName[2]
strRet[3] = strBody[3] Xor strUserName[3]
strRet[4] = strBody[4] Xor strUserName[4]
strRet[5] = strBody[5] Xor strUserName[1]
strRet[6] = strBody[6] Xor strUserName[2]
strRet[7] = strBody[7] Xor strUserName[3]
strRet[8] = strBody[8] Xor strUserName[4]
...

Nếu trình bày : strRet[n] = strBody[n] Xor strUserName[m]
ở đây cũng có thể thi gọn đơn giản bằng công thức :
m = n mod (Len(strUserName) +1)

Hay
strRet[n] = strBody[n] Xor strUserName[n mod (Len(strUserName) +1)]


Mình có đính kèm bên dưới là source (Trên VB6) mình viết để minh họa, mình viết bằng VB6 nên không hiển thị Unicode được, các bạn thông cảm
Bạn lưu ý chỉnh lại mà dùng cho thích hợp



Tham khảo :
http://rongchaua.net/security-mainme...archive-decode

File được đính kèm
Kiểu file:  zip Yahoo Archive.zip‎ (6,0 KB, 1 xem)