มีวิธีถอดรหัสรหัสผ่านในโครงการ Excel VBA หรือไม่


485

ฉันถูกขอให้อัปเดตมาโคร Excel 2003 บางตัว แต่โครงการ VBA ได้รับการปกป้องด้วยรหัสผ่านและดูเหมือนว่าไม่มีเอกสารประกอบ ... ไม่มีใครรู้รหัสผ่าน

มีวิธีการลบหรือถอดรหัสรหัสผ่านในโครงการ VBA หรือไม่?


คุณสามารถบันทึกเป็น. xls แทนที่จะเป็น. xla ตามตัวอย่างในลิงก์ของคุณหรือไม่ ไม่แน่ใจว่าสิ่งนี้จะสร้างความแตกต่าง
B Hart

4
เป็นที่รู้จักกันดี: xlsb มีความทนทานต่อเทคนิคการแคร็กรหัสผ่าน
Qbik

20
@ Fandango68 คำถามนี้ถูกกล่าวถึงในปีที่ผ่านมาเกี่ยวกับเมตา TLDR: คำถามมากมายเกี่ยวกับ SO นั้นอาจถูกทารุณกรรมโดยนักแสดงที่ไม่ดี แต่หากไม่มีหลักฐานที่ชัดเจนเกี่ยวกับการทำผิดเราถือว่ามีความเชื่อที่ดี มีเหตุผลทางกฎหมายและจริยธรรมมากมายในการถอดรหัสรหัสผ่าน VBA นอกจากนี้การพูดคุยถึงจุดอ่อนของระบบปัจจุบันในที่สุดก็มีส่วนช่วยรักษาความปลอดภัยที่ดีขึ้นในอนาคตและกีดกันผู้คนจากการพึ่งพาระบบที่ไม่ปลอดภัยในขณะนี้
jmbpiano

คำตอบ:


699

คุณสามารถลองVBAใช้วิธีนี้โดยตรงซึ่งไม่ต้องการการแก้ไข HEX มันจะทำงานกับไฟล์ใด ๆ (* .xls, * .xlsm, * .xlam ... )

ผ่านการทดสอบและใช้งานได้บน:

Excel 2007
Excel 2010
Excel 2013 - รุ่น 32 บิต
Excel 2016 - รุ่น 32 บิต

กำลังมองหารุ่น 64 บิตอยู่ใช่ไหม ดูคำตอบนี้

มันทำงานอย่างไร

ฉันจะพยายามอย่างเต็มที่เพื่ออธิบายวิธีการทำงาน - โปรดขอโทษภาษาอังกฤษของฉัน

  1. VBE จะเรียกใช้ฟังก์ชันของระบบเพื่อสร้างกล่องโต้ตอบรหัสผ่าน
  2. หากผู้ใช้ป้อนรหัสผ่านที่ถูกต้องและคลิกตกลงฟังก์ชั่นนี้จะส่งคืน 1 หากผู้ใช้ป้อนรหัสผ่านผิดหรือคลิกยกเลิกฟังก์ชั่นนี้จะคืนค่า 0
  3. หลังจากปิดกล่องโต้ตอบ VBE จะตรวจสอบค่าที่ส่งคืนของฟังก์ชันระบบ
  4. ถ้าค่านี้เป็น 1 VBE จะ "คิด" ว่ารหัสผ่านถูกต้องดังนั้นโครงการ VBA ที่ถูกล็อคจะเปิดขึ้น
  5. รหัสด้านล่างจะสลับหน่วยความจำของฟังก์ชั่นดั้งเดิมที่ใช้ในการแสดงกล่องโต้ตอบรหัสผ่านด้วยฟังก์ชั่นที่ผู้ใช้กำหนดซึ่งจะส่งคืน 1 เสมอเมื่อถูกเรียก

ใช้รหัส

โปรดสำรองไฟล์ของคุณก่อน!

  1. เปิดไฟล์ที่มีโครงการ VBA ที่ถูกล็อคของคุณ
  2. สร้างไฟล์ 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
  3. วางรหัสนี้ภายใต้รหัสด้านบนในModule1และเรียกใช้

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
  4. กลับมาที่โครงการ VBA ของคุณแล้วสนุกไปกับมัน


4
@ Chris คุณพูดถูก เพราะฟังก์ชั่น Windows API ถูกกำหนดไว้สำหรับ win 32 ในรหัสนี้
Thanc Thanh Nguyễn

8
คำอธิบายบางอย่างจะดีของวิธีการทำงาน
Dennis G

20
ตอนนี้คำถามเดียวที่เหลือ (หลังจากที่ได้เห็นวิธีการที่น่าประทับใจนี้ทำงานอย่างสมบูรณ์) เป็นว่านรกฉันสามารถทำให้โครงการ VBA ของฉันที่มีการป้องกันที่แข็งแกร่งเพื่อป้องกันไม่ให้ผู้อื่นใช้สับบนนี้ :)
EranG

6
รหัสนี้ทำงานได้อย่างสมบูรณ์ในการปลดล็อครหัส VBA แม้ว่าทุกครั้งที่ฉันใช้รหัสนี้จะป้องกันไม่ให้ฉันปกป้องโครงการด้วยรหัสผ่านที่แตกต่างกันมีคนอื่นมีปัญหานี้หรือไม่
Matthew Bond

2
ฉันพบว่ามันขัดกับโครงการ VBA ในไฟล์ Excel ดังนั้นฉันต้องส่งออกโมดูล / คลาสทั้งหมดจากนั้นบันทึกไฟล์เป็น xlsx (ไม่ใช่มาโคร) จากนั้นปิดไฟล์ (stupid Excel) จากนั้นเปิดใหม่อีกครั้งจากนั้น โมดูลนำเข้าและคัดลอกรหัสจากไฟล์คลาส ณ จุดนี้ฉันสามารถบันทึกไฟล์เป็น xlsm ด้วยรหัสผ่านของฉันเองในโครงการ VBA
BH

217

ใช่มีตราบใดที่คุณกำลังใช้.xlsสเปรดชีตรูปแบบ (ค่าเริ่มต้นสำหรับ Excel สูงถึง 2003) สำหรับ Excel 2007 เป็นต้นไปค่าเริ่มต้น.xlsxซึ่งเป็นรูปแบบที่ค่อนข้างปลอดภัยและวิธีนี้จะไม่ทำงาน

อย่างที่ Treb กล่าวมันเป็นการเปรียบเทียบที่ง่าย วิธีหนึ่งคือเพียงสลับรายการรหัสผ่านในไฟล์โดยใช้โปรแกรมแก้ไขฐานสิบหก (ดูที่โปรแกรมแก้ไขฐานสิบหกสำหรับ Windows ) ตัวอย่างทีละขั้นตอน:

  1. สร้างไฟล์ excel อย่างง่ายใหม่
  2. ในส่วน VBA ให้ตั้งรหัสผ่านง่าย ๆ (พูด - 1234)
  3. บันทึกไฟล์และออก จากนั้นตรวจสอบขนาดไฟล์ - ดูgotcha ของ Stewbob
  4. เปิดไฟล์ที่คุณเพิ่งสร้างด้วยตัวแก้ไข hex
  5. คัดลอกบรรทัดที่ขึ้นต้นด้วยคีย์ต่อไปนี้:

    CMG=....
    DPB=...
    GC=...
  6. สำรองไฟล์ excel แรกที่คุณไม่ทราบรหัสผ่าน VBA จากนั้นเปิดด้วยโปรแกรมแก้ไขฐานสิบหกของคุณและวางบรรทัดที่คัดลอกด้านบนจากไฟล์จำลอง

  7. บันทึกไฟล์ excel และออก
  8. ตอนนี้เปิดไฟล์ excel ที่คุณต้องเห็นรหัส VBA รหัสผ่านสำหรับรหัส VBA จะเป็น 1234 (ตามตัวอย่างที่ฉันแสดงที่นี่)

หากคุณจำเป็นต้องทำงานกับ Excel 2007 หรือปี 2010 มีบางคำตอบอื่น ๆ ดังต่อไปนี้ซึ่งอาจจะช่วยโดยเฉพาะอย่างยิ่งเหล่านี้: 1 , 2 , 3

แก้ไขก.พ. 2558: สำหรับวิธีอื่นที่ดูดีมากลองดูคำตอบใหม่นี้โดย Thanc Thanh Nguyễn


เกิดอะไรขึ้นถ้าไม่มีบรรทัดที่ขึ้นต้นด้วย CMG = ...
systemovich

1
ในไฟล์ excel ที่ว่างเปล่าหรือไฟล์ที่ถูกล็อค? ตรวจสอบขนาดไฟล์ของไฟล์เปล่า หากเป็นไฟล์ที่ถูกล็อคตรวจสอบให้แน่ใจว่าข้อมูลสำรองของคุณปลอดภัยแล้วลองเปลี่ยนอีกสองบรรทัด คุณแน่ใจหรือว่าเป็นไฟล์ที่เข้ารหัส?
Colin Pickard

6
การป้องกันด้วยรหัสผ่าน Excel 2007 (และรูปแบบไฟล์) นั้นแตกต่างจาก Excel 2003 อย่างสิ้นเชิงฉันได้รวมข้อมูลเฉพาะไว้ในคำตอบด้านล่าง ในความคิดของฉันตัวเลือกการป้องกันด้วยรหัสผ่านในไฟล์ Excel 2007 เป็นครั้งแรกในประวัติศาสตร์ Microsoft Office ที่พวกเขาได้สร้างไฟล์ที่ปลอดภัยพอสมควร
Stewbob

1
ฉันไม่สามารถตั้งรหัสผ่าน vba ในไฟล์ใหม่ของ excel 2016 มีใครบางคนสามารถแบ่งปัน HEX เพื่อแทนที่ด้วย 1234 หรือไม่ หรือสามารถเปลี่ยนจากเครื่องเป็นเครื่องได้?
Mescalito

1
วิธีนี้ใช้ได้กับฉันในไฟล์. xlsm ฉันบันทึกเป็น. xls ทำสิ่งนี้แล้วแปลงกลับเป็น. xlsm ควรสังเกตว่าคุณสามารถเพิ่มความยาวของไฟล์ได้อย่างปลอดภัยหากCMG...สตริงใหม่ยาวกว่าเดิม
Drew Chapin

173

ฉันได้สร้างคำตอบที่ยอดเยี่ยมของ Thanc Thanh Nguyễnเพื่อให้วิธีนี้ทำงานกับ Excel เวอร์ชัน 64 บิต ฉันใช้ Excel 2010 64-Bit บน Windows 7 บิต 64

  1. เปิดไฟล์ที่มีโครงการ VBA ที่ถูกล็อคของคุณ
  2. สร้างไฟล์ 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
  3. วางรหัสนี้ในModule2และเรียกใช้

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

การปฏิเสธความรับผิดสิ่งนี้ได้ผลสำหรับฉันและฉันได้บันทึกไว้ที่นี่ด้วยความหวังว่ามันจะช่วยใครบางคนออกมา ฉันไม่ได้ทดสอบอย่างเต็มที่ โปรดอย่าลืมบันทึกไฟล์ที่เปิดอยู่ทั้งหมดก่อนที่จะดำเนินการต่อด้วยตัวเลือกนี้


1
ฉันไม่แน่ใจว่าทำไม แต่เมื่อฉันเรียกใช้งานบน Excel สำหรับ 365 MSP 64 บิตขัดข้อง Excel มันจะปิดไฟล์และเมื่อฉันรีสตาร์ทรหัสผ่านยังคงอยู่
eborbath

สิ่งนี้ไม่สามารถทำได้ใน excel อีกต่อไปเนื่องจากตัวเลือกในเมนูบริบทเป็นสีเทาดังนั้นคุณจึงไม่สามารถสร้างโมดูลได้
thanos.a

170

มีวิธีแก้ปัญหาอื่น (ค่อนข้างง่าย) โดยไม่มีปัญหาเรื่องขนาด ฉันใช้วิธีนี้ในวันนี้ (ในไฟล์ XLS ปี 2003 โดยใช้ Excel 2007) และประสบความสำเร็จ

  1. สำรองข้อมูลไฟล์ xls
  2. เปิดไฟล์ในตัวแก้ไข HEX และค้นหาชิ้นDPB=...ส่วน
  3. เปลี่ยนDPB=...สตริงเป็นDPx=...
  4. เปิดไฟล์ xls ใน Excel
  5. เปิดเครื่องมือแก้ไข VBA ( ALT+ F11)
  6. ความมหัศจรรย์: Excel ค้นพบคีย์ที่ไม่ถูกต้อง (DPx) และถามว่าคุณต้องการโหลดโครงการต่อหรือไม่ (โดยทั่วไปไม่สนใจการป้องกัน)
  7. คุณจะสามารถเขียนทับรหัสผ่านดังนั้นเปลี่ยนเป็นสิ่งที่คุณจำได้
  8. บันทึกไฟล์ xls *
  9. ปิดและเปิดเอกสารอีกครั้งและทำงานมายากล VBA ของคุณ!

* หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนรหัสผ่านเป็นค่าใหม่มิฉะนั้นครั้งต่อไปที่คุณเปิดสเปรดชีต Excel จะรายงานข้อผิดพลาด (ข้อผิดพลาดที่ไม่คาดคิด) จากนั้นเมื่อคุณเข้าถึงรายการของโมดูล VBA คุณจะเห็นชื่อของ โมดูลแหล่งที่มา แต่ได้รับข้อผิดพลาดอื่นเมื่อพยายามเปิดฟอร์ม / รหัส / ฯลฯ เพื่อแก้ไขปัญหานี้กลับไปที่คุณสมบัติโครงการ VBA และตั้งรหัสผ่านเป็นค่าใหม่ บันทึกและเปิดเอกสาร Excel อีกครั้งและคุณน่าจะไปได้ดี!


3
น่าเสียดายนี่ใช้ไม่ได้กับ Excel สำหรับ Mac 2011 v14.2.5 ฉันได้รับตัวเลือกในการซ่อมแซมไฟล์ไม่รีเซ็ตรหัสผ่านและผลที่ได้คือการสูญเสียสคริปต์ VBA ทั้งหมด
Joe Carroll

โซลูชั่นที่สมบูรณ์แบบ - ฉันทำสิ่งนี้กับไฟล์ 2003 โดยใช้ HxD Hex Editor
Chris W

4
ฉันเพิ่งลอง (.xls, Excel 2007) และใช้งานไม่ได้ ผลการสอบคือ: โมดูลที่สามารถมองเห็นรหัสไม่แน่นอนดูเหมือนจะทำงาน แต่เมื่อเปิดโมดูลมันบอกว่าข้อผิดพลาดที่ไม่คาดคิด (40230)
KekuSemau

2
ข้อผิดพลาดเดียวกันที่นี่ (Excel 2010) - แต่จากนั้นฉันก็รู้ว่าฉันข้าม 'ตั้งรหัสผ่านใหม่และบันทึก / เปิดใหม่' (ขั้นตอนที่ 7-9) จาก Pieter
โอเว่น B

+1 วิธีนี้ใช้ได้กับไฟล์ access (.mdb) ที่พัฒนาแล้วของเราด้วย! ตอนนี้เราสามารถทำให้ดีขึ้นได้ขอบคุณสำหรับสิ่งนี้!
Er Gabriel Doronila

65

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 และเรียกดูเนื้อหาไฟล์ได้อีก


จากนั้นคุณต้องใช้เครื่องมือการแฮ็คไปรษณีย์มาตรฐาน มันไม่มีปัญหา "ฉันจะสำรองไฟล์ excel ได้อย่างไร"
ไม่ระบุตัวตนพิมพ์

3
@Anonymous Type: ฉันคิดว่าเครื่องมือถอดรหัส zip จะไม่ช่วย ดังที่ฉันเข้าใจ Stewbob ไม่ใช่รายการไฟล์ในไฟล์ zip ที่ถูกเข้ารหัส แต่ไฟล์ zip ทั้งหมดนั้นควรรวมส่วนหัวและไดเรกทอรีกลาง
Treb

2
แค่อยากรู้อยากเห็น: มันจะเป็น RSA ได้อย่างไรเมื่อฉันป้อนรหัสผ่านเดียว (สมมาตร)
kizzx2

เมื่อไหร่ที่ไฟล์ที่คุณต้องการเข้าไปมีปุ่มที่สั้นกว่า? เพียงสร้าง vba docs ต่อไปจนกว่าคุณจะได้ 137 ที่?
ไม่มี

1
คุณแน่ใจหรือไม่ว่า zipfile ทั้งหมดถูกเข้ารหัสเมื่อคุณล็อคโครงการ VBA ฉันยังคงสามารถเปิด zipfile และดูโครงสร้างไฟล์ .... และโฟลเดอร์ย่อย xl \ มีไฟล์ vbaProject.binซึ่งมี "CMG = ... GC =" hashing block ที่คุ้นเคย
Nigel Heffernan

63

สำหรับประเภทไฟล์.xlsmหรือ.dotmคุณต้องใช้วิธีที่แตกต่างกันเล็กน้อย

  1. เปลี่ยนนามสกุลของไฟล์.xlsm.zip
  2. เปิดไฟล์. zip (พร้อม WinZip หรือ WinRar ฯลฯ ) แล้วไปที่โฟลเดอร์ xl
  3. แตกvbaProject.binไฟล์และเปิดใน Hex Editor (ฉันใช้HxDซึ่งเป็นไฟล์ที่ฟรีและมีน้ำหนักเบา)
  4. ค้นหาDPBและแทนที่ด้วยDPxและบันทึกไฟล์
  5. แทนที่vbaProject.binไฟล์เก่าด้วยไฟล์ใหม่นี้ในไฟล์ซิป
  6. .xlsmเปลี่ยนนามสกุลไฟล์กลับไป
  7. เปิดสมุดงานข้ามข้อความเตือน
  8. เปิด Visual Basic ภายใน Excel
  9. ไปที่เครื่องมือ> คุณสมบัติ VBAProject> แท็บการป้องกัน
  10. ใส่รหัสผ่านใหม่และบันทึก.xlsmไฟล์
  11. ปิดและเปิดใหม่และรหัสผ่านใหม่ของคุณจะทำงาน

8
ทำงานใน Excel 2016, Windows 10 64 บิต (ไฟล์ xlsm)
LimaNightHawk

3
ทำงานใน Word 2016, Windows 10 64 บิต (ไฟล์ dotm)
NBajanca

7
ทางออกที่ยอดเยี่ยมทำงานให้ฉันใน Excel 2013 64 บิต คุณสามารถข้ามการเปลี่ยนนามสกุลไฟล์เป็น.zipหากคุณติดตั้ง7-Zip ในกรณีนี้คุณสามารถคลิกขวาที่.xlsmไฟล์และเลือก"7-Zip -> Open Archive"
nkatsar

ทำงานร่วมกับ Word 2013, win7x64 (มันเป็นเรื่องที่น่าเศร้ามากที่ถูกหลอกให้เชื่อได้ง่ายว่ารหัสนั้นค่อนข้างปลอดภัย)
Berry Tsakala

1
@ThierryMichel การรวมกันของโซลูชั่นก่อนหน้านี้และการทดลองและข้อผิดพลาด!
แมตต์

35

เป็นค่าชี้ให้เห็นว่าถ้าคุณมีไฟล์ Excel 2007 (xlsm) คุณสามารถบันทึกเป็นไฟล์ Excel 2003 (xls) และใช้วิธีการที่ระบุไว้ในคำตอบอื่น ๆ


4
ไม่เป็นความจริงฉันได้ทำงานกับไฟล์ที่การแปลงเป็น xls / xla จาก xlsm เป็นไปไม่ได้ Excel 2007 และ 2010 ล้มเหลวในแต่ละครั้งฉันได้ลองใช้อินสแตนซ์ต่าง ๆ จากข้อความแสดงข้อผิดพลาดหนึ่งข้อ - ข้อผิดพลาด: c0000005 005d211d
Qbik

4
ใช่คุณสามารถทำได้ ฉันทำไปแล้วหลายครั้ง หากมีบางสิ่งบางอย่างบนแผ่นงานซึ่งมีความจำเป็นและสิ่งที่ไม่ได้โอนไปยังรุ่นเก่าที่ฉันทำนี้: 1.แปลง. xlsm เป็น. xls 2.ถอดรหัสรหัสของ. xls 3.แปลง. xlsm เป็น. xlsx 4.ใส่รหัสจากโมดูลใน. xls เป็น xlsx และบันทึกเป็น. xlsm
ZygD

มันทำงานหลังจากแปลง xlsm เป็น xls เหมือนในคำตอบ
Purus

32

เมื่อถึงตาของฉันสิ่งนี้สร้างขึ้นจากคำตอบที่ยอดเยี่ยมของ kaybee99 ซึ่งสร้างขึ้นจากคำตอบที่ยอดเยี่ยมของ Thanc Thanh Nguy allown เพื่อให้วิธีนี้ใช้ได้กับ Office ทั้งรุ่น x86 และ amd64

ภาพรวมของสิ่งที่มีการเปลี่ยนแปลงเราหลีกเลี่ยงการกด / ret ซึ่ง จำกัด อยู่ที่ 32 บิตและแทนที่ด้วย mov / jmp reg

ผ่านการทดสอบและใช้งานได้

โปรแกรม Word / Excel 2016 - รุ่น 32 บิต
โปรแกรม Word / Excel 2016 - รุ่น 64 บิต

มันทำงานอย่างไร

  1. เปิดไฟล์ที่มีโครงการ VBA ที่ถูกล็อคของคุณ
  2. สร้างไฟล์ใหม่ด้วยประเภทเดียวกันกับด้านบนและเก็บรหัสนี้ใน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. วางรหัสนี้ในModule2และเรียกใช้

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

3
ที่สมบูรณ์แบบ! ทำงานกับ Windows Server 2016, Excel 2016 32 บิต
Zin Min

สิ่งนี้ใช้ได้กับไฟล์. xlsm ใน Excel Office 365 ขอบคุณ!
Ryan James

ยังคงใช้งานได้ในปี 2019, Office 365 64 บิต latests บิวด์เจ๋งมาก!
XavierAM

ขอบคุณสำหรับโค้ดที่อัปเดตฉันพบกับข้อขัดข้องในการใช้งานเวอร์ชันก่อนหน้า (64 บิต) แต่ทั้งหมดนี้ใช้ได้กับเวอร์ชั่นของคุณ
emjaySX

ดีเลิศ ... ทำงานได้อย่างสมบูรณ์แบบ
มาห์ห์ดี

17

คุณลองเปิดมันใน OpenOffice.org หรือไม่?

ฉันมีปัญหาที่คล้ายกันเมื่อไม่นานมานี้และพบว่า Excel และ Calc ไม่เข้าใจการเข้ารหัสของกันและกันและอนุญาตให้เข้าถึงทุกอย่างได้โดยตรง

เมื่อไม่นานมานี้ดังนั้นหากนั่นไม่ใช่แค่ความบังเอิญในส่วนของฉันมันอาจถูกแก้ไขด้วย


15

ในกรณีที่บล็อกของ 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


1
ใช้งานได้ แต่เมื่อฉันเพิ่งค้นพบ (แสดงความคิดเห็นด้านบน) เมื่อเร็ว ๆ นี้คุณยังสามารถเพิ่มตัวละครที่เป็นโมฆะได้หลังจากการอ้างปิดครั้งสุดท้ายในบล็อก GC = "... " จนกว่าคุณจะตียาวเท่ากัน
tobriand

13

สำหรับ Excel 2007 เป็นต้นไปคุณจะต้องเปลี่ยนนามสกุลไฟล์เป็น. zip ในไฟล์เก็บถาวรมีโฟลเดอร์ย่อย xl อยู่ในนั้นคุณจะพบ vbaProject.bin ทำตามขั้นตอนข้างต้นด้วย vbaProject.bin จากนั้นบันทึกลงในไฟล์เก็บถาวร ปรับเปลี่ยนส่วนขยายของคุณและกลับ! (หมายถึงทำตามขั้นตอนด้านบน)


1
ฉันสามารถยืนยันการใช้งานได้กับไฟล์. xlam ด้วย Excel 2010 เช่นกัน +1!
Gimelist

12

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แล้วเปิดด้วยตัวแก้ไข Hex
  • "ค้นหาและแทนที่" กับ "แทนที่ทั้งหมด" เปลี่ยนไปDPBDPX
  • บันทึกการเปลี่ยนแปลงวาง.binไฟล์กลับเข้าไปใน zip กลับไปเป็นนามสกุลปกติและเปิดไฟล์เหมือนปกติ
  • ALT + F11 เพื่อเข้าสู่ตัวแก้ไข VB และคลิกขวาใน Explorer VBA Project Propertiesโครงการที่จะเลือก
  • บนProtectionแท็บตั้งรหัสผ่านใหม่
  • คลิกOKปิดไฟล์เปิดใหม่กด ALT + F11
  • ป้อนรหัสผ่านใหม่ที่คุณตั้งไว้

ถึงตอนนี้คุณสามารถลบรหัสผ่านได้อย่างสมบูรณ์หากคุณเลือก

คำแนะนำที่สมบูรณ์ด้วยวิดีโอขั้นตอนโดยขั้นตอนที่ฉันทำ"ทางกลับเมื่อ"อยู่บนYouTubeที่นี่

เป็นเรื่องที่น่าตกใจที่การแก้ไขปัญหานี้เกิดขึ้นนานหลายปีและ Microsoft ไม่ได้แก้ไขปัญหานี้


คุณธรรมของเรื่องราวหรือไม่

Microsoft Office รหัสผ่าน VBA โครงการจะไม่ได้ที่จะพึ่งพาอาศัยเพื่อความปลอดภัยของใด ๆข้อมูลที่สำคัญ หากความปลอดภัยเป็นสิ่งสำคัญให้ใช้ซอฟต์แวร์เข้ารหัสของบุคคลที่สาม


9

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


2
ลิงค์ต่อไปนี้ให้รายละเอียดสำหรับไฟล์รูปแบบ XSLM gbanik.blogspot.co.uk/2010/08/…วิธีการแก้ปัญหาเช่นเดียวกับที่ระบุไว้โดย Yuhong Bao ข้างต้น แต่ทำให้การอ่านที่น่าสนใจและมีภาพหน้าจอ
JohnLBevan

7

ถ้าไฟล์ที่เป็นไฟล์ซิปที่ถูกต้อง (ไม่กี่ไบต์แรก50 4B- ใช้ในรูปแบบเช่น.xlsm) xl/vbaProject.binแล้วเปิดเครื่องรูดไฟล์และมองหาไฟล์ย่อย นี่เป็นไฟล์ CFB เช่นเดียวกับ.xlsไฟล์ ทำตามคำแนะนำสำหรับรูปแบบ XLS (นำไปใช้กับไฟล์ย่อย) จากนั้นเพียงบีบอัดเนื้อหา

สำหรับรูปแบบ XLS คุณสามารถทำตามวิธีอื่นในโพสต์นี้ ฉันชอบค้นหาDPB=บล็อกและแทนที่ข้อความเป็นการส่วนตัว

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

มีช่องว่าง สิ่งนี้จะตัดปัญหาเรื่องขนาดคอนเทนเนอร์ของ CFB


7

ฉันลองวิธีการแก้ปัญหาด้านบนและไม่สามารถใช้งานได้สำหรับฉัน (ไฟล์ 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 Sub

1
ดี! ฉันคิดว่าคุณมีหนึ่ง downvote เพราะโซลูชันของคุณปลดล็อคเวิร์กชีตแทนที่จะเป็นโมดูล VBA อย่างไรก็ตามฉันพบว่ามันมีประโยชน์ - ขอบคุณมาก!
PBD10017

1
ฉันมีสมุดนี้เป็นสมุดงานส่วนบุคคลของฉัน ผู้เขียนอ้าง Bob McCormick เป็นผู้เขียนต้นฉบับแก้ไขภายหลังโดยนอร์แมนฮาร์เกอร์และ JE McGimpsey 2002.
Charles Byrne

5

ElcomSoftทำให้สำนักงานขั้นสูง Breaker รหัสผ่านและสำนักงานขั้นสูงกู้คืนรหัสผ่านผลิตภัณฑ์ที่อาจนำไปใช้กับกรณีนี้ตราบใดที่เอกสารถูกสร้างขึ้นใน Office 2007 หรือก่อน


4

ทอม - ฉันทำข้อผิดพลาดเด็กนักเรียนในขั้นต้นเนื่องจากฉันไม่ได้ดูขนาดไบต์และฉันคัดลอกและวางจากชุด "CMG" เป็นรายการถัดไป นี่เป็นขนาดข้อความสองแบบที่แตกต่างกันระหว่างสองไฟล์แม้ว่าฉันจะทำโปรเจ็กต์ VBA หายไปตามที่ Stewbob เตือน

เมื่อใช้ HxD จะมีตัวนับติดตามที่คุณเลือกไฟล์ คัดลอกเริ่มจาก CMG จนกระทั่งตัวนับอ่าน 8F (ฐานสิบหกสำหรับ 143) และเช่นเดียวกันเมื่อวางลงในไฟล์ที่ถูกล็อค - ฉันลงเอยด้วยจำนวน "... " ในตอนท้ายของการวางซึ่งดูแปลก ๆ และรู้สึกเกือบ ผิดธรรมชาติ แต่มันได้ผล

ฉันไม่รู้ว่ามันสำคัญหรือไม่ แต่ฉันแน่ใจว่าฉันปิดตัวแก้ไข hex และ excel ลงก่อนที่จะเปิดไฟล์ใน Excel อีกครั้ง ฉันต้องผ่านเมนูเพื่อเปิดตัวแก้ไข VB เข้าไปในคุณสมบัติ VBProject และป้อนรหัสผ่าน 'ใหม่' เพื่อปลดล็อกรหัส

ฉันหวังว่านี่จะช่วยได้.


4

เครื่องมือVbaDiffของฉันอ่าน VBA โดยตรงจากไฟล์ดังนั้นคุณสามารถใช้เพื่อกู้คืนรหัส VBA ที่ป้องกันจากเอกสารสำนักงานส่วนใหญ่โดยไม่ต้องใช้ตัวแก้ไข hex


ฉันทดสอบเครื่องมือนี้และใช้งานได้ดี แต่รุ่นฟรีดึง 53 บรรทัดแรก ในการกู้คืนไฟล์ของฉันฉันต้องทำตามคำแนะนำของ Andy เพื่อปลดล็อครหัสผ่าน จากนั้นฉันก็เปิด xlsm ด้วย VbaDiff ในบานหน้าต่างทั้งสองแล้วฉันก็คลิกรหัสด้วยชีต ฉันได้มันมาพร้อมกับ copy-paste และวางไว้ในไฟล์ excel ที่กู้คืนได้ แต่ vba-empty
thanos.a

2

การป้องกันเป็นการเปรียบเทียบข้อความอย่างง่ายใน Excel โหลด Excel ในเครื่องมือดีบั๊กที่คุณชื่นชอบ ( Ollydbgเป็นเครื่องมือที่ฉันเลือก) ค้นหารหัสที่ทำการเปรียบเทียบและแก้ไขให้คืนค่าเป็นจริงเสมอซึ่งจะช่วยให้คุณเข้าถึงมาโครได้


1

สำหรับ Excel 2016 64 บิตบนเครื่องที่ใช้ Windows 10 ฉันได้ใช้โปรแกรมแก้ไขฐานสิบหกเพื่อเปลี่ยนรหัสผ่านของ xla ที่ได้รับการป้องกัน (ไม่ได้ทดสอบสิ่งนี้กับส่วนขยายอื่น ๆ ) เคล็ดลับ:สร้างข้อมูลสำรองก่อนที่จะทำเช่นนี้

ขั้นตอนที่ฉันทำ:

  1. เปิด vba ใน hex editor (เช่น XVI)
  2. ค้นหา DPB นี้
  3. เปลี่ยน DPB เป็นอย่างอื่นเช่น DPX
  4. บันทึกไว้!
  5. เปิด. xla อีกครั้งข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นเพียงดำเนินการต่อ
  6. ตอนนี้คุณสามารถเปลี่ยนรหัสผ่านของ. xla ได้ด้วยการเปิดคุณสมบัติและไปที่แท็บรหัสผ่าน

ฉันหวังว่านี่จะช่วยให้คุณบางคน!


ฉันประสบความสำเร็จในการเปิด. xls แบบเก่าที่ใช้สิ่งนี้ใน Windows 10 ใน Excel 365 เวอร์ชันล่าสุดในขณะที่คำตอบยอดนิยมนั้นไม่ได้ทำงานอีกต่อไป ฉันดาวน์โหลด HxD และเปลี่ยนอักษรตัวสุดท้ายตามที่แนะนำและข้ามข้อผิดพลาด ตอนนี้ดีมากขอบคุณ!
Starnes Student

0

นามสกุลไฟล์ excel ของคุณเปลี่ยนเป็น xml และเปิดใน notepad ค้นหารหัสผ่านในไฟล์ xml

คุณเห็นเหมือนบรรทัดด้านล่าง;

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

(ขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน)


คุณช่วยอธิบายได้อย่างไรว่าคำตอบของคุณดีกว่าคำตอบที่ดีมากที่มีอยู่แล้ว?
Noel Widmer

โซลูชันของฉันไม่มีรหัส ทางออกที่กะทัดรัดมาก ๆ
นักพัฒนา

1
วิธีการแก้ปัญหาที่คุณให้ไว้ไม่สามารถใช้งานได้ในปี 2019
Daniel L. VanDenBosch

มันไม่ทำงานสำหรับฉันทั้งที่ office 365
thanos.a

0

ถ้าคุณทำงานในคุณอาจลองJava VBAMacroExtractorหลังจากแตกสคริปต์ VBA ออกจาก.xlsmฉันพบรหัสผ่านในรูปแบบธรรมดา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.