ฉันถูกขอให้อัปเดตมาโคร Excel 2003 บางตัว แต่โครงการ VBA ได้รับการปกป้องด้วยรหัสผ่านและดูเหมือนว่าไม่มีเอกสารประกอบ ... ไม่มีใครรู้รหัสผ่าน
มีวิธีการลบหรือถอดรหัสรหัสผ่านในโครงการ VBA หรือไม่?
ฉันถูกขอให้อัปเดตมาโคร Excel 2003 บางตัว แต่โครงการ VBA ได้รับการปกป้องด้วยรหัสผ่านและดูเหมือนว่าไม่มีเอกสารประกอบ ... ไม่มีใครรู้รหัสผ่าน
มีวิธีการลบหรือถอดรหัสรหัสผ่านในโครงการ VBA หรือไม่?
คำตอบ:
คุณสามารถลองVBAใช้วิธีนี้โดยตรงซึ่งไม่ต้องการการแก้ไข HEX มันจะทำงานกับไฟล์ใด ๆ (* .xls, * .xlsm, * .xlam ... )
ผ่านการทดสอบและใช้งานได้บน:
Excel 2007
Excel 2010
Excel 2013 - รุ่น 32 บิต
Excel 2016 - รุ่น 32 บิต
กำลังมองหารุ่น 64 บิตอยู่ใช่ไหม ดูคำตอบนี้
ฉันจะพยายามอย่างเต็มที่เพื่ออธิบายวิธีการทำงาน - โปรดขอโทษภาษาอังกฤษของฉัน
โปรดสำรองไฟล์ของคุณก่อน!
สร้างไฟล์ xlsm ใหม่และเก็บรหัสนี้ใน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วางรหัสนี้ภายใต้รหัสด้านบนในModule1และเรียกใช้
Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Subกลับมาที่โครงการ VBA ของคุณแล้วสนุกไปกับมัน
ใช่มีตราบใดที่คุณกำลังใช้.xlsสเปรดชีตรูปแบบ (ค่าเริ่มต้นสำหรับ Excel สูงถึง 2003) สำหรับ Excel 2007 เป็นต้นไปค่าเริ่มต้น.xlsxซึ่งเป็นรูปแบบที่ค่อนข้างปลอดภัยและวิธีนี้จะไม่ทำงาน
อย่างที่ Treb กล่าวมันเป็นการเปรียบเทียบที่ง่าย วิธีหนึ่งคือเพียงสลับรายการรหัสผ่านในไฟล์โดยใช้โปรแกรมแก้ไขฐานสิบหก (ดูที่โปรแกรมแก้ไขฐานสิบหกสำหรับ Windows ) ตัวอย่างทีละขั้นตอน:
คัดลอกบรรทัดที่ขึ้นต้นด้วยคีย์ต่อไปนี้:
CMG=....
DPB=...
GC=...สำรองไฟล์ excel แรกที่คุณไม่ทราบรหัสผ่าน VBA จากนั้นเปิดด้วยโปรแกรมแก้ไขฐานสิบหกของคุณและวางบรรทัดที่คัดลอกด้านบนจากไฟล์จำลอง
หากคุณจำเป็นต้องทำงานกับ Excel 2007 หรือปี 2010 มีบางคำตอบอื่น ๆ ดังต่อไปนี้ซึ่งอาจจะช่วยโดยเฉพาะอย่างยิ่งเหล่านี้: 1 , 2 , 3
แก้ไขก.พ. 2558: สำหรับวิธีอื่นที่ดูดีมากลองดูคำตอบใหม่นี้โดย Thanc Thanh Nguyễn
CMG...สตริงใหม่ยาวกว่าเดิม
                    ฉันได้สร้างคำตอบที่ยอดเยี่ยมของ Thanc Thanh Nguyễnเพื่อให้วิธีนี้ทำงานกับ Excel เวอร์ชัน 64 บิต ฉันใช้ Excel 2010 64-Bit บน Windows 7 บิต 64
สร้างไฟล์ xlsm ใหม่และเก็บรหัสนี้ใน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วางรหัสนี้ในModule2และเรียกใช้
Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Subการปฏิเสธความรับผิดสิ่งนี้ได้ผลสำหรับฉันและฉันได้บันทึกไว้ที่นี่ด้วยความหวังว่ามันจะช่วยใครบางคนออกมา ฉันไม่ได้ทดสอบอย่างเต็มที่ โปรดอย่าลืมบันทึกไฟล์ที่เปิดอยู่ทั้งหมดก่อนที่จะดำเนินการต่อด้วยตัวเลือกนี้
มีวิธีแก้ปัญหาอื่น (ค่อนข้างง่าย) โดยไม่มีปัญหาเรื่องขนาด ฉันใช้วิธีนี้ในวันนี้ (ในไฟล์ XLS ปี 2003 โดยใช้ Excel 2007) และประสบความสำเร็จ
DPB=...ส่วนDPB=...สตริงเป็นDPx=...* หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนรหัสผ่านเป็นค่าใหม่มิฉะนั้นครั้งต่อไปที่คุณเปิดสเปรดชีต Excel จะรายงานข้อผิดพลาด (ข้อผิดพลาดที่ไม่คาดคิด) จากนั้นเมื่อคุณเข้าถึงรายการของโมดูล VBA คุณจะเห็นชื่อของ โมดูลแหล่งที่มา แต่ได้รับข้อผิดพลาดอื่นเมื่อพยายามเปิดฟอร์ม / รหัส / ฯลฯ เพื่อแก้ไขปัญหานี้กลับไปที่คุณสมบัติโครงการ VBA และตั้งรหัสผ่านเป็นค่าใหม่ บันทึกและเปิดเอกสาร Excel อีกครั้งและคุณน่าจะไปได้ดี!
Colin Pickard มีคำตอบที่ยอดเยี่ยม แต่มี 'ระวัง' สิ่งนี้ มีหลายกรณี (ฉันยังไม่ได้หาสาเหตุเลย) โดยที่ความยาวรวมของรายการ "CMG = ........ GC = .... " ในไฟล์นั้นแตกต่างจากไฟล์ excel หนึ่งไปยัง ต่อไป. ในบางกรณีรายการนี้จะมีขนาด 137 ไบต์และในบางกรณีจะมีขนาด 143 ไบต์ ความยาว 137 ไบต์นั้นเป็นเลขคี่และถ้าเกิดขึ้นเมื่อคุณสร้างไฟล์ด้วยรหัสผ่าน '1234' เพียงแค่สร้างไฟล์ใหม่และควรข้ามไปที่ความยาว 143 ไบต์
หากคุณพยายามวางจำนวนไบต์ที่ไม่ถูกต้องลงในไฟล์คุณจะสูญเสียโครงการ VBA ของคุณเมื่อคุณพยายามเปิดไฟล์ด้วย Excel
แก้ไข
สิ่งนี้ไม่ถูกต้องสำหรับไฟล์ Excel 2007/2010 รูปแบบไฟล์. xlsx มาตรฐานเป็นจริงไฟล์. zip ที่มีโฟลเดอร์ย่อยมากมายด้วยการจัดรูปแบบเค้าโครงเนื้อหา ฯลฯ ที่จัดเก็บเป็นข้อมูล xml สำหรับไฟล์ Excel 2007 ที่ไม่มีการป้องกันคุณสามารถเปลี่ยนนามสกุล. xlsx เป็น. zip จากนั้นเปิดไฟล์ zip และดูข้อมูล xml ทั้งหมด มันตรงไปตรงมามาก
อย่างไรก็ตามเมื่อรหัสผ่านของคุณป้องกันไฟล์ Excel 2007 ไฟล์. zip ทั้งหมด (.xlsx) ทั้งหมดจะถูกเข้ารหัสโดยใช้การเข้ารหัส RSA ไม่สามารถเปลี่ยนนามสกุลเป็น. zip และเรียกดูเนื้อหาไฟล์ได้อีก
สำหรับประเภทไฟล์.xlsmหรือ.dotmคุณต้องใช้วิธีที่แตกต่างกันเล็กน้อย
.xlsm.zipvbaProject.binไฟล์และเปิดใน Hex Editor (ฉันใช้HxDซึ่งเป็นไฟล์ที่ฟรีและมีน้ำหนักเบา)DPBและแทนที่ด้วยDPxและบันทึกไฟล์vbaProject.binไฟล์เก่าด้วยไฟล์ใหม่นี้ในไฟล์ซิป.xlsmเปลี่ยนนามสกุลไฟล์กลับไป.xlsmไฟล์เป็นค่าชี้ให้เห็นว่าถ้าคุณมีไฟล์ Excel 2007 (xlsm) คุณสามารถบันทึกเป็นไฟล์ Excel 2003 (xls) และใช้วิธีการที่ระบุไว้ในคำตอบอื่น ๆ
1.แปลง. xlsm เป็น. xls 2.ถอดรหัสรหัสของ. xls 3.แปลง. xlsm เป็น. xlsx 4.ใส่รหัสจากโมดูลใน. xls เป็น xlsx และบันทึกเป็น. xlsm
                    เมื่อถึงตาของฉันสิ่งนี้สร้างขึ้นจากคำตอบที่ยอดเยี่ยมของ kaybee99 ซึ่งสร้างขึ้นจากคำตอบที่ยอดเยี่ยมของ Thanc Thanh Nguy allown เพื่อให้วิธีนี้ใช้ได้กับ Office ทั้งรุ่น x86 และ amd64
ภาพรวมของสิ่งที่มีการเปลี่ยนแปลงเราหลีกเลี่ยงการกด / ret ซึ่ง จำกัด อยู่ที่ 32 บิตและแทนที่ด้วย mov / jmp reg
ผ่านการทดสอบและใช้งานได้
โปรแกรม Word / Excel 2016 - รุ่น 32 บิต
โปรแกรม Word / Excel 2016 - รุ่น 64 บิต
มันทำงานอย่างไร
สร้างไฟล์ใหม่ด้วยประเภทเดียวกันกับด้านบนและเก็บรหัสนี้ใน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วางรหัสนี้ในModule2และเรียกใช้
Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Subคุณลองเปิดมันใน OpenOffice.org หรือไม่?
ฉันมีปัญหาที่คล้ายกันเมื่อไม่นานมานี้และพบว่า Excel และ Calc ไม่เข้าใจการเข้ารหัสของกันและกันและอนุญาตให้เข้าถึงทุกอย่างได้โดยตรง
เมื่อไม่นานมานี้ดังนั้นหากนั่นไม่ใช่แค่ความบังเอิญในส่วนของฉันมันอาจถูกแก้ไขด้วย
ในกรณีที่บล็อกของ 
 CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
คุณในไฟล์ 'รหัสผ่านที่รู้จัก' ของคุณสั้นกว่าบล็อกที่มีอยู่ในไฟล์ 'รหัสผ่านที่ไม่รู้จัก' ให้วางสตริงสตริงของคุณด้วยศูนย์ต่อท้ายเพื่อให้ได้ความยาวที่ถูกต้อง
เช่น
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
ในไฟล์รหัสผ่านที่ไม่รู้จักควรตั้งเป็น
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" เพื่อรักษาความยาวของไฟล์
ฉันยังเคยทำงานกับไฟล์. XLA (รูปแบบ 97/2003) ใน office 2007
สำหรับ Excel 2007 เป็นต้นไปคุณจะต้องเปลี่ยนนามสกุลไฟล์เป็น. zip ในไฟล์เก็บถาวรมีโฟลเดอร์ย่อย xl อยู่ในนั้นคุณจะพบ vbaProject.bin ทำตามขั้นตอนข้างต้นด้วย vbaProject.bin จากนั้นบันทึกลงในไฟล์เก็บถาวร ปรับเปลี่ยนส่วนขยายของคุณและกลับ! (หมายถึงทำตามขั้นตอนด้านบน)
VBA โครงการรหัสผ่านบน Access, Excel, Powerpoint หรือเอกสาร Word ( 2007, 2010, 2013 or 2016รุ่นที่มีส่วนขยาย.ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) สามารถถอดออกได้ง่าย
มันเป็นเรื่องของการเปลี่ยนนามสกุล.ZIPไฟล์เป็นคลายซิปไฟล์และใช้ตัวแก้ไข Hex พื้นฐานใด ๆ (เช่นXVI32 ) เพื่อ "ทำลาย" รหัสผ่านที่มีอยู่ซึ่ง "สับสน" Office ดังนั้นมันจะแจ้งให้ใส่รหัสผ่านใหม่ในครั้งต่อไป เปิด
.ZIPนามสกุลZIPและไปที่XLโฟลเดอร์vbaProject.binแล้วเปิดด้วยตัวแก้ไข HexDPBDPX.binไฟล์กลับเข้าไปใน zip กลับไปเป็นนามสกุลปกติและเปิดไฟล์เหมือนปกติVBA Project Propertiesโครงการที่จะเลือกProtectionแท็บตั้งรหัสผ่านใหม่OKปิดไฟล์เปิดใหม่กด ALT + F11ถึงตอนนี้คุณสามารถลบรหัสผ่านได้อย่างสมบูรณ์หากคุณเลือก
คำแนะนำที่สมบูรณ์ด้วยวิดีโอขั้นตอนโดยขั้นตอนที่ฉันทำ"ทางกลับเมื่อ"อยู่บนYouTubeที่นี่
เป็นเรื่องที่น่าตกใจที่การแก้ไขปัญหานี้เกิดขึ้นนานหลายปีและ Microsoft ไม่ได้แก้ไขปัญหานี้
คุณธรรมของเรื่องราวหรือไม่
Microsoft Office รหัสผ่าน VBA โครงการจะไม่ได้ที่จะพึ่งพาอาศัยเพื่อความปลอดภัยของใด ๆข้อมูลที่สำคัญ หากความปลอดภัยเป็นสิ่งสำคัญให้ใช้ซอฟต์แวร์เข้ารหัสของบุคคลที่สาม
Colin Pickard ส่วนใหญ่ถูกต้อง แต่อย่าสับสนการป้องกัน "รหัสผ่านเพื่อเปิด" สำหรับไฟล์ทั้งหมดที่มีการป้องกันรหัสผ่าน VBA ซึ่งแตกต่างจากรุ่นก่อนอย่างสิ้นเชิงและเหมือนกันสำหรับ Office 2003 และ 2007 (สำหรับ Office 2007 เปลี่ยนชื่อ ไฟล์ไปที่. zip และค้นหา vbaProject.bin ที่อยู่ใน zip) และในทางเทคนิคแล้ววิธีที่ถูกต้องในการแก้ไขไฟล์คือการใช้โปรแกรมดูเอกสารแบบผสม OLE เช่น CFX เพื่อเปิดสตรีมที่ถูกต้อง แน่นอนถ้าคุณเพียงแค่เปลี่ยนไบต์ตัวแก้ไขไบนารีแบบธรรมดาอาจทำงานได้
BTW หากคุณสงสัยเกี่ยวกับรูปแบบที่แน่นอนของฟิลด์เหล่านี้พวกเขาได้บันทึกไว้ในขณะนี้:
http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx
ถ้าไฟล์ที่เป็นไฟล์ซิปที่ถูกต้อง (ไม่กี่ไบต์แรก50 4B- ใช้ในรูปแบบเช่น.xlsm) xl/vbaProject.binแล้วเปิดเครื่องรูดไฟล์และมองหาไฟล์ย่อย นี่เป็นไฟล์ CFB เช่นเดียวกับ.xlsไฟล์ ทำตามคำแนะนำสำหรับรูปแบบ XLS (นำไปใช้กับไฟล์ย่อย) จากนั้นเพียงบีบอัดเนื้อหา
สำหรับรูปแบบ XLS คุณสามารถทำตามวิธีอื่นในโพสต์นี้ ฉันชอบค้นหาDPB=บล็อกและแทนที่ข้อความเป็นการส่วนตัว
CMG="..."
DPB="..."
GC="..."มีช่องว่าง สิ่งนี้จะตัดปัญหาเรื่องขนาดคอนเทนเนอร์ของ CFB
ฉันลองวิธีการแก้ปัญหาด้านบนและไม่สามารถใช้งานได้สำหรับฉัน (ไฟล์ excel 2007 xlsm) จากนั้นฉันก็พบวิธีแก้ไขปัญหาอื่นที่แม้แต่เรียกรหัสผ่านไม่เพียงแค่ถอดรหัส
ใส่รหัสนี้ในโมดูลเรียกใช้และให้เวลา มันจะกู้คืนรหัสผ่านของคุณโดยดุร้าย
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 SubElcomSoftทำให้สำนักงานขั้นสูง Breaker รหัสผ่านและสำนักงานขั้นสูงกู้คืนรหัสผ่านผลิตภัณฑ์ที่อาจนำไปใช้กับกรณีนี้ตราบใดที่เอกสารถูกสร้างขึ้นใน Office 2007 หรือก่อน
ทอม - ฉันทำข้อผิดพลาดเด็กนักเรียนในขั้นต้นเนื่องจากฉันไม่ได้ดูขนาดไบต์และฉันคัดลอกและวางจากชุด "CMG" เป็นรายการถัดไป นี่เป็นขนาดข้อความสองแบบที่แตกต่างกันระหว่างสองไฟล์แม้ว่าฉันจะทำโปรเจ็กต์ VBA หายไปตามที่ Stewbob เตือน
เมื่อใช้ HxD จะมีตัวนับติดตามที่คุณเลือกไฟล์ คัดลอกเริ่มจาก CMG จนกระทั่งตัวนับอ่าน 8F (ฐานสิบหกสำหรับ 143) และเช่นเดียวกันเมื่อวางลงในไฟล์ที่ถูกล็อค - ฉันลงเอยด้วยจำนวน "... " ในตอนท้ายของการวางซึ่งดูแปลก ๆ และรู้สึกเกือบ ผิดธรรมชาติ แต่มันได้ผล
ฉันไม่รู้ว่ามันสำคัญหรือไม่ แต่ฉันแน่ใจว่าฉันปิดตัวแก้ไข hex และ excel ลงก่อนที่จะเปิดไฟล์ใน Excel อีกครั้ง ฉันต้องผ่านเมนูเพื่อเปิดตัวแก้ไข VB เข้าไปในคุณสมบัติ VBProject และป้อนรหัสผ่าน 'ใหม่' เพื่อปลดล็อกรหัส
ฉันหวังว่านี่จะช่วยได้.
เครื่องมือVbaDiffของฉันอ่าน VBA โดยตรงจากไฟล์ดังนั้นคุณสามารถใช้เพื่อกู้คืนรหัส VBA ที่ป้องกันจากเอกสารสำนักงานส่วนใหญ่โดยไม่ต้องใช้ตัวแก้ไข hex
การป้องกันเป็นการเปรียบเทียบข้อความอย่างง่ายใน Excel โหลด Excel ในเครื่องมือดีบั๊กที่คุณชื่นชอบ ( Ollydbgเป็นเครื่องมือที่ฉันเลือก) ค้นหารหัสที่ทำการเปรียบเทียบและแก้ไขให้คืนค่าเป็นจริงเสมอซึ่งจะช่วยให้คุณเข้าถึงมาโครได้
สำหรับ Excel 2016 64 บิตบนเครื่องที่ใช้ Windows 10 ฉันได้ใช้โปรแกรมแก้ไขฐานสิบหกเพื่อเปลี่ยนรหัสผ่านของ xla ที่ได้รับการป้องกัน (ไม่ได้ทดสอบสิ่งนี้กับส่วนขยายอื่น ๆ ) เคล็ดลับ:สร้างข้อมูลสำรองก่อนที่จะทำเช่นนี้
ขั้นตอนที่ฉันทำ:
ฉันหวังว่านี่จะช่วยให้คุณบางคน!
นามสกุลไฟล์ excel ของคุณเปลี่ยนเป็น xml และเปิดใน notepad ค้นหารหัสผ่านในไฟล์ xml
คุณเห็นเหมือนบรรทัดด้านล่าง;
Sheets("Sheet1").Unprotect Password:="blabla"(ขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน)
ถ้าคุณทำงานในคุณอาจลองJava VBAMacroExtractorหลังจากแตกสคริปต์ VBA ออกจาก.xlsmฉันพบรหัสผ่านในรูปแบบธรรมดา