هل هناك طريقة لكسر كلمة المرور في Excel VBA Project؟



Answers

نعم ، طالما أنك تستخدم جدول بيانات بتنسيق .xls (الإعداد الافتراضي لـ Excel حتى عام 2003). بالنسبة لبرنامج Excel 2007 فصاعدًا ، يكون .xlsx الافتراضي هو .xlsx ، وهو تنسيق آمن إلى حد ما ، ولن تعمل هذه الطريقة.

كما يقول Treb ، إنها مقارنة بسيطة. أسلوب واحد هو ببساطة تبديل إدخال كلمة المرور في الملف باستخدام محرر سداسي عشرية (انظر Hex editors لـ Windows ). مثال خطوة بخطوة:

  1. قم بإنشاء ملف اكسل بسيط جديد.
  2. في الجزء VBA ، قم بتعيين كلمة مرور بسيطة (قل - 1234).
  3. احفظ الملف واخرج. ثم تحقق من حجم الملف - انظر ستوتشوب مسكيت
  4. افتح الملف الذي أنشأته للتو باستخدام محرر ست عشري.
  5. انسخ الأسطر التي تبدأ بالمفاتيح التالية:

    CMG=....
    DPB=...
    GC=...
    
  6. FIRST BACKUP ملف excel الذي لا تعرف كلمة مرور VBA له ، ثم افتحه باستخدام محرر hex ، وقم بلصق الأسطر المنسوخة أعلاه من الملف الوهمي.

  7. احفظ ملف excel وقم بالخروج.
  8. الآن ، افتح ملف اكسل تحتاج إلى رؤية رمز VBA. ستكون كلمة المرور لرمز VBA ببساطة 1234 (كما في المثال الذي أقوم بعرضه هنا).

إذا كنت بحاجة إلى العمل مع Excel 2007 أو 2010 ، فهناك بعض الإجابات الأخرى أدناه والتي قد تساعدك ، خاصةً: 1 ، 2 ، 3 .

EDIT فبراير 2015: لطريقة أخرى تبدو واعدة جدًا ، انظر إلى هذه الإجابة الجديدة التي كتبها Thanc Thanh Nguyễn.

Question

لقد طُلب مني تحديث بعض وحدات ماكرو Excel 2003 ، ولكن مشاريع VBA محمية بكلمة مرور ، ويبدو أن هناك نقص في الوثائق ... لا أحد يعرف كلمات المرور.

هل هناك طريقة لإزالة أو تصدع كلمة المرور على مشروع VBA؟




لقد بنيت على الجواب Đức ثانه نغوين رائع للسماح هذه الطريقة للعمل مع إصدارات 64 بت من Excel. أنا أدير Excel 2010 64 بت على 64 بت ويندوز 7.

  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
    

إخلاء المسؤولية لقد عمل هذا من أجلي ولقد وثّقتُه هنا على أمل أن يساعد ذلك شخصًا ما. لم أختبره بالكامل . يرجى التأكد من حفظ جميع الملفات المفتوحة قبل متابعة هذا الخيار.




جربت بعض الحلول أعلاه ولا يعمل أي منها لي (excel 2007 xlsm file). ثم وجدت حلا آخر حتى استرجاع كلمة المرور ، وليس فقط الكراك.

أدخل هذا الرمز في الوحدة النمطية ، ثم قم بتشغيله وإعطائه بعض الوقت. فإنه سيتم استرداد كلمة المرور الخاصة بك عن طريق القوة الغاشمة.

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



توم - لقد ارتكبت خطأ تلميذ في البداية حيث لم أشاهد حجم البايت وبدلاً من ذلك قمت بنسخ ولصق من "CMG" التي أقيمت للدخول اللاحق. هذا كان حجم النص مختلفين بين الملفين ، رغم ذلك ، وفقدت مشروع VBA تماما كما حذر Stewbob.

باستخدام HxD ، هناك عداد تتبع مقدار الملف الذي تختاره. نسخ بدءا من CMG حتى العداد يقرأ 8F (عرافة ل 143) وبالمثل عند لصق في ملف مؤمن - انتهى بي الأمر مع ضعف عدد "..." في نهاية العجينة ، التي بدت غريبة بطريقة أو بأخرى وشعرت تقريبا غير طبيعي ، لكنه نجح.

لا أعلم ما إذا كان الأمر بالغ الأهمية ، لكنني تأكدت من إغلاق كل من المحرر السداسي والتفوق قبل إعادة فتح الملف في Excel. ثم كان علي أن أذهب من خلال القوائم لفتح محرر VB ، في خصائص VBProject وإدخالها في كلمة المرور "الجديدة" لفتح الرمز.

آمل أن يساعد هذا.




بالنسبة لـ Excel 2016 64-bit على جهاز يعمل بنظام التشغيل Windows 10 ، فقد استخدمت محرر سداسي عشرية لتتمكن من تغيير كلمة مرور xla المحمية (لم تختبر هذا لأي ملحقات أخرى). نصيحة: قم بإنشاء نسخة احتياطية قبل القيام بذلك.

الخطوات التي اتخذتها:

  1. افتح vba في محرر سداسي عشرية (على سبيل المثال ، XVI)
  2. ابحث في هذا DPB
  3. تغيير DPB إلى شيء آخر ، مثل DPX
  4. احفظها!
  5. إعادة فتح. xla ، ستظهر رسالة خطأ ، فقط تابع.
  6. يمكنك الآن تغيير كلمة مرور .xla عن طريق فتح الخصائص والانتقال إلى علامة تبويب كلمة المرور.

آمل أن يكون هذا ساعد البعض منكم!




تقوم الأداة الخاصة بي ، VbaDiff ، بقراءة VBA مباشرة من الملف ، بحيث يمكنك استخدامها لاسترداد رمز VBA المحمي من معظم مستندات Office دون اللجوء إلى محرر سداسي عشرية.




هل حاولت ببساطة فتحها في OpenOffice.org؟

واجهت مشكلة مماثلة منذ بعض الوقت ووجدت أن Excel و Calc لم يفهمان تشفير كل منهما ، وبالتالي سمحت بالوصول المباشر إلى كل شيء تقريبًا.

كان هذا منذ فترة ، لذلك إذا لم يكن هذا مجرد صدفة من جانبي فقد يكون قد تم تصحيحه أيضًا.




ل. .xlsm تحتاج إلى القيام بذلك بطريقة مختلفة قليلا.

  1. تغيير ملحق ملف .xlsm إلى .zip .
  2. افتح الملف .zip (مع WinZip أو WinRar وغيرها) وانتقل إلى المجلد xl.
  3. استخراج ملف vbaProject.bin وفتحه في محرر سداسي عشري.
  4. ابحث عن DPx واحفظ الملف.
  5. استبدال الملف vbaProject.bin القديم مع هذا الجديد على في ملف مضغوط.
  6. قم بتغيير ملحق الملف إلى .xlsm .
  7. فتح المصنف تخطي رسائل التحذير.
  8. افتح Visual Basic داخل Excel.
  9. انتقل إلى أدوات> خصائص VBAProject> علامة التبويب حماية.
  10. ضع كلمة مرور جديدة واحفظ ملف .xlsm .
  11. أغلق وأعد فتح وستعمل كلمة المرور الجديدة.



إذا كان الملف ملفًا مضغوطًا صالحًا (البايتات القليلة الأولى هي 50 4B - المستخدمة في تنسيقات مثل .xlsm ) ، xl/vbaProject.bin بفك ضغط الملف وابحث عن ملف xl/vbaProject.bin . هذا ملف CFB تماماً مثل ملفات .xls . اتبع الإرشادات لتنسيق XLS (مطبق على ملف فرعي) ثم قم فقط بضغط المحتويات.

بالنسبة إلى تنسيق XLS ، يمكنك اتباع بعض الطرق الأخرى في هذه المشاركة. أنا شخصيا أفضل البحث عن DPB= كتلة واستبدال النص

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

مع مساحات فارغة. هذا يغفل قضايا حجم حاوية CFB.




يكون Colin Pickard في الغالب صحيحًا ، ولكن لا تخلط بين الحماية "بكلمة المرور" للملف بأكمله باستخدام الحماية بكلمة مرور VBA ، والتي تختلف تمامًا عن السابق وهي نفسها بالنسبة لـ Office 2003 و 2007 (لـ Office 2007 ، إعادة تسمية الملف إلى .zip وابحث عن vbaProject.bin داخل الرمز البريدي). ومن الناحية التقنية ، فإن الطريقة الصحيحة لتحرير الملف هي استخدام عارض مستندات مجمع OLE مثل CFX لفتح التدفق الصحيح. بالطبع ، إذا كنت تقوم باستبدال وحدات البايت فقط ، قد يعمل محرر الثنائي القديم العادي.

راجع للشغل ، إذا كنت تتساءل عن التنسيق الدقيق لهذه الحقول ، فهي موثقة الآن:

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




Links