hỏi về giải thuật phá pass (1 người xem)

  • Thread starter Thread starter gintano1
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

gintano1

Thành viên mới
Tham gia
27/7/14
Bài viết
22
Được thích
0
chào các bác, em đọc trên mạng có đoạn code vba phá pass file excel như này mà em không hiểu họ dùng giải thuật gì, nôm na có thể nói là thử từng password nhưng các biến cho chạy từ 65 - 66 hơi khó hiểu, các bác có thể giải thích giúp em được không
Sub PasswordBreaker()
If ActiveSheet.ProtectContents = False Then
MsgBox "Sheet '" & ActiveSheet.Name & "' is unprotected!", vbInformation
Else
If MsgBox("Sheet '" & ActiveSheet.Name & "' is protected, do you want to unprotect it?", _
vbYesNo + vbQuestion, "Unprotect Active Sheet") = vbNo Then Exit Sub
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
If ActiveSheet.ProtectContents = False Then MsgBox "Sheet '" & ActiveSheet.Name & "' is unprotected!", vbInformation
End If
End Sub
 
Thử thay chỗ:
PHP:
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
thành:
PHP:
MsgBox Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
xem thế nào...
 
Upvote 0
Thử thay chỗ:
PHP:
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
thành:
PHP:
MsgBox Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
xem thế nào...
Bác muốn chủ thớt gãy tay à. Suối vậy dễ sóc lắm. Sao không ghi vào ô trong sheet cho khỏe.
 
Upvote 0
Thử thay chỗ:
PHP:
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
thành:
PHP:
MsgBox Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
xem thế nào...
ý em là em thấy hàm chr() trả về ký tự theo mã ASCII, mà 65 - 66 là A và B, vậy thì code này có vấn đề không, e thử mở bằng code này thì vẫn đc
 
Upvote 0
Bị lừa hết roài chăng?

Thớt giải thuật phá pass thành ra code phá pass.
Giài thuật = code? . Chắc chả phải.
Nhậu = Xỉn? . Chắc chả phải.

Xỉn cả roài chăng? Hay thiệt
 
Upvote 0
Bị lừa hết roài chăng?

Thớt giải thuật phá pass thành ra code phá pass.
Giài thuật = code? . Chắc chả phải.
Nhậu = Xỉn? . Chắc chả phải.

Xỉn cả roài chăng? Hay thiệt
code này chạy được anh ạ, ý em muốn hỏi là tại sao các con số của biến i j k l m chạy từ 65 đến 66 anh ơi
 
Upvote 0
code này chạy được anh ạ, ý em muốn hỏi là tại sao các con số của biến i j k l m chạy từ 65 đến 66 anh ơi
Thớt này tiêu đề nói về giải thuật không phải nói về code nên chịu, trả lời về code chắc bị lạc đề.
Giải thuật thì tui làm đơn giản thôi:
C1: Cài thêm 1 cái "pát ô pen phai", rồi mới chủ nhân "phai" đó đến mà mở. Không mở được thì bạn không phải dùng nữa. Khỏe re như bò kéo xe.//**/--=0
C2: Gọi chủ nhân file đó đến, dùng "ô pen óp phích" hiệu chỉnh cái đó cho chủ nhân "phai" đó phải đi mua kính chống lác. Chủ nhân đó tốn tí $ nhưng làm cho tiền tệ được lưu thông làm kinh tế đất nước thêm tăng trưởng, giúp ích cho xã hội. Rất đáng hoan nghênh./-*+/:clap:
 
Upvote 0
Hình như tác dụng của đoạn code này là làm rối loạn cơ chế protect của Excel để cưỡng bức nó phải unprotect chứ không phải thử khớp mật khẩu.

Bạn thử thêm lệnh để ghi pass cuối cùng ra cell nào đó thử coi có phải là BBBBBBBBBBB~ không nhé. Tất nhiên đó không phải là pass bạn đặt để protect.
 
Upvote 0
Hình như tác dụng của đoạn code này là làm rối loạn cơ chế protect của Excel để cưỡng bức nó phải unprotect chứ không phải thử khớp mật khẩu.

Bạn thử thêm lệnh để ghi pass cuối cùng ra cell nào đó thử coi có phải là BBBBBBBBBBB~ không nhé. Tất nhiên đó không phải là pass bạn đặt để protect.
em cảm ơn anh, dễ hiểu hơn rồi
 
Upvote 0
Uh! Dễ hiểu nhưng mà.. giải thích trật lất
Thử giải thích cách khác đi bạn. Tất nhiên tôi ko chắc về suy đoán của mình nên mới nói hình như... Nếu bảo người ta nói sai mà ko chỉ ra cái đúng thì 1 là kiêu căng quá lố hoặc 2 là ko biết mà nói bừa.
 
Upvote 0
Uh! Dễ hiểu nhưng mà.. giải thích trật lất

suy nghĩ từ cuộc sống thường ngày :
có 2 cách để mở 1 ống khóa :
1.Lấy chìa khóa đúng của nó để mở
2.Lấy búa và đục phang tới 1 số hữu hạn lần nào đó => gây rối loạn cơ chế bảo vệ của ống khóa để cưỡng bức =))

Chỉ tiếc là ống khóa vật lý hoạt động không giống Excel . hi hi
Còn Excel hoạt động thế nào thì có người đang nóng lòng muốn biết kìa /-*+//-*+/
 
Upvote 0
suy nghĩ từ cuộc sống thường ngày :
có 2 cách để mở 1 ống khóa :
1.Lấy chìa khóa đúng của nó để mở
2.Lấy búa và đục phang tới 1 số hữu hạn lần nào đó => gây rối loạn cơ chế bảo vệ của ống khóa để cưỡng bức =))

Chỉ tiếc là ống khóa vật lý hoạt động không giống Excel . hi hi
Còn Excel hoạt động thế nào thì có người đang nóng lòng muốn biết kìa /-*+//-*+/

Phần xanh thì (gần) đúng. Nhưng rất tiếc là phần tím thì sai. Bạn chỉ có thể phá hỏng ống khoá, cắt đứt ống khoá. Chứ loại khoá mà bạn "cưỡng bức" được nó phải mở, không hư hao thì là loại khoá ba xu.
Nói cho đúng, đây là một phương pháp mò kẻ hở của Excel chứ suốt quy trình chả có cái gì bị rối loạn cả.
(hình như qua 2016 - và 2013/64 bit - thì kẻ hở này bị MS trám lại rồi)
 
Lần chỉnh sửa cuối:
Upvote 0
Thử giải thích cách khác đi bạn. Tất nhiên tôi ko chắc về suy đoán của mình nên mới nói hình như... Nếu bảo người ta nói sai mà ko chỉ ra cái đúng thì 1 là kiêu căng quá lố hoặc 2 là ko biết mà nói bừa.
Đúng ra mình không định trả lời vì thái độ của bạn có vẻ như thách thức chứ không phải muốn học hỏi
Nhưng thôi, trả lời theo những gì tôi biết và trả lời cho những ai cần nghe:
- Đối với Excel 2003 trở về trước, mỗi khi ta tạo ra một password để bảo vệ bảng tính (protect sheet, protect workbook) thì ngay lập tức anh Bill sẽ tạo ra một chìa khóa "cửa hậu" để mở
- Cặp chìa khóa này có tính tương tác 2 chiều. Tức bạn Protect Sheet bằng pass A thì bạn có thể Unprotect Sheet bẳng A và "cửa hậu" B nào đó, đồng thời nếu bạn làm ngược lại: Protect Sheet bằng pass B thì chắc chắn bạn có thể Unprotect Sheet được bằng khóa A. Lấy ví dụ tôi Protect Sheet bằng pass ndu và tôi có khóa "cửa hậu" là AABAAABBAAAW. Vậy với 1 bảng tính khác, nếu tôi Protect Sheet bằng pass AABAAABBAAAW thì tôi sẽ Unprotect được bẳng pass ndu
- Các tính chất như đã nêu đều dựa vào lỗ hỏng bảo mật trong các phiên bản office trước đây và từ đó người ta xây dựng code dò tìm (chứ không phải "cưỡng bức" hay "rối loạn tiền đình" gì cả). Bây giờ với phiên bản 2013, 2016 mà dùng code dò theo kiểu đó đến Tết của chưa ra
(Riêng file xlsx được tạo từ phiên bảng Excel 2007 tôi chưa thử nên không chắc)
 
Upvote 0
Bổ sung:
Do số lượng "chìa khóa" mã hóa (dạng AABBABA...) có hạn mà số lượng password người dùng có thể đặt gần như vô hạn nên sẽ có rất nhiều password có chung "chìa khóa" mã hóa và đương nhiên các password có chung "chìa khóa" mã hóa sẽ mở được "ổ khóa" của nhau. Ví dụ như:
Chuỗi 15 ký tự của các chữ cái sau có thể mở cho sheet đặt password là là một trong số chung: A, B, D, G, H, K, M, N, P, S, U, V, Y, Z (tức là đặt password AAAAAAAAAAAAAAA thì mở bằng BBBBBBBBBBBBBBB, DDDDDDDDDDDDDDD, GGGGGGGGGGGGGGG,... cũng được)
Chuỗi 15 ký tự của các chữ cái sau cũng chung một bộ: C, E, F, I, J, L, O, Q, R, T, W, X (15 khoảng trắng cũng nằm trong bộ này)
 
Upvote 0
Đúng ra mình không định trả lời vì thái độ của bạn có vẻ như thách thức chứ không phải muốn học hỏi
Nhưng thôi, trả lời theo những gì tôi biết và trả lời cho những ai cần nghe:
- Đối với Excel 2003 trở về trước, mỗi khi ta tạo ra một password để bảo vệ bảng tính (protect sheet, protect workbook) thì ngay lập tức anh Bill sẽ tạo ra một chìa khóa "cửa hậu" để mở
- Cặp chìa khóa này có tính tương tác 2 chiều. Tức bạn Protect Sheet bằng pass A thì bạn có thể Unprotect Sheet bẳng A và "cửa hậu" B nào đó, đồng thời nếu bạn làm ngược lại: Protect Sheet bằng pass B thì chắc chắn bạn có thể Unprotect Sheet được bằng khóa A. Lấy ví dụ tôi Protect Sheet bằng pass ndu và tôi có khóa "cửa hậu" là AABAAABBAAAW. Vậy với 1 bảng tính khác, nếu tôi Protect Sheet bằng pass AABAAABBAAAW thì tôi sẽ Unprotect được bẳng pass ndu
- Các tính chất như đã nêu đều dựa vào lỗ hỏng bảo mật trong các phiên bản office trước đây và từ đó người ta xây dựng code dò tìm (chứ không phải "cưỡng bức" hay "rối loạn tiền đình" gì cả). Bây giờ với phiên bản 2013, 2016 mà dùng code dò theo kiểu đó đến Tết của chưa ra
(Riêng file xlsx được tạo từ phiên bảng Excel 2007 tôi chưa thử nên không chắc)
Tôi suy đoán chứ không biết cơ chế. Nếu không phải kiêu sao ngay lúc đó không giải thích đi, đợi bị khích mới nói. Chủ thớt cần biết mà ai cũng làm ngơ, có người còn chọc quê nữa.

Chừ chủ thớt cảm ơn tôi đi nhé!
 
Upvote 0
Xin hỏi BQT trường hợp này thì làm thế nào? Và mọi người cho ý kiến ạ.
Topic: Tạo macro / công thức Excel để tự cập nhật cơ sở dữ liệu
Bạn chủ topic sau 03 ngày hỏi xong vấn đề của mình thì quay lại xóa yêu cầu tại bài #1 và các bài viết khác trong topic. Đồng thời, bạn ấy còn đề nghị xóa topic đi:

Không biết bạn ấy có phật ý về điều gì chăng?
Lúc trước cần lắm chức năng blacklist nhưng không có
Thì thêm hắn vào blacklist là xong. Sau này cứ làm ngơ là được --=0
Bây giờ đã có và vừa mới thử.
 
Upvote 0
... Chủ thớt cần biết mà ai cũng làm ngơ, có người còn chọc quê nữa.

Chừ chủ thớt cảm ơn tôi đi nhé!

Cảm ơn cái mốc xì. Ngược lại, tôi chần chờ không trả lời chính vì do bạn thách thức. Cỡ bạn chưa thách thức nổi tôi.

Chú: ngày mai, nếu rảnh tôi sẽ nói chuyện về lý thuyết của cái mã 65,66 này. Bây giờ thì các bạn nào muốn biết thì nên trách câu thách thức này.
 
Upvote 0
Chú: ngày mai, nếu rảnh tôi sẽ nói chuyện về lý thuyết của cái mã 65,66 này. Bây giờ thì các bạn nào muốn biết thì nên trách câu thách thức này.
Mình là dân "tay ngang" nên bất cứ thứ gì liên quan đến lý thuyết mình đều muốn lắng nghe, xem như là cách để làm đầy những lỗ hổng kiến thức
Cảm ơn bạn trước!
 
Upvote 0
Câu chuyện "giải thuật" "code thực hiện giải thuật" ở đây được dựa trên 2 lý thuyết:

1. Hầu hết các phần mềm đều mã hóa (hash) password trước khi lưu lại. Mã hóa là một hàm chuyển. Chuyện mã hóa bị trùng là chuyện có thể xảy ra. Tùy theo mức độ quan trọng, người ta dùng loại rắc rối, khả năng trùng mã dưới 1 phần tỷ (10^-10 hay thấp hơn nữa). Nhưng nếu dùng loại giản dị thì khả năng trùng mã khoảng 1 phần nửa triệu.

2. Excel căn bản chỉ là một bàng tính trải rộng, không phải là một CSDL nghiêm chỉnh (*). Việc bảo mật không quan trọng lắm cho nên MS sẵn sàng dùng loại mã hóa dạng thấp. Có nhiều lý do tại sao họ quyết điịnh làm thế:
(a) Protect khởi đầu chỉ là tránh sự sửa đổi ngoài ý muốn và tránh sự tọc mạch của người ngoài chức phận (vd nếu một nhân viên nào đó tọc mạch, giải password để làm gì đó thì trước mặt ban GĐ, nhân viên này không có lý để bào chữa rằng mình chỉ tình cờ)
(b) Như bài #16 có nói qua, MS cũng cố tình chừa cửa để giải mã dễ dàng. Ngày xưa các cơ quan xài MS Office thường ký hợp đồng bảo dưỡng và hổ trợ. Việc giải password giúp cho MS dễ đào tạo nhân viên phục vụ hổ trợ. Nên biết rằng phí tổn đào tạo một nhân viên có khả năng giải mã hạng cao không nhỏ, và khi có nghề rồi, phải trả lương cao cho nhân viên này.
(c) Như bài #16, và #17 có diễn thêm, MS chọn cách mã hóa password cho sheet là 12 ký tự đơn giản, với 11 ký tự đầu nằm trong vòng [AB], và ký tự thứ 12 nằm trong vòng ASCII đơn giản, hiển thị được; từ số 32 (dấu cách) đến 126 (dấu ngã ~). Với dạng này thì chỉ có khoảng 170 ngàn kiểu khác nhau, đối với máy tình chỉ mò trong tích tắc.

Tóm lại, code của chủ thớt đưa ra là code thực hiện cách mò từ "AAAAAAAAAAA " đến "BBBBBBBBBBB~". Cái căn bản là ở dòng "On Error Resume Next", dùng để dò hết mẫu này đến mẫu khác.
Rất tiếc là nếu lên mạng hỏi "VBA unprotect sheet without pasword" thì sẽ có hàng trăm bài, code tương tự, nhưng chủ thớt lại chọn ngay cái code dở nhất đem lên hỏi. Code đúng đắn hơn có phân biệt workbook, có đoạn code thoát ra khi đã giải xong - không phải đi đủ cả trăm ngàn lần và cuối cùng dừng ở "BBBBBBBBBBB~" (như bài #9 đoán mò)

Vì đây là code mò giải mã cho nên người ta không cần code cho minh bạch. Chứ nếu code cho chuyên nghiệp thì để mò [AB] ta có kỹ thuật giả số nhị phân, code gọn hơn nhiều.

(*) qua đến phiên bản 2013 và 2016 thì MS đã triển khai tinh năng của Excel rất cao. Với ba cái mớ PowerPivot và PowerQuery, PowerBI cung DAX functions thì Excel đã có thể liên hệ được nhiều CSDL khác nhau. Tính bảo mật cần nâng cao. Vì vậy cách giải mã trên không còn hữu hiệu. Đối với 2013 thì phải chỉnh code lại. Đối với 2016 thì tôi chưa thấy cách chỉnh nào (có cách giải mã khác, nhưng không theo nguyên tắc này)
 
Upvote 0
Vì đây là code mò giải mã cho nên người ta không cần code cho minh bạch. Chứ nếu code cho chuyên nghiệp thì để mò [AB] ta có kỹ thuật giả số nhị phân, code gọn hơn nhiều.
Thời lâu lắm rồi mình cũng nghiên cứu giải thuật của code (tham khảo trên mạng) và mình đã "tự ý" chỉnh sửa lại theo ý mình như thế này:
Mã:
Private Function IsProtected(ByVal ExlObj As Object) As Long
  Select Case TypeName(ExlObj)
    Case Is = "Worksheet": IsProtected = -1 * ExlObj.ProtectContents
    Case Is = "Workbook":  IsProtected = -2 * (ExlObj.ProtectStructure Or ExlObj.ProtectWindows)
  End Select
End Function
Mã:
Private Function Password_Remove(ByVal ExlObj As Object) As String
  Dim i As Long, j As Long, lChk As Long
  Dim tmp As String, strPass As String
  On Error Resume Next
  lChk = IsProtected(ExlObj) 'Check if worksheet or workbook is protected
  If lChk Then
    For i = 0 To 2047
      tmp = D2B(i, 11)
      tmp = Replace(Replace(tmp, 0, "A"), 1, "B")
      For j = 32 To 126
        strPass = tmp & ChrW(j)
        ExlObj.Unprotect strPass
        lChk = IsProtected(ExlObj)
        If lChk = 0 Then 'Check if password is removed
          Password_Remove = strPass
          Exit Function
        End If
      Next
    Next
  Else
    MsgBox "'" & ExlObj.Name & "'" & " is not protected!"
  End If
End Function
Mã:
Private Function D2B(ByVal Num As Long, Optional ByVal Places As Long = 1) As String
  Dim qt As Long, rd As Long, tmp As String
  qt = Num
  Do
    rd = qt Mod 2
    qt = Int(qt / 2)
    tmp = rd & tmp
  Loop Until qt = 0
  D2B = Format(Val(tmp), String(Places, "0"))
End Function
Mã:
Sub Crack()
  Dim strPass As String
  strPass = Password_Remove(ActiveSheet)
  If Len(strPass) Then MsgBox strPass, , ActiveSheet.Name
  strPass = Password_Remove(ActiveWorkbook)
  If Len(strPass) Then MsgBox strPass, , ActiveWorkbook.Name
End Sub
Code tuy có dài, thậm chí có thể tốc độ chậm hơn nhưng mình cảm thấy dễ hiểu (theo quan điểm cá nhân)
 
Upvote 0
Cảm ơn cái mốc xì. Ngược lại, tôi chần chờ không trả lời chính vì do bạn thách thức. Cỡ bạn chưa thách thức nổi tôi.

Chú: ngày mai, nếu rảnh tôi sẽ nói chuyện về lý thuyết của cái mã 65,66 này. Bây giờ thì các bạn nào muốn biết thì nên trách câu thách thức này.
Thêm 1 người chịu nóng hết nổi nên phải uống Dr. Thanh
 
Upvote 0
Thêm 1 người chịu nóng hết nổi nên phải uống Dr. Thanh
Số phận của Dr. Thanh và ông bà chủ của nó đang còn bị lâm cảnh lao lý, cùng nhận được sự khinh rẻ miệt thị của nhiều người do cách hành xử vô nhân đạo của chúng. Thế mà còn có người đi quảng cáo dùm.

Thiệt hết biết!?? đúng là "ngưu tầm ngưu, mã tầm mã".
 
Upvote 0
Thêm 1 người chịu nóng hết nổi nên phải uống Dr. Thanh
Thời tiết SG hiện giờ là 28 độ C, độ ẩm 84%. Nhà hổng có máy lạnh đương nhiên là nóng rồi.
Nói vậy là nghĩ mình nhà giàu chửi dân nghèo nhà tôn vách ván chứ gì?
 
Upvote 0
Số phận của Dr. Thanh và ông bà chủ của nó đang còn bị lâm cảnh lao lý, cùng nhận được sự khinh rẻ miệt thị của nhiều người do cách hành xử vô nhân đạo của chúng. Thế mà còn có người đi quảng cáo dùm
Thiệt hết biết!?? đúng là "ngưu tầm ngưu, mã tầm mã".
Lại có người nóng nữa à? Thôi thì uống vài chai Dr. Ruồi như P.S Châu vậy nhé!
 
Upvote 0
Mã:
Private Function D2B(ByVal Num As Long, Optional ByVal Places As Long = 1) As String
  Dim qt As Long, rd As Long, tmp As String
  qt = Num
  Do
    rd = qt Mod 2
    qt = Int(qt / 2)
    tmp = rd & tmp
  Loop Until qt = 0
  D2B = Format(Val(tmp), String(Places, "0"))
End Function

Hàm này dùng nhiều toán tử mod, khong được hiệu quả lắm. Toi mạn phép sửa như vầy:

Mã:
Function Dec2Bin(ByVal Num As Long, Optional ByVal Places As Long = 1) As String
'  hàm dùng cách so sánh bit để đổi số nguyên thành dạng chuỗi nhị phân
  Dim bit As Integer, bitOn As Long
  Dec2Bin = String(Places, "0")
  bit = Places
  bitOn = 1
  Do While bitOn <= Num And bit > 0
    If bitOn And Num Then ' nếu ứng với bit của số thì set bit
      Mid(Dec2Bin, bit, 1) = "1"
    End If
    bit = bit - 1
    bitOn = bitOn * 2 ' dời số 1 sang 1 bit
  Loop
End Function

Lưu ý là hàm sẽ dừng đúng chỗ độ dài Places. Những bits lớn hơn đó sẽ bị cắt bỏ. Nếu muốn nối dài như hàm của bạn thì sửa như sau:
Mã:
  Do While bitOn <= Num
    If bit < 1 Then
      bit = 1
      Dec2Bin = "0" & Dec2Bin
    End If
    If bitOn And Num Then
      Mid(Dec2Bin, bit, 1) = "1"
    End If
    bit = bit - 1
    bitOn = bitOn * 2
  Loop
 
Upvote 0
Nói chuyện ngoài lề nhiều quá! Mọi người nên biết dừng đúng lúc và tập trung vào chuyên môn giùm
Cảm ơn!
 
Upvote 0
Suy luận logic kiểu lập trình viên, tuy nhiên trật lấc :) :)

Đây là góc lập trình của diễn đàn Excel, suy luận lô gic lập trình viên thì không thích ứng chỗ nào?

Nếu bạn cố chủ ý tranh luận theo lô gic "cưỡng bức" như sau thì tại đây tôi nhận thua kém bạn vậy. Tôi chưa hề học qua loại lô gic "cưỡng bức" này và cũng không hề có ý muốn học.

Hình như tác dụng của đoạn code này là làm rối loạn cơ chế protect của Excel để cưỡng bức nó phải unprotect chứ không phải thử khớp mật khẩu.
 
Upvote 0
Hàm này dùng nhiều toán tử mod, khong được hiệu quả lắm. Toi mạn phép sửa như vầy:

Mã:
Function Dec2Bin(ByVal Num As Long, Optional ByVal Places As Long = 1) As String
'  hàm dùng cách so sánh bit để đổi số nguyên thành dạng chuỗi nhị phân
  Dim bit As Integer, bitOn As Long
  Dec2Bin = String(Places, "0")
  bit = Places
  bitOn = 1
  Do While bitOn <= Num And bit > 0
    If bitOn And Num Then ' nếu ứng với bit của số thì set bit
      Mid(Dec2Bin, bit, 1) = "1"
    End If
    bit = bit - 1
    bitOn = bitOn * 2 ' dời số 1 sang 1 bit
  Loop
End Function

Lưu ý là hàm sẽ dừng đúng chỗ độ dài Places. Những bits lớn hơn đó sẽ bị cắt bỏ. Nếu muốn nối dài như hàm của bạn thì sửa như sau:
Mã:
  Do While bitOn <= Num
    If bit < 1 Then
      bit = 1
      Dec2Bin = "0" & Dec2Bin
    End If
    If bitOn And Num Then
      Mid(Dec2Bin, bit, 1) = "1"
    End If
    bit = bit - 1
    bitOn = bitOn * 2
  Loop
Mới xem sơ qua nhưng chưa "kịp" hiểu. Để về nghiên cứu lại
Có điều bạn không nên đặt tên hàm là Dec2Bin vì sẽ trùng với hàm có sẵn của Excel (vì thế nên tôi phải đổi thành D2B)
Cũng xin nói thêm vì sẽ có người thắc mắc tại sao Excel đã có sẵn hàm Dec2Bin rồi sao không dùng luôn mà phải viết thêm D2B để làm giống gì? Bởi Dec2Bin của Excel có hạn chế, nó chỉ tính được đến Num= 511 và Places = 10 mà thôi
 
Upvote 0
Có điều bạn không nên đặt tên hàm là Dec2Bin vì sẽ trùng với hàm có sẵn của Excel (vì thế nên tôi phải đổi thành D2B)

Không để ý. Cảm ơn nhắc nhở.

Cũng xin nói thêm vì sẽ có người thắc mắc tại sao Excel đã có sẵn hàm Dec2Bin rồi sao không dùng luôn mà phải viết thêm D2B để làm giống gì? Bởi Dec2Bin của Excel có hạn chế, nó chỉ tính được đến Num= 511 và Places = 10 mà thôi

Bạn vẫn có thể viết hàm nới thêm cho nó. Có lẽ đó là chủ ý của MS, để cửa cho bạn nới rộng đến số lớn hơn Long (tức là Double)

Giải thuật:
dùng vòng lặp mod và chia 512. Cứ phần mod thì gọi Dec2Bin để tính. Và cứ mỗi đoạn thì nối chuỗi lại.
(dùng đệ quy có lẽ đẹp mắt nhất, nhưng e hơi khó hiểu)
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm D2B ở trên hình như chạy không đúng lắm khi con số lên trên 32768. Cách test dễ nhất là bạn bảo nó tính bất cứ con số nào lớn hơn 32768 và là số lẻ. Số lẻ đổi ra Binary thì phải có số 1 cuối cùng, nhưng hàm sẽ cho ra số 0 cuối.
Sau khi xem kỹ lại thì tôi đoán có lẽ do dòng này
D2B = Format(Val(tmp), String(Places, "0"))
Hàm Val đổi chuổi thành số (float). Số trong hệ thống Windows chỉ chính xác đến 15 đơn vị. Các số lớn hơn 32767 dài 16+ bits. Như vậy các bits sau 15 sẽ chỉ toàn 0.

Tôi đề nghị sửa:
If Len(tmp) >= Places Then
D2B = tmp
Else
D2B = Right(String(Places, "0") & tmp, Places)
End If
 
Upvote 0
Tôi thì tôi sửa như thế này
PHP:
Str = "AAAAAAAAAAA"
Do
    For i = 32 To 126
        ...
        If ... Then Exit Sub
    Next
    Mid(Str, InStrRev(Str, "A")) = "BAAAAAAAAAA"
Loop
Không biết có nhanh không nhưng thấy gọn hơn.
 
Upvote 0
Bạn nên thêm phần thoát nếu có rắc rối. Nếu không thì có thể vòng lặp chạy hoài không dứt.

If Str = "BBBBBBBBBBB" Then Exit...

Điểm thứ hai, đối với chương trình phức tạp độ này, dùng lệnh Exit Sub để thoát vòng lặp có hơi nguy hiểm. Lắm khi ta cần dọn rác trước khi thoát Sub.

Một trong những mẹo vặt để thoát một lúc nhiều vòng lặp FOR (như code nguyên thuỷ của chủ thớt) là dùng vòng lặp giả

Do ' vòng lặp giả
for a: for b: for c: ...: for n
if (thoả điều kiện) then Exit do ' vì chỉ có vòng ngoài cùng là DO cho nên lệnh này thoát tất cả vòng for
next a: next b: next c: ...: next n
Loop Until True ' vòng lặp giả, vì điều kiện là true cho nên nó chỉ chạy 1 lượt chư không lặp lại
 
Upvote 0
đoạn code VBA phá Pass protect sheet hoặc VBA phá pass protect workbook đã không còn tác dụng đối với excel 2013---2016 rồi
tuy nhiên tôi sẽ không cần code để phá 2 loại này như thường.tất nhiên đã có cách ở GPE rồi không cần dẫn link nữa.
 
Upvote 0
Mọi người đang bàn về giải thuật, mục đích không phải là phá pass.
 
Upvote 0
đoạn code VBA phá Pass protect sheet hoặc VBA phá pass protect workbook đã không còn tác dụng đối với excel 2013---2016 rồi
tuy nhiên tôi sẽ không cần code để phá 2 loại này như thường.tất nhiên đã có cách ở GPE rồi không cần dẫn link nữa.

Tôi không thích chuyện phá này phá nọ. Tôi chỉ nói chuyện phiếm về dãy số AAA... - BBB...
Đồng thời, vì biến đổi giữa A/B là một hình thức ngã cờ 0/1 (flag) cho nên tôi bàn thêm về thuật nhị phân.

Tôi thì tôi sửa như thế này
PHP:
Str = "AAAAAAAAAAA"
Do
    For i = 32 To 126
        ...
        If ... Then Exit Sub
    Next
    Mid(Str, InStrRev(Str, "A")) = "BAAAAAAAAAA"
Loop
Không biết có nhanh không nhưng thấy gọn hơn.

Đây là kỹ thuật nhồi bit. Một hình thức đi từ 0000 sang 0001, 0010, 0011, 0100,... Tức là 0, 1, 2, 3, 4,...
Nó cũng là cách nhị phân.
Khuyết điểm: Vì dùng nhiều hàm chuỗi cho nên nó chậm
Lợi điểm: Vì dùng chuỗi cho nên nó có thể thực hiện chuỗi rất dài, khắc phục được nhược điểm của cách dùng số
Nhược điểm của cách dùng số tôi đã nêu ra trước đây: số nguyên không dấu chỉ đến khoảng 4 tỷ - 32 bits; số thực chỉ chính xác tới 15 chữ số (hình như là 48 bits).
(cách tính số nguyên cũng tương tự số thực. Tôi phân biệt ở đây là vì đối với máy tính, con toán số nguyên nhẹ hơn số thực nhiều. Nếu cần tốc độ thì phải giảm thiểu dùng số thực)
 
Upvote 0
Đúng ra mình không định trả lời vì thái độ của bạn có vẻ như thách thức chứ không phải muốn học hỏi
Nhưng thôi, trả lời theo những gì tôi biết và trả lời cho những ai cần nghe:
- Đối với Excel 2003 trở về trước, mỗi khi ta tạo ra một password để bảo vệ bảng tính (protect sheet, protect workbook) thì ngay lập tức anh Bill sẽ tạo ra một chìa khóa "cửa hậu" để mở
- Cặp chìa khóa này có tính tương tác 2 chiều. Tức bạn Protect Sheet bằng pass A thì bạn có thể Unprotect Sheet bẳng A và "cửa hậu" B nào đó, đồng thời nếu bạn làm ngược lại: Protect Sheet bằng pass B thì chắc chắn bạn có thể Unprotect Sheet được bằng khóa A. Lấy ví dụ tôi Protect Sheet bằng pass ndu và tôi có khóa "cửa hậu" là AABAAABBAAAW. Vậy với 1 bảng tính khác, nếu tôi Protect Sheet bằng pass AABAAABBAAAW thì tôi sẽ Unprotect được bẳng pass ndu
- Các tính chất như đã nêu đều dựa vào lỗ hỏng bảo mật trong các phiên bản office trước đây và từ đó người ta xây dựng code dò tìm (chứ không phải "cưỡng bức" hay "rối loạn tiền đình" gì cả). Bây giờ với phiên bản 2013, 2016 mà dùng code dò theo kiểu đó đến Tết của chưa ra
(Riêng file xlsx được tạo từ phiên bảng Excel 2007 tôi chưa thử nên không chắc)

Nhưng không phải 1 "cửa hậu" đâu Ndu à, số lượng cửa hậu hình như nó phụ thuộc vào độ dài của Pass hay sao ấy.
Mình sửa đoạn Code trên thành:

Sub PasswordBreaker()
Dim Dg
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Protect "SEALAND"
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
Dg = Dg + 1
ActiveSheet.Cells(Dg, 1) = Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub


Mục đích là để liệt kê các cửa hậu mà code này tìm được lên cột A và kết quả mình được 6 cửa hậu. Nếu thay Pass= "GPEFORUM" thì được 7 cửa hậu.
 
Upvote 0
Nhưng không phải 1 "cửa hậu" đâu Ndu à, số lượng cửa hậu hình như nó phụ thuộc vào độ dài của Pass hay sao ấy.
Mình sửa đoạn Code trên thành:

Sub PasswordBreaker()
Dim Dg
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Protect "SEALAND"
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
Dg = Dg + 1
ActiveSheet.Cells(Dg, 1) = Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub


Mục đích là để liệt kê các cửa hậu mà code này tìm được lên cột A và kết quả mình được 6 cửa hậu. Nếu thay Pass= "GPEFORUM" thì được 7 cửa hậu.
e có 1 file cần hoàn thành mà không biết tìm sự giúp đỡ ở đâu, vì e k dc học về chuyên ngành mềm này,mà ở chỗ làm cần hoàn thành file, bác bào rành macro xin hoàn thiện giúp, chân thành cảm ơn!
 

File đính kèm

Upvote 0

Bài viết mới nhất

Back
Top Bottom