Phân tích code và keygen chương trình viết bằng VB.NET (VS.NET)   29 comments


Phân tích code và keygen chương trình viết bằng VB.NET (VS.NET)

 Công việc crack thường âm thầm và lặng lẽ, thất bại thì uất ức nhưng không bộc bạch tỏ bày, thành công thì thường sẻ chia, đúng theo nguyên lý niềm vui san sẻ sẽ được nhân đôi. Có thể lúc bạn đang say giấc thì chính tôi lại một mình bên chiếc máy tính mày mò lạch cạch để khám phá những bí ẩn đằng sau ổ khoá active, đơn giản là nhà sản xuất làm ra ổ khoá và chúng ta là người phải tìm ra chìa khoá. Vừa rồi mấy cụ bên CIN1TEAM có nhã ý y/c viết vài bài về XXX nhưng không được đụng chạm đến hàng “made in vietnam”, thiết nghĩ trước giờ mình chưa mò đến cái hàng nhập ngoại nên cũng lúng túng, thôi thì mình làm cái Vietnam simple để đơn giản.
I. Việc đầu tiên là tìm address kiểm tra mã số nhập vào. Hàm kiểm tra của em nó đây:

Private Shared Function kiemtrabanquyen(ByVal string_1 As String, ByVal string_2 As String) As Boolean
1.    Dim num As Long = 0     
2.    Dim num2 As Integer = (string_1.Length - 1)   
3.    Dim i As Integer = 0    
4.    Do While (i <= num2)    
5.        If (((i Mod 2) = 0) Or (Conversions.ToDouble(string_1.Substring(i, 1)) = 0)) Then
6.            num = (num + Conversions.ToInteger(string_1.Substring(i, 1)))
7.        Else                             
8.             num = (num * Conversions.ToInteger(string_1.Substring(i, 1)))
9.        End If      
10.        i += 1     
11.    Loop   
12.    Dim str As String = (Conversions.ToLong(string_2) - num).ToString
13.    Dim num7 As Integer = Conversions.ToInteger(str.Substring(0, 1))
14.    Dim startIndex As Integer = 1
15.    If (((num7 = 1) Or (num7 = 4)) Or (num7 = 7)) Then
16.        startIndex = 1
17.    End If
18.    If (((num7 = 2) Or (num7 = 5)) Or (num7 = 8)) Then
19.        startIndex = 2
20.    End If
21.    If (((num7 = 3) Or (num7 = 6)) Or (num7 = 9)) Then
22.        startIndex = 3
23.    End If
24.    str = str.Substring(startIndex, 7)
25.    If (str.Substring(0, 2) <> str.Substring(5, 2)) Then
26.        Return False // =>Kết quả sai rồi.
27.    End If
28.    Return (str.Substring(0, 2) = "11")
End Function
Tổng cộng 28 dòng

II. Phân tích code:
Private Shared Function kiemtrabanquyen(ByVal string_1 As String, ByVal string_2 As String) As Boolean
// string_1 là mã số kiểm tra (tự phát sinh), string_2 là mã bản quyền được nhập vào(do nhà cung cấp cấp cho bạn)
1.    Dim num As Long = 0     
        //Khởi tạo biến số num có giá trị = 0
2.    Dim num2 As Integer = (string_1.Length - 1)   
        //Khởi tạo biến số num2 có giá trị = chiều dài của mã số kiểm tra – 1
3.    Dim i As Integer = 0    
        //Khởi tạo biến số i có giá trị = 0
4.    Do While (i <= num2)     //Vòng lặp, điều kiện i<= num2
5.        If (((i Mod 2) = 0) Or (Conversions.ToDouble(string_1.Substring(i, 1)) = 0)) Then
                //Nếu số dư của phép chia: i/2 = 0 hoặc giá trị thứ i của dãy số string_1 = 0 thì
6.            num = (num + Conversions.ToInteger(string_1.Substring(i, 1)))
               //num = num + số thứ i của dãy số string_1
                //Như vậy nếu ký tự ở vị trí chẳn thì num sẽ được cộng dồn thêm giá trị thứ i
               //còn nếu giá trị thứ i = 0 thì không làm thay đổi biến num
7.        Else                 Ngược lại nếu không thoả mã điều kiện trên thì:
8.            num = (num * Conversions.ToInteger(string_1.Substring(i, 1)))
               //num = num nhân với số thứ i
9.        End If       //kết thúc điều kiện
10.        i += 1      //Giá trị i được tăng thêm 1
11.    Loop    //kết thúc vòng lặp

12.    Dim str As String = (Conversions.ToLong(string_2) - num).ToString
        //Khởi tạo biến chuỗi str có giá trị = con số string_2 - num
13.    Dim num7 As Integer = Conversions.ToInteger(str.Substring(0, 1))
        //Khởi tạo biến số num7 có giá trị bằng giá trị ở vị trí đầu tiên của chuỗi str
14.    Dim startIndex As Integer = 1
        //Khởi tạo biến số startIndex có gia trị = 1
15.    If (((num7 = 1) Or (num7 = 4)) Or (num7 = 7)) Then
        //Nếu num7 = một trong các con số 1 hoặc 4 hoặc 7 thì
16.        startIndex = 1
17.    End If
18.    If (((num7 = 2) Or (num7 = 5)) Or (num7 = 8)) Then
        //Nếu num7 = một trong các con số 2 hoặc 5 hoặc 8 thì
19.        startIndex = 2
20.    End If
21.    If (((num7 = 3) Or (num7 = 6)) Or (num7 = 9)) Then
        //Nếu num7 = một trong các con số 3 hoặc 6 hoặc 9 thì
22.        startIndex = 3
23.    End If

24.    str = str.Substring(startIndex, 7)
        //Chuỗi str = lấy chuỗi str từ vị trí startIndex, lấy 7 ký tự
25.    If (str.Substring(0, 2) <> str.Substring(5, 2)) Then
        //Nếu 2 ký tự từ vị trí đầu tiên khác 2 ký tự ở vị trí thứ 5 thì
26.        Return False // =>Kết quả sai rồi.
27.    End If
28.    Return (str.Substring(0, 2) = "11")
        //Nếu 2 ký tự đầu là 11 thì cho kết quả đúng, ngược lại chưa đúng.
End Function

III. Lấy ví dụ chạy thử:

string_1 = “1234567890”, length = 10

string_1

1

2

3

4

5

6

7

8

9

0

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

string_2 = “9876543210”

=> kiemtrabanquyen(“1234567890”, “9876543210”)

1.    num = 0 
2.    num2 = 10-1 = 9
3.    i = 0   
4.    Do While (i <= num2)     từ 0 đến 9 (lặp 10 vòng)
5.        If (((i Mod 2) = 0) Or (Conversions.ToDouble(string_1.Substring(i, 1)) = 0)) Then
6.            num = (num + Conversions.ToInteger(string_1.Substring(i, 1)))
7.        Else                             
8.             num = (num * Conversions.ToInteger(string_1.Substring(i, 1)))
9.        End If      
10.        i += 1     
11.    Loop    

4.1                   Lần 1 thì i= 0, thoả mãn điều kiện số dư 0/2 = 0 nên num = num + ký tự thứ 0 = 0+1=1
4.2                   Lần 2thì i=1, num =num* ký tự thứ 1  = 1*2 = 2
4.3                   Lần 3 thì i= 2, thoả mãn điều kiện số dư 0/2 = 0 nên num = num + ký tự thứ 2 = 2+3=5
....
4.10    lần 10 thì i= 9, Vì ký tự thứ 9 thoả mãn điều kiện số dư 0/2 = 0 nên num không thay đổi, num = 1265

12.    str  = chuỗi của 9876543210 – 1265 = “9876541945”
13.    num7 = 9
14.    startIndex = 1
15.    If (((num7 = 1) Or (num7 = 4)) Or (num7 = 7)) Then
16.        startIndex = 1
17.    End If
18.    If (((num7 = 2) Or (num7 = 5)) Or (num7 = 8)) Then
19.        startIndex = 2
20.    End If
21.    If (((num7 = 3) Or (num7 = 6)) Or (num7 = 9)) Then
22.        startIndex = 3
        Thoả mãn điều kiện này
23.    End If
=> Đến lúc này startIndex = 3
24.    str = str.Substring(3, 7) = “9876541945”. Substring(3, 7) = “6541945”
25.    If (str.Substring(0, 2) <> str.Substring(5, 2)) Then
                str.Substring(0, 2) =”65”
                str.Substring(5, 2) =”45”
26.        Return False // =>Kết quả sai rồi, trả kết quả ngay thời điểm này.
27.    End If

28.    Return (str.Substring(0, 2) = "11")

IV. Tiến hành keygen:

VD: giải một phương trình đơn giản: a + x =b

=>x = b-a

Vậy ta phải bắt đầu từ đâu?

Giả sử ẩn số có 10 ký tự là “ABCDEFGHIJ”

string_2

A

B

C

D

E

F

G

H

I

J

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

Theo phương trình trên thì ta phải lội ngược dòng để tìm ẩn số.

1. Tại dòng 28:     str.Substring(0, 2) = “11”, vậy là đã hình thành được 2 ký tự là “11”

Phác thảo lần 1 ta được:

string_2

1

1

C

D

E

F

G

H

I

J

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

2. Tại dòng 25:  str.Substring(0, 2) = str.Substring(5, 2),  như vậy ký tự thứ 0 và thứ 1 phải bằng ký tự thứ 5 và thứ 6

Phác thảo lần 2 ta được 4/10 ký tự:

string_2

1

1

C

D

E

1

1

H

I

J

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

3. Phân tích trong các module tiếp theo được biết: str.Substring(2, 3) = số ngày tối đa được sử dụng

Vậy ta cho 3 con số này là “999” cho nó đẹp.

Phác thảo lần 3 ta được 7/10 ký tự:

string_2

1

1

9

9

9

1

1

H

I

J

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

4. Ở lần chạy thử ở trên, ta cho ký tự đầu tiên là 9, dòng 22 ta có startIndex = 3, và dòng 24 cho kết quả là 7 ký tự cuối

Vậy ta phải chỉnh lại chuỗi string_2 như sau:

string_2

9

B

C

1

1

9

9

9

1

1

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

Vậy là chuỗi được hình thành 8/10 ký tự, hai ký tự còn lại không có hàm nào kiểm tra, ta cho giá trị là random.

5. Xem lại dòng 12: str =  string_2  – num

num ta có rồi, như ví dụ trên, nếu string_1 = “1234567890” thì khi kết thúc vòng lặp ở dòng 11 ta có num = 1265

Như vậy chuỗi string_2  ta mới hình thành chỉ là chuỗi str

Str

9

B

C

1

1

9

9

9

1

1

Vị trí Ký tự

0

1

2

3

4

5

6

7

8

9

Tiến hành tìm chuỗi string_2 thực sự:

str =  string_2  – num => string_2 = str+num

=>string_2 =  9BC1199911 +1265

Đến đây dãy số bản quyền đã hoàn toàn hình thành.

6. Từ  dòng 15 đến dòng 23, kiểm tra ký tự đầu tiên có các điều kiện khảo sát từ 1 đến 9 (không có điều kiện là số 0)

Vậy ký tự đầu tiên là ranrom(Từ 1 đến 9).

V. Viết code keygen:

Imports Microsoft.VisualBasic.Strings
Imports Microsoft.VisualBasic.CompilerServices
Public Shared Function TAOKEY(ByVal string_1 As String) As String

Dim num As Integer = 0

Dim bq As String = "1199911"      ‘Giá trị kiểm tra cần thiết

Dim num2 As Integer = (string_1.Length - 1)

Dim i As Integer = 0

Do While (i <= num2)

If (((i Mod 2) = 0) Or (Conversions.ToDouble(string_1.Substring(i, 1)) = 0)) Then

num = (num + Conversions.ToInteger(string_1.Substring(i, 1)))

Else

num = (num * Conversions.ToInteger(string_1.Substring(i, 1)))

End If

i += 1

Loop

Dim random As New Random

Dim x1 As String = random.Next(100, 900).ToString

Dim x2 As Integer = (InStr("123456789", x1.Substring(0, 1)) + 2) Mod 3

Dim x3 As String = (x1.Substring(0, 1) & x1.Substring(1, x2) & bq & Right(x1, 2 - x2))

Return Format(Val(x3) + num, "0000000000")

End Function

C# (dùng google translate để dịch nên ko biết lỗi phải thế nào, tự chỉnh code nhé)

using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
public static string TAOKEY(string string_1)
{
int num = 0;
string bq = “1199911”;
int num2 = string_1.Length – 1;
for (int i = 0; i <= num2; i++)
{
if (((i % 2) == 0) | (Conversions.ToDouble(string_1.Substring(i, 1)) == 0.0))
{
num += Conversions.ToInteger(string_1.Substring(i, 1));
}
else
{
num *= Conversions.ToInteger(string_1.Substring(i, 1));
}
}
Random random = new Random();
string x1 = random.Next(100, 900).ToString();
int x2 = (Strings.InStr(“123456789”, x1.Substring(0, 1), CompareMethod.Binary) + 2) % 3;
return Strings.Format(Conversion.Val(x1.Substring(0, 1) + x1.Substring(1, x2) + bq + Strings.Right(x1, 2 – x2)) + num, “0000000000”);
}

Vì kiến thức có hạn, rất mong nhận được nhiều ý kiến đóng góp của các bạn.

Posted 08/03/2012 by phamhqthanh in Tool

29 responses to “Phân tích code và keygen chương trình viết bằng VB.NET (VS.NET)

Subscribe to comments with RSS.

  1. Anh thanh bây giờ mới trưng bày ra hở! ae vô xơi nào!😀

  2. Rất cảm ơn bác!

  3. Ặc,… Bác chia sẻ thế này thì quá quý rồi. Vấn đề này đau đầu biết bao nhiêu AE mới bước đầu tập tành crack!? Từ nay Bác mở luôn box Crack cho AE có chỗ trao đổi luôn thì tốt quá….

    Cảm ơn Bác nhiều nhiều….

  4. Em ngu dốt nên chưa hề biết gì về crack chỉ ăn theo các bác, bây giờ bác mở chủ đề này em hoan hô quá chừng, có thể em sẽ học được nhiều thứ từ đây,mặc dù với người khac thì dễ còn với em thì khó khăn vô cùng vì em chưa biết tý gì về key, code,…
    Chúc bác nhiều sức khỏe, bằng an trong chúa.

  5. Hăy lắm bác thanh ơi, thế là lại có điều kiện học tập rồi, cám ơn bác đã chia sẽ cùng anh em, những nguời không chuyên về tin học đựợc mở mang thêm tầm mắt

  6. Hoan hô bác Thanh, cám ơn bác rất nhiều. chuyến này chắc phải khăn gói đi học khóa lập trình cơ bản cho rồi. Luôn tiện bác cho em hỏi bây giờ em muốn học thì nên học bằng ngôn ngữ gì đầu tiên thế bác? đừng cười em nha.

  7. @Nguoi hue: ..Net là nền tảng của hiện tại và trong tương lai!

    Vì vậy nếu bạn đả học qua VB6.0 thì nên học VB.Net

    Tớ thì tớ thích C# hơn!😀

    cchangkhongayngo
    • @cchangkhongayngo: Hôm nào qua nhà chú chỉ vài chiêu về c# nhé, mình thấy cái c# nó khó hiểu quá.
      Xem ra các chú vẫn khoái khẩu món mì ăn liền, không ai thèm đánh giá code nhỉ, có lỗi gì hay ko, code thế nào cho đơn giản …?

  8. Cái đoạn này: Dim x3 As String = (x1.Substring(0, 1) & x1.Substring(1, x2) & bq & Right(x1, 2 – x2)) phải thêm vào chữ strings. trước chữ right
    nó như thế này:
    Dim x3 As String = (x1.Substring(0, 1) & x1.Substring(1, x2) & bq & Strings.Right(x1, 2 – x2))

  9. Đánh giá gì anh??😀

    Hiểu mới code dc chứ! ko hiểu hướng làm sao mà code dc!

    keke! reflector có nhiều ngôn ngữ đó anh, xem = C# là hiểu thôi mà!

    cchangkhongayngo
  10. Mình xin góp một đoạn code của chương trình mcscanner 2011 của anhquansoft các bạn phân tích
    Private Sub pmtdangky_Click(ByVal sender As Object, ByVal e As EventArgs)
    If Not PubVars.IsValid Then
    If (Me.txtSerial.Text.Trim.Length < 15) Then
    MsgBox.Show(MyBase.GetString("msg-serial", "Số đăng ký không hợp lệ!"), PubVars.ProNameBrief) (nếu chuỗi serial nhỏ hơn 15 ký tự thì thông báo số serial không đúng)
    Me.txtSerial.Focus
    Return
    End If
    Dim strCtrl As String = FreeImage.RandString (tạo chuỗi strCtrl từ hàm tạo chuỗi ngẫu nhiên)
    If (Register.FWR("mcscanner", Me.txtSerial.Text, "CLSID\E9337934-7AA2-46A8-BEF9-1C59DBB3F865") AndAlso FreeImage.ToCmp(strCtrl).Equals(FreeImage.FVX("mcscanner", strCtrl))) Then
    MsgBox.Show(MyBase.GetString("msg-succ", "Bạn đã đăng ký thành công"), PubVars.ProNameBrief) (so sánh 2 hàm tạo chuỗi xem có bằng nhau không nếu bằng nhau thì thông báo thành công)
    PubVars.fMain.Text = PubVars.fMain.Text.Replace(("*****" & MyBase.GetString("MainForm", "demotext", "B" & ChrW(7843) & "n Ch" & ChrW(7841) & "y Th" & ChrW(7917)) & "*****"), "")
    PubVars.IsValid = True
    Else (ngược lại)
    MsgBox.Show(MyBase.GetString("msg-serial", "S" & ChrW(7889) & " " & ChrW(273) & ChrW(259) & "ng k" & ChrW(253) & " kh" & ChrW(244) & "ng " & ChrW(273) & ChrW(250) & "ng!"), PubVars.ProNameBrief)
    Me.txtSerial.Focus
    End If
    End If
    Register.SetLicense(Me.txtOffice.Text.Trim, Me.txtName.Text.Trim) (thiết lập thông số đăng ký cho phần mềm)
    MyBase.DialogResult = DialogResult.Yes
    End Sub

    Hàm FWR được Import từ file PmtSoftPp.dll)
    _
    Public Shared Function FWR(ByVal pProductID As String, ByVal pSerial As String, ByVal pRegKey As String) As Boolean
    End Function

    Hàm ToCmp(str)
    Public Shared Function ToCmp(ByVal sRand As String) As String
    Dim array As Char() = sRand.ToCharArray
    Array.Reverse(array)
    Dim str As New String(array)
    Return (str & “True”)
    End Function

    Hàm FVX
    Public Shared Function FVX(ByVal pProductID As String, ByVal strCtrl As String) As String
    Dim str As String = FreeImage.FVXv3(pProductID, “CLSID\E9337934-7AA2-46A8-BEF9-1C59DBB3F865”, strCtrl, 0)
    Dim num As Integer = str.LastIndexOf(“False”)
    Dim num2 As Integer = str.LastIndexOf(“True”)
    If ((num <= 0) OrElse (num2 num2) Then
    Return str.Substring(0, (num + 5))
    End If
    Return str.Substring(0, (num2 + 4))
    End Function

    Bạn nào có thể tạo ra keygen không?

  11. Bây giờ em mới bắt đầu nghiên cứu Vb6.0 đây bác Thanh ơi.
    BÁc có bản Setup VB.Net Full ko cho em với.
    Em đang gom tài liệu để nghiên cứu cái này đã.
    Em lấy mục tiêu là xxx của bác đấy. Ko thì em cũng chẳng nghiên cứu về cái này.
    Mỗi lần mà dùng Hx lấy key mất thời gian quá
    Cảm ơn bác nhiều.

  12. Chưa đủ trình độ code keygen thì phải dùng hẽ chứ sao, lâu cũng đựơc chứ, code keygen co nguơi nghiên cứu hàng tháng, có nguợi một vài ngày, muốn code đựợc keygen thì phải học về lập trinh trứớc đã, học toán học rời rạc cho tốt, và quan trọng là phải có bộ óc tư duy, hi,,
    viết thế có sai mong các bác đừng chém nhé.

    • Mình học toán rời rạc rồi. (không dấu gì bác. Em đang dạy món đó cho các trường ĐH và Cao đẳng)
      bên Bách khoa Hà Nội mình học ngày xưa ko dạy VB chỉ học Pas, Fox, Hợp ngữ thế thôi)

  13. Thế bác hoada2000 la giảng viên ah. hay nhỉ, minh mới làm quen tin thui, ngày xưa cũng có học pascal, hợp ngữ thì chưa biết, chỉ làm theo tut thui, mon đuợc học bác thanh và bác hoada2000 nhiều, mới ti toe học xxx

  14. Quan trọng là làm thế nào mà bác lại có được mã nguồn vậy ?
    Cảm ơn bác nhiều

  15. hay quá, bác thanh làm vài mov tut đi🙂

  16. cho hỏi nếu goi hàm hai lần trong sub và funsion có gì khác nhau .cho ví dụ nha

  17. Mình đã dùng code của bạn Thanh (keygen cafeclick) nhưng khi chạy lấy key, nhập vào thì ko được toàn báo sai key… có thể giải thích giúp tại sao không đúng được không? Hay là nó chỉ đúng cho Cafeclick 7 bản đầu tiên? email của mình: dahogiang@yahoo.com

  18. Chiến binh nào có file keygen tặng chiến hữu qua email dahogiang@yahoo.com được không?
    Xin hậu tạ trước. Nếu có file cafeclick setup đi kèm thì quả là đại phúc, đại phúc.
    Đa tạ trước.

  19. Cho mình file keygen của CafeClick 7.0
    Mail mình là: uidanoob@gmail.com
    Chân thành cảm ơn các quý ân nhân tận tình giúp đỡ

  20. Mình cần CafeClick 7.0

  21. hay qua. Muon hoc ma minh lai dot qua

  22. hix, sao em nhìn zô thấy loạn xạ vậy trời😦

  23. Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
    If (Me.openFileDialog_0.ShowDialog = DialogResult.OK) Then
    Try
    Dim reader As New StreamReader(Me.openFileDialog_0.FileName)
    Dim cipherText As String = reader.ReadLine
    Dim str2 As String = reader.ReadLine
    Dim str3 As String = reader.ReadLine
    cipherText = GioiThieu.LayMaBanQuyen(cipherText, “liem9000”)
    str3 = GioiThieu.LayMaBanQuyen(str3, “liem9000”)
    reader.Close
    If ((Form1.static_TenCongTy = cipherText) AndAlso (Form1.int_BanQuyen 1)) Then
    Dim str4 As String = String.Concat(New String() { “Update tb_BanQuyen Set us_BanQuyen =’2′,us_MaKichHoat='”, str2, “‘,us_NgayHetHan='”, str3, “‘ where us_MaDangKi='”, Form1.static_str_MaDangKi, “‘” })
    Me.class0_0.method_7(str4)
    Me.txt_NgayHetHan.Text = str3
    Me.int_1 = 2
    Me.txt_PhienBan.Text = “Phiên Bản Trả Phí”
    Else
    Me.method_1(“Key này không có giá trị.”, “”, “”, “”, “”, “”, “Thoát”, 350, &H93, False)
    End If
    Catch obj1 As Object
    End Try
    End If
    End Sub
    (Key demo có dạng CAFEL-7D296-76D94-3E7A5-AABAA)
    Bác nào vui lòng chỉ cho em cách phân tích để tạo key file (*.key) với code này nhé. Thấy code này nhìn sơ qua cũng đơn giản với các cao thủ nhưng mà với em là khó (tại không biết về lập trình căn bản). Các bác ngâm cứu thử nhé. Thank mọi người

    Trần Tấn Đức

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: