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. |
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”);
}
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.
Bàn quyền bài viết từ https://phamhqthanh.wordpress.com
0 nhận xét:
Đăng nhận xét