Có cách nào để bẻ khóa mật khẩu trên Dự án VBA Excel không?


486

Tôi đã được yêu cầu cập nhật một số macro Excel 2003, nhưng các dự án VBA được bảo vệ bằng mật khẩu và dường như thiếu tài liệu ... không ai biết mật khẩu.

Có cách nào để xóa hoặc bẻ khóa mật khẩu trong dự án VBA không?


Bạn có thể Lưu dưới dạng .xls thay vì .xla như các ví dụ trong liên kết của bạn đề xuất không? Không chắc chắn nếu điều này sẽ làm cho một sự khác biệt.
B Hart

4
Điều tốt để biết: xlsb mạnh mẽ chống lại các thủ thuật bẻ khóa mật khẩu
Qbik

20
@ Fandango68 Câu hỏi này đã được thảo luận nhiều năm trước trên meta . TLDR: Rất nhiều (hầu hết?) Các câu hỏi về SO có thể bị lạm dụng bởi các tác nhân xấu, nhưng trừ khi có bằng chứng rõ ràng về việc làm sai, chúng tôi cho rằng đức tin tốt. Có rất nhiều lý do hợp pháp và đạo đức để bẻ khóa mật khẩu VBA. Ngoài ra, thảo luận về các điểm yếu của các hệ thống hiện tại cuối cùng góp phần bảo mật tốt hơn trong tương lai và không khuyến khích mọi người khỏi mù quáng dựa vào các hệ thống không an toàn hiện nay.
jmbpiano

Câu trả lời:


701

Bạn có thể thử VBAphương pháp trực tiếp này không yêu cầu chỉnh sửa HEX. Nó sẽ hoạt động cho mọi tệp (* .xls, * .xlsm, * .xlam ...).

Đã thử nghiệm và hoạt động trên:

Excel 2007
Excel 2010
Excel 2013 - phiên bản 32 bit
Excel 2016 - phiên bản 32 bit

Tìm kiếm phiên bản 64 bit? Xem câu trả lời này

Làm thế nào nó hoạt động

Tôi sẽ cố gắng hết sức để giải thích cách nó hoạt động - xin vui lòng xin lỗi tiếng Anh của tôi.

  1. VBE sẽ gọi một chức năng hệ thống để tạo hộp thoại mật khẩu.
  2. Nếu người dùng nhập đúng mật khẩu và nhấp vào OK, chức năng này sẽ trả về 1. Nếu người dùng nhập sai mật khẩu hoặc nhấp vào Hủy, chức năng này trả về 0.
  3. Sau khi hộp thoại được đóng, VBE kiểm tra giá trị trả về của hàm hệ thống
  4. nếu giá trị này là 1, VBE sẽ "nghĩ" rằng mật khẩu là đúng, do đó dự án VBA bị khóa sẽ được mở.
  5. Mã dưới đây hoán đổi bộ nhớ của chức năng ban đầu được sử dụng để hiển thị hộp thoại mật khẩu với chức năng do người dùng xác định sẽ luôn trả về 1 khi được gọi.

Sử dụng mã

Vui lòng sao lưu các tập tin của bạn đầu tiên!

  1. Mở (các) tệp có chứa Dự án VBA bị khóa của bạn
  2. Tạo một tệp xlsm mới và lưu trữ mã này trong Module1

    code credited to Siwtom (nick name), a Vietnamese developer

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
            (Destination As Long, Source As Long, ByVal Length As Long)
    
    Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
            ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
    
    Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
    
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
            ByVal lpProcName As String) As Long
    
    Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
            ByVal pTemplateName As Long, ByVal hWndParent As Long, _
            ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
    
    Dim HookBytes(0 To 5) As Byte
    Dim OriginBytes(0 To 5) As Byte
    Dim pFunc As Long
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As Long) As Long
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 5) As Byte
        Dim p As Long
        Dim OriginProtect As Long
    
        Hook = False
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
    
        If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
            If TmpBytes(0) <> &H68 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                HookBytes(0) = &H68
                MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
                HookBytes(5) = &HC3
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As Long, _
            ByVal pTemplateName As Long, ByVal hWndParent As Long, _
            ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
        If pTemplateName = 4070 Then
            MyDialogBoxParam = 1
        Else
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                               hWndParent, lpDialogFunc, dwInitParam)
            Hook
        End If
    End Function
    
  3. Dán mã này theo mã trên trong Module1 và chạy nó

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    
  4. Quay trở lại Dự án VBA của bạn và tận hưởng.


4
@Chris bạn hoàn toàn đúng. Bởi vì các hàm Windows API được xác định cho win 32 trong mã này.
Đức Thanh Nguyễn

8
Một số lời giải thích sẽ tốt đẹp về cách làm việc này.
Dennis G

20
Bây giờ câu hỏi duy nhất còn lại (sau khi thấy phương pháp ấn tượng này hoạt động hoàn hảo), là làm thế nào tôi có thể làm cho dự án VBA của tôi được bảo vệ mạnh mẽ hơn để ngăn chặn người khác sử dụng bản hack này trên nó :)
EranG

6
Mã này hoạt động hoàn hảo trong việc mở khóa mã VBA mặc dù mỗi lần tôi sử dụng nó, nó ngăn tôi bảo vệ lại dự án bằng một mật khẩu khác, có ai khác gặp vấn đề này không?
Matthew Bond

2
Tôi thấy nó làm hỏng dự án VBA trong tệp Excel nên tôi phải xuất tất cả các mô-đun / lớp, sau đó lưu tệp dưới dạng xlsx (không macro), sau đó ĐÓNG tệp (Excel ngu ngốc), sau đó mở lại, sau đó mở lại nhập các mô-đun và sao chép mã từ các tập tin lớp. Tại thời điểm này, tôi có thể lưu tệp dưới dạng xlsm bằng mật khẩu của riêng mình trong dự án VBA.
BH

217

Có, miễn là bạn đang sử dụng .xlsbảng tính định dạng (mặc định cho Excel cho đến 2003). Đối với Excel 2007 trở đi, mặc định là .xlsxđịnh dạng khá an toàn và phương pháp này sẽ không hoạt động.

Như Treb nói, đó là một so sánh đơn giản. Một phương pháp là chỉ cần trao đổi mục nhập mật khẩu trong tệp bằng trình chỉnh sửa hex (xem trình soạn thảo Hex cho Windows ). Từng bước ví dụ:

  1. Tạo một tệp excel đơn giản mới.
  2. Trong phần VBA, đặt mật khẩu đơn giản (giả sử - 1234).
  3. Lưu file và thoát. Sau đó kiểm tra kích thước tệp - xem gotcha của Stewbob
  4. Mở tệp bạn vừa tạo bằng trình soạn thảo hex.
  5. Sao chép các dòng bắt đầu bằng các phím sau:

    CMG=....
    DPB=...
    GC=...
    
  6. FIRST BACKUP tệp excel mà bạn không biết mật khẩu VBA, sau đó mở nó bằng trình soạn thảo hex của bạn và dán các dòng được sao chép ở trên từ tệp giả.

  7. Lưu tệp excel và thoát.
  8. Bây giờ, hãy mở tệp excel mà bạn cần để xem mã VBA. Mật khẩu cho mã VBA sẽ chỉ đơn giản là 1234 (như trong ví dụ tôi đang hiển thị ở đây).

Nếu bạn cần làm việc với Excel 2007 hoặc 2010, có một số câu trả lời khác bên dưới có thể giúp ích, đặc biệt là: 1 , 2 , 3 .

EDIT tháng 2 năm 2015: đối với một phương pháp khác có vẻ rất hứa hẹn, hãy xem câu trả lời mới này của Đức Thanh Nguyễn.


Điều gì xảy ra nếu không có dòng nào bắt đầu bằng CMG = ...?
systemovich

1
Trong tệp excel trống, hoặc tệp bị khóa? Kiểm tra kích thước tập tin của tập tin trống. Nếu đó là tệp bị khóa, hãy đảm bảo rằng bản sao lưu của bạn an toàn, sau đó thử thay đổi chỉ hai dòng khác. Bạn có chắc đó là tập tin được mã hóa?
Colin Pickard

6
Bảo vệ mật khẩu Excel 2007 (và định dạng tệp) hoàn toàn khác với Excel 2003. Tôi đã bao gồm một số chi tiết cụ thể về câu trả lời của mình bên dưới. Theo tôi, tùy chọn được bảo vệ bằng mật khẩu trên tệp Excel 2007 là lần đầu tiên trong lịch sử Microsoft Office, họ đã tạo ra một tệp bảo mật hợp lý.
Stewbob

1
Tôi không thể đặt mật khẩu vba trên tệp mới excel 2016. Ai đó có thể đơn giản chia sẻ HEX để thay thế bằng 1234 không? Hoặc nó có thể thay đổi từ máy này sang máy khác?
Mescalito

1
Cách tiếp cận này làm việc cho tôi trên một tệp .xlsm. Tôi đã lưu nó dưới dạng .xls, đã làm điều này và sau đó chuyển đổi nó thành .xlsm. Cần lưu ý rằng bạn có thể tăng độ dài của tệp một cách an toàn nếu CMG...chuỗi mới dài hơn bản gốc.
vẽ Chapin

173

Tôi đã dựa trên câu trả lời tuyệt vời của Đức Thanh Nguyễn để cho phép phương pháp này hoạt động với các phiên bản 64 bit của Excel. Tôi đang chạy Excel 2010 64-bit trên Windows 7 64-bit.

  1. Mở (các) tệp có chứa Dự án VBA bị khóa của bạn.
  2. Tạo một tệp xlsm mới và lưu trữ mã này trong Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 5) As Byte
    Dim OriginBytes(0 To 5) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 5) As Byte
        Dim p As LongPtr
        Dim OriginProtect As LongPtr
    
        Hook = False
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
    
        If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
            If TmpBytes(0) <> &H68 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                HookBytes(0) = &H68
                MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
                HookBytes(5) = &HC3
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
        If pTemplateName = 4070 Then
            MyDialogBoxParam = 1
        Else
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                       hWndParent, lpDialogFunc, dwInitParam)
            Hook
        End If
    End Function
  3. Dán mã này vào Module2 và chạy nó

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub

TUYÊN BỐ TỪ CHỐI Điều này làm việc cho tôi và tôi đã ghi lại nó ở đây với hy vọng nó sẽ giúp được ai đó. Tôi chưa kiểm tra đầy đủ . Hãy chắc chắn lưu tất cả các tệp đang mở trước khi tiếp tục với tùy chọn này.


1
Tôi không chắc tại sao nhưng khi tôi chạy nó trên Excel cho 365 MSP 64 bit bị lỗi, nó sẽ đóng các tệp và khi tôi khởi động lại, mật khẩu vẫn còn đó.
eborbath

Điều này không thể được thực hiện trong excel nữa vì các tùy chọn trong menu ngữ cảnh được tô xám để bạn không thể tạo mô-đun.
thanos.a

170

Có một giải pháp khác (có phần dễ dàng hơn), không có vấn đề kích thước. Tôi đã sử dụng phương pháp này ngày hôm nay (trên tệp XLS 2003, sử dụng Excel 2007) và đã thành công.

  1. Sao lưu tệp xls
  2. Mở tệp trong trình soạn thảo HEX và xác định vị trí của DPB=...phần
  3. Thay đổi DPB=...chuỗi thànhDPx=...
  4. Mở tệp xls trong Excel
  5. Mở trình soạn thảo VBA ( ALT+ F11)
  6. ma thuật: Excel phát hiện ra một khóa không hợp lệ (DPx) và hỏi bạn có muốn tiếp tục tải dự án hay không (về cơ bản bỏ qua bảo vệ)
  7. Bạn sẽ có thể ghi đè mật khẩu, vì vậy hãy thay đổi nó thành một cái gì đó bạn có thể nhớ
  8. Lưu tệp xls *
  9. Đóng và mở lại tài liệu và thực hiện phép thuật VBA của bạn!

* LƯU Ý: Đảm bảo rằng bạn đã thay đổi mật khẩu thành giá trị mới, nếu không, lần sau khi bạn mở bảng tính, Excel sẽ báo lỗi (Lỗi không mong muốn), sau đó khi bạn truy cập danh sách các mô-đun VBA, bạn sẽ thấy tên của mô-đun nguồn nhưng nhận được một lỗi khác khi cố gắng mở biểu mẫu / mã / vv. Để khắc phục điều này, hãy quay lại Thuộc tính dự án VBA và đặt mật khẩu thành một giá trị mới. Lưu và mở lại tài liệu Excel và bạn sẽ thấy ổn!


3
Thật không may, điều này không phù hợp với tôi với Excel cho Mac 2011 v14.2.5. Tôi có tùy chọn để sửa chữa tệp, không đặt lại mật khẩu và hiệu ứng là mất tất cả các tập lệnh VBA.
Joe Carroll

Giải pháp hoàn hảo - Tôi đã làm điều này với một tệp 2003 bằng HxD Hex Editor
Chris W

4
Tôi mới thử nó (.xls, Excel 2007) và nó không hoạt động. Kết quả là: Các mô-đun có thể nhìn thấy, mã thực sự có vẻ hoạt động, nhưng khi mở một mô-đun, nó báo lỗi không mong muốn (40230) .
KekuSemau

2
Lỗi tương tự ở đây (Excel 2010) - nhưng sau đó tôi nhận ra rằng tôi đã bỏ qua 'đặt mật khẩu mới và lưu / mở lại' (bước 7-9) từ Pieter.
Owen B

+1 Phương pháp này cũng hoạt động trên tệp truy cập (.mdb) kém phát triển của chúng tôi! Bây giờ chúng ta có thể làm cho điều đó tốt hơn, cảm ơn vì điều này!
Er Gabriel Doronila

65

Colin Pickard có một câu trả lời tuyệt vời, nhưng có một câu 'coi chừng' với điều này. Có những trường hợp (tôi chưa tìm ra nguyên nhân) trong đó tổng chiều dài của mục "CMG = ........ GC = ...." trong tệp khác với một tệp excel đến kế tiếp. Trong một số trường hợp, mục nhập này sẽ là 137 byte và trong những trường hợp khác, nó sẽ là 143 byte. Độ dài 137 byte là số lẻ và nếu điều này xảy ra khi bạn tạo tệp của mình bằng mật khẩu '1234', chỉ cần tạo một tệp khác và nó sẽ nhảy đến độ dài 143 byte.

Nếu bạn cố dán sai số byte vào tệp, bạn sẽ mất dự án VBA khi bạn cố mở tệp bằng Excel.

BIÊN TẬP

Điều này không hợp lệ cho các tệp Excel 2007/2010. Định dạng tệp .xlsx tiêu chuẩn thực sự là một tệp .zip chứa nhiều thư mục con với định dạng, bố cục, nội dung, v.v., được lưu dưới dạng dữ liệu xml. Đối với tệp Excel 2007 không được bảo vệ, bạn chỉ cần thay đổi phần mở rộng .xlsx thành .zip, sau đó mở tệp zip và xem qua tất cả dữ liệu xml. Nó rất đơn giản.

Tuy nhiên, khi mật khẩu của bạn bảo vệ tệp Excel 2007, toàn bộ tệp .zip (.xlsx) thực sự được mã hóa bằng mã hóa RSA. Không thể thay đổi phần mở rộng thành .zip và duyệt nội dung tệp.


Sau đó, bạn cần sử dụng các công cụ hack zip tiêu chuẩn. Đây không còn là vấn đề "làm thế nào để tôi sao lưu tệp excel".
Loại ẩn danh

3
@Anonymous Loại: Tôi nghĩ rằng một công cụ bẻ khóa zip sẽ không giúp đỡ. Theo tôi hiểu Stewbob, đó không phải là các mục trong tệp zip được mã hóa, mà là toàn bộ tệp zip, bao gồm tiêu đề và thư mục trung tâm.
Treb

2
Chỉ tò mò: làm thế nào nó có thể là RSA khi tôi chỉ cần nhập một mật khẩu (đối xứng)?
kizzx2

Làm thế nào về khi tập tin bạn muốn vào có các phím ngắn hơn? Chỉ cần tiếp tục tạo tài liệu vba cho đến khi bạn nhận được một tài liệu có 137?
chỉ

1
Bạn có chắc chắn rằng toàn bộ zipfile được mã hóa khi bạn khóa dự án VBA không? Tôi vẫn có thể mở zipfile và xem cấu trúc tệp .... Và thư mục con xl \ chứa tệp vbaProject.bin có khối băm "CMG = ... GC =" quen thuộc.
Nigel Heffernan

63

Đối với một loại .xlsmhoặc .dotmtệp bạn cần thực hiện theo một cách hơi khác.

  1. Thay đổi phần mở rộng của .xlsmtập tin thành .zip.
  2. Mở tệp .zip (với WinZip hoặc WinRar, v.v.) và chuyển đến thư mục xl.
  3. Giải nén vbaProject.bintập tin và mở nó trong Hex Editor (Tôi sử dụng HxD , nó hoàn toàn miễn phí và nhẹ.)
  4. Tìm kiếm DPBvà thay thế bằng DPxvà lưu tệp.
  5. Thay thế vbaProject.bintệp cũ bằng tệp mới này trong tệp nén.
  6. Thay đổi phần mở rộng tập tin trở lại .xlsm.
  7. Mở sổ làm việc bỏ qua các thông báo cảnh báo.
  8. Mở Visual Basic bên trong Excel.
  9. Chuyển đến Công cụ> Thuộc tính VBAProject> Tab Bảo vệ.
  10. Đặt mật khẩu mới và lưu .xlsmtệp.
  11. Đóng và mở lại và mật khẩu mới của bạn sẽ hoạt động.

8
Đã hoạt động trong Excel 2016, Windows 10 64 bit. (tệp xlsm)
LimaNightHawk

3
Đã hoạt động trong Word 2016, Windows 10 64 bit (tệp dotm)
NBajanca

7
Giải pháp tuyệt vời, đã làm việc cho tôi trong Excel 2013 64 bit. Bạn có thể bỏ qua việc thay đổi phần mở rộng tệp thành .zipnếu bạn đã cài đặt 7-Zip . Trong trường hợp này, bạn chỉ cần nhấp chuột phải vào .xlsmtệp và chọn "7-Zip -> Mở Lưu trữ"
nkatsar

hoạt động với Word 2013, win7x64. (Thật đáng buồn, rất dễ bị lừa để tin rằng mã có phần an toàn).
Berry Tsakala

1
@ThierryMichel Kết hợp các giải pháp trước đây và thử nghiệm và lỗi!
Matt

35

Thật đáng để chỉ ra rằng nếu bạn có tệp Excel 2007 (xlsm), thì bạn chỉ cần lưu tệp đó dưới dạng tệp Excel 2003 (xls) và sử dụng các phương pháp được nêu trong các câu trả lời khác.


4
điều đó không đúng, tôi đã làm việc với các tệp mà việc chuyển đổi sang xls / xla từ xlsm là không thể, Excel 2007 và 2010 bị hỏng mỗi lần, tôi đã thử nhiều trường hợp khác nhau, từ một tin nhắn erros - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211d
Qbik

4
Có, bạn có thể làm điều đó. Tôi đã làm điều đó nhiều lần. Nếu có một cái gì đó trên các trang tính cần thiết và những gì không được chuyển sang phiên bản cũ hơn, tôi sẽ làm điều này: 1.convert .xlsm sang .xls 2.bẻ khóa mã của .xls 3.convert .xlsm sang .xlsx 4.Đặt mã từ mô-đun vào .xls sang. xlsx và lưu nó dưới dạng .xlsm
ZygD

Nó hoạt động sau khi chuyển đổi xlsm thành xls như trong câu trả lời.
Purus

32

Đến lượt tôi, điều này được xây dựng dựa trên câu trả lời tuyệt vời của kaybee99, được xây dựng dựa trên câu trả lời tuyệt vời của Đức Thanh Nguyễn để cho phép phương pháp này hoạt động với cả hai phiên bản Office x86 và amd64.

Tổng quan về những gì được thay đổi, chúng tôi tránh đẩy / ret bị giới hạn ở địa chỉ 32 bit và thay thế bằng reg / jmp reg.

Đã thử nghiệm và hoạt động trên

Word / Excel 2016 - Phiên bản 32 bit .
Word / Excel 2016 - Phiên bản 64 bit .

làm thế nào nó hoạt động

  1. Mở (các) tệp có chứa Dự án VBA bị khóa của bạn.
  2. Tạo một tệp mới với cùng loại như trên và lưu mã này trong Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 11) As Byte
    Dim OriginBytes(0 To 11) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 12
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 11) As Byte
        Dim p As LongPtr, osi As Byte
        Dim OriginProtect As LongPtr
    
        Hook = False
    
        #If Win64 Then
            osi = 1
        #Else
            osi = 0
        #End If
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
        If VirtualProtect(ByVal pFunc, 12, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, osi+1
            If TmpBytes(osi) <> &HB8 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 12
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                If osi Then HookBytes(0) = &H48
                HookBytes(osi) = &HB8
                osi = osi + 1
                MoveMemory ByVal VarPtr(HookBytes(osi)), ByVal VarPtr(p), 4 * osi
                HookBytes(osi + 4 * osi) = &HFF
                HookBytes(osi + 4 * osi + 1) = &HE0
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 12
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
        If pTemplateName = 4070 Then
            MyDialogBoxParam = 1
        Else
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                       hWndParent, lpDialogFunc, dwInitParam)
            Hook
        End If
    End Function
  3. Dán mã này vào Module2 và chạy nó

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub

3
Hoàn hảo! Làm việc với Windows Server 2016, Excel 2016 32 bit
Zin Min

Điều này đã làm việc trên tệp .xlsm trên Excel Office 365. Xin cảm ơn!
Ryan James

Vẫn hoạt động vào năm 2019, bản dựng mới nhất của Office 365 64 bit, những người tuyệt vời!
XavierAM

Cảm ơn mã đã cập nhật, tôi đã gặp phải sự cố khi chạy phiên bản trước (64-bit), nhưng tất cả đều tốt với phiên bản của bạn
emjaySX

Tuyệt vời ... Đã hoạt động hoàn hảo
Mahhdy

17

Bạn đã thử chỉ đơn giản là mở chúng trong OpenOffice.org?

Tôi đã có một vấn đề tương tự một thời gian trước đây và thấy rằng Excel và Calc không hiểu mã hóa của nhau và vì vậy cho phép truy cập trực tiếp vào mọi thứ.

Đây là một thời gian trước đây, vì vậy nếu đó không chỉ là một con sán về phía tôi thì nó cũng có thể đã được vá.


15

Trong trường hợp khối của CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" bạn trong tệp 'mật khẩu đã biết' của bạn ngắn hơn khối hiện có trong tệp 'mật khẩu không xác định', hãy đệm các chuỗi hex của bạn bằng các số 0 ở cuối để đạt độ dài chính xác.

ví dụ

CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"

trong tệp mật khẩu không xác định, nên được đặt thành

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" để bảo toàn chiều dài tập tin.

Tôi cũng đã làm việc với các tệp .XLA (định dạng 97/2003) trong office 2007.


1
Điều này hoạt động, nhưng như tôi đã phát hiện gần đây (đã nhận xét ở trên), bạn cũng có thể chỉ cần thêm các ký tự null sau khi trích dẫn đóng cuối cùng trong khối GC = "..." cho đến khi bạn đạt được độ dài tương tự.
tobriand

13

Đối với Excel 2007 trở đi, bạn cần thay đổi phần mở rộng tệp của mình thành .zip Trong kho lưu trữ có một thư mục con xl, trong đó bạn sẽ tìm thấy vbaProject.bin. Thực hiện theo bước trên với vbaProject.bin sau đó lưu lại trong kho lưu trữ. Sửa đổi lại phần mở rộng của bạn và voilà! (có nghĩa là làm theo các bước ở trên)


1
Tôi có thể xác nhận điều này hoạt động cho các tệp .xlam với Excel 2010. +1!
Gimelist

12

Mật khẩu dự án VBA trên các tài liệu Access, Excel, Powerpoint hoặc Word ( 2007, 2010, 2013 or 2016phiên bản có phần mở rộng .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) có thể dễ dàng bị xóa .

Đó chỉ đơn giản là vấn đề thay đổi phần mở rộng tên tệp thành .ZIP, giải nén tệp và sử dụng bất kỳ Trình soạn thảo Hex cơ bản nào (như XVI32 ) để "phá vỡ" mật khẩu hiện có, điều này "gây nhầm lẫn" cho Office để nhắc mật khẩu mới vào lần tới đã mở.

Tóm tắt các bước:

  • đổi tên tập tin để nó có .ZIPphần mở rộng
  • mở ZIPvà đi đến XLthư mục.
  • giải nén vbaProject.binvà mở nó với Hex Editor
  • "Tìm kiếm & Thay thế" thành "thay thế tất cả" thay đổi DPBthành DPX.
  • Lưu các thay đổi, đặt .bintệp trở lại vào zip, đưa nó trở lại phần mở rộng bình thường và mở tệp như bình thường.
  • ALT + F11 để vào Trình chỉnh sửa VB và nhấp chuột phải vào Project Explorer để chọn VBA Project Properties.
  • Trên Protectiontab, Đặt mật khẩu mới.
  • Nhấp OK, Đóng tệp, Mở lại tệp, nhấn ALT + F11.
  • Nhập mật khẩu mới mà bạn đặt.

Tại thời điểm này, bạn có thể xóa hoàn toàn mật khẩu nếu bạn chọn.

Hướng dẫn đầy đủ với video từng bước tôi đã thực hiện "quay lại khi nào" trên YouTube tại đây .

Thật sốc khi cách giải quyết này đã tồn tại trong nhiều năm và Microsoft đã không khắc phục vấn đề này.


Noi dung chinh cua cau chuyen?

Mật khẩu Dự án Microsoft Office VBA không được dựa vào để bảo mật bất kỳ thông tin nhạy cảm nào . Nếu bảo mật là quan trọng, hãy sử dụng phần mềm mã hóa của bên thứ ba.


9

Colin Pickard hầu hết là chính xác, nhưng đừng nhầm lẫn bảo vệ "mật khẩu để mở" cho toàn bộ tệp với bảo vệ mật khẩu VBA, hoàn toàn khác với trước đây và giống với Office 2003 và 2007 (đối với Office 2007, đổi tên tệp vào .zip và tìm vbaProject.bin bên trong zip). Và về mặt kỹ thuật, cách chính xác để chỉnh sửa tệp là sử dụng trình xem tài liệu ghép OLE như CFX để mở luồng chính xác. Tất nhiên, nếu bạn chỉ thay thế byte, trình soạn thảo nhị phân cũ đơn giản có thể hoạt động.

BTW, nếu bạn đang tự hỏi về định dạng chính xác của các trường này, thì chúng đã được ghi lại ngay bây giờ:

http://msdn.microsoft.com/en-us/l Library / dd926151% 28v = office.12% 29.aspx


2
Liên kết sau đây cung cấp chi tiết cho các tệp định dạng XSLM. gbanik.blogspot.co.uk/2010/08/ Lời Giải pháp giống như giải pháp được Yuhong Bao nêu ở trên, nhưng làm cho việc đọc thú vị và bao gồm ảnh chụp màn hình.
JohnLBevan

7

Nếu tệp là tệp zip hợp lệ (một vài byte đầu tiên 50 4B- được sử dụng trong các định dạng như .xlsm), sau đó giải nén tệp và tìm tệp con xl/vbaProject.bin. Đây là một tệp CFB giống như các .xlstệp. Làm theo các hướng dẫn cho định dạng XLS (áp dụng cho tập tin con) và sau đó chỉ cần nén nội dung.

Đối với định dạng XLS, bạn có thể làm theo một số phương pháp khác trong bài viết này. Cá nhân tôi thích tìm kiếm DPB=khối và thay thế văn bản

CMG="..."
DPB="..."
GC="..."

với những khoảng trống. Điều này làm giảm các vấn đề kích thước container CFB.


7

Tôi đã thử một số giải pháp ở trên và không có giải pháp nào phù hợp với tôi (tệp xlsm excel 2007). Sau đó, tôi tìm thấy một giải pháp khác thậm chí lấy lại mật khẩu, không chỉ bẻ khóa nó.

Chèn mã này vào mô-đun, chạy nó và cho nó một chút thời gian. Nó sẽ khôi phục mật khẩu của bạn bằng vũ lực.

Sub PasswordBreaker()

'Breaks worksheet password protection.

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)
If ActiveSheet.ProtectContents = False Then
MsgBox "One usable password is " & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

1
Đẹp! Tôi nghĩ rằng bạn có một downvote vì giải pháp của bạn mở khóa bảng tính thay vì mô-đun VBA. Tuy nhiên tôi thấy nó hữu ích - cảm ơn!
PBD10017

1
Tôi có cái này nó Workbook cá nhân của tôi. Các tác giả đã trích dẫn Bob McCormick là tác giả gốc sau đó được sửa đổi bởi Norman Harker và JE McGimpsey 2002.
Charles Byrne

5

ElcomSoft tạo ra các sản phẩm Advanced Password Password BreakerAdvanced Office Password Recovery có thể áp dụng cho trường hợp này, miễn là tài liệu được tạo trong Office 2007 trở về trước.


4

Tom - Ban đầu tôi đã mắc một lỗi học sinh vì tôi không xem kích thước byte và thay vào đó tôi đã sao chép và dán từ "CMG" được thiết lập cho mục tiếp theo. Tuy nhiên, đây là hai kích cỡ văn bản khác nhau giữa hai tệp và tôi đã mất dự án VBA giống như Stewbob đã cảnh báo.

Sử dụng HxD, có một bộ đếm theo dõi số lượng tệp bạn đang chọn. Sao chép bắt đầu từ CMG cho đến khi bộ đếm đọc 8F (hex cho 143) và tương tự như vậy khi dán vào tệp bị khóa - Tôi đã kết thúc với số lượng gấp đôi "..." ở cuối dán, trông có vẻ kỳ lạ và gần như cảm thấy không tự nhiên, nhưng nó đã làm việc

Tôi không biết nó có quan trọng không, nhưng tôi chắc chắn rằng tôi đã đóng cả trình soạn thảo hex và excel xuống trước khi mở lại tệp trong Excel. Sau đó tôi đã phải đi qua các menu để mở VB Editor, vào VBProject Properties và nhập mật khẩu 'mới' để mở khóa mã.

Tôi hi vọng cái này giúp được.


4

Công cụ của tôi, VbaDiff , đọc VBA trực tiếp từ tệp, vì vậy bạn có thể sử dụng nó để khôi phục mã VBA được bảo vệ từ hầu hết các tài liệu văn phòng mà không cần dùng đến trình soạn thảo hex.


Tôi đã thử nghiệm công cụ này và hoạt động rất tốt tuy nhiên phiên bản miễn phí lấy 53 dòng đầu tiên. Để khôi phục tập tin của tôi, tôi đã phải làm theo hướng dẫn của Andy để mở khóa mật khẩu. Sau đó, tôi đã mở xlsm của mình với VbaDiff trong cả hai bảng và sau đó tôi nhấp vào trang tính với mã của mình. Tôi đã nhận được nó với copy-paste và đặt nó vào tập tin excel đã khôi phục nhưng trống rỗng của tôi.
thanos.a

2

Bảo vệ là một so sánh văn bản đơn giản trong Excel. Tải Excel trong trình gỡ lỗi yêu thích của bạn ( Ollydbg là công cụ lựa chọn của tôi), tìm mã thực hiện so sánh và sửa nó để luôn trả về đúng, điều này sẽ cho phép bạn truy cập các macro.


1

Đối với Excel 2016 64 bit trên máy Windows 10, tôi đã sử dụng trình chỉnh sửa hex để có thể thay đổi mật khẩu của xla được bảo vệ (chưa thử nghiệm điều này cho bất kỳ tiện ích mở rộng nào khác). Mẹo: tạo bản sao lưu trước khi bạn làm điều này.

Các bước tôi đã thực hiện:

  1. Mở vba trong trình soạn thảo hex (ví dụ XVI)
  2. Tìm kiếm trên DPB này
  3. Thay đổi DPB thành một thứ khác, như DPX
  4. Lưu nó đi!
  5. Mở lại .xla, một thông báo lỗi sẽ xuất hiện, chỉ cần tiếp tục.
  6. Bây giờ bạn có thể thay đổi mật khẩu của .xla bằng cách mở thuộc tính và chuyển đến tab mật khẩu.

Tôi hy vọng điều này đã giúp một số bạn!


Tôi đã thành công khi mở một .xls cũ bằng cách sử dụng tính năng này trên Windows 10 trong phiên bản Excel 365 mới nhất, trong khi câu trả lời hàng đầu là không may không hoạt động nữa. Tôi đã tải xuống HxD và thay đổi chữ cái cuối cùng như được đề xuất và bỏ qua các lỗi. Tất cả đều tốt, cảm ơn!
Sinh viên Starnes

0

phần mở rộng tệp excel của bạn thay đổi thành xml. Và mở nó trong notepad. mật khẩu tìm văn bản trong tập tin xml.

bạn thấy như dòng dưới đây;

Sheets("Sheet1").Unprotect Password:="blabla"

(Xin lỗi vì tiếng Anh của tôi không tốt)


Bạn có thể giải thích làm thế nào câu trả lời của bạn tốt hơn câu trả lời rất tốt đã được cung cấp?
Noel Widmer

giải pháp của tôi không có mã. Vì vậy, giải pháp rất nhỏ gọn khác.
Nhà phát

1
Giải pháp này bạn đã cung cấp không hoạt động vào năm 2019.
Daniel L. VanDenBosch

Nó không hoạt động đối với tôi trong văn phòng 365
thanos.a

0

Nếu bạn làm việc trong Javabạn có thể cố gắng VBAMacroExtractor. Sau khi trích xuất các tập lệnh VBA từ .xlsmtôi đã tìm thấy mật khẩu trong bản rõ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.