Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0043: Paßwort des Bildschirmschoners auslesen

 von 

Beschreibung 

Wer anderer Leutes Bildschirmschonerpaßwort auslesen will, muß in der Registry den entsprechenden Eintrag finden und auslesen. Danach kann man durch Exklusiv-Odern mit dem MS 'Sicherheitsschlüssel' das Paßwort entschlüsseln. Wie das genau geht steht unten.

Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.

Schwierigkeitsgrad:

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

RegCloseKey, RegOpenKeyExA (RegOpenKeyEx), RegQueryValueExA (RegQueryValueEx)

Download:

Download des Beispielprojektes [7,68 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
        Alias "RegOpenKeyExA" (ByVal hKey As Long, _
        ByVal lpSubKey As String, ByVal ulOptions As Long, _
        ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
        Alias "RegQueryValueExA" (ByVal hKey As Long, _
        ByVal lpValueName As String, ByVal lpReserved As Long, _
        lpType As Long, lpData As Any, lpcbData As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal _
        hKey As Long) As Long

Const Key = "48EE761D6769A11B7A8C47F85495975F78D9DA6C59D76B35C577" _
          & "85182A0E52FF00E31B718D3463EB91C3240FB7C2F8E3B6544C35" _
          & "54E7C94928A385110B2C68FBEE7DF66CE39C2DE472C3BB851A12" _
          & "3C32E36B4F4DF4A924C8FA78AD23A1E46D9A04CE2BC5B6C5EF93" _
          & "5CA8852B413772FA574541A1204F80B3D52302643F6CF10F"

Const READ_CONTROL = &H20000
Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const SYNCHRONIZE = &H100000
Const STANDARD_RIGHTS_ALL = &H1F0000
Const ERROR_SUCCESS = 0&
Const KEY_USER = &H80000001

Const KEY_READ = ((STANDARD_RIGHTS_READ Or _
                   KEY_QUERY_VALUE Or _
                   KEY_ENUMERATE_SUB_KEYS Or _
                   KEY_NOTIFY) And _
                   (Not SYNCHRONIZE))
                   
Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or _
                    KEY_SET_VALUE Or _
                    KEY_CREATE_SUB_KEY) And _
                    (Not SYNCHRONIZE))

Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or _
                         KEY_QUERY_VALUE Or KEY_SET_VALUE Or _
                         KEY_CREATE_SUB_KEY _
                         Or KEY_ENUMERATE_SUB_KEYS Or _
                         KEY_NOTIFY Or KEY_CREATE_LINK) And _
                         (Not SYNCHRONIZE))

Const KEY_EXECUTE = ((KEY_READ) And (Not SYNCHRONIZE))

Private Sub Form_Load()
  Dim AA$
   
    Label1.Caption = "Bildschirmschoner Paßwort ->>>"
    AA = Paßwort
    If AA = "" Then AA = "Kein Paßwort vorhanden !"
    Label1.Caption = Label1.Caption & AA & "<<<"
End Sub

Function Paßwort() As String
  Dim X%, Result&, Handle&, CB&, Ret$, AA$
  
    If ERROR_SUCCESS = RegOpenKeyEx(KEY_USER, _
                           "Control Panel\desktop", 0&, KEY_READ, _
                           Handle) Then
      Result = RegQueryValueEx(Handle, "ScreenSave_Data", 0&, 1&, _
                               ByVal Ret, CB)
                               
      Ret = Space(CB)
      Result = RegQueryValueEx(Handle, "ScreenSave_Data", 0&, 1&, _
                               ByVal Ret, CB)
    End If
    
    If ERROR_SUCCESS = RegCloseKey(Handle) Then
      Ret = Left$(Ret, Len(Ret) - 1)
      For X = 1 To Len(Ret) Step 2
        AA = AA & Chr$((HexDez(Mid$(Ret, X, 2)) Xor _
             HexDez(Mid$(Key, X, 2))))
      Next X
      
      Paßwort = AA
    End If
End Function

Function HexDez(H$) As Long
  If Left$(H$, 2) <> "&H" Then H$ = "&H" + H$
  HexDez& = Val(H$)
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von am 20.02.2006 um 13:33

An Axel: WNetVerifyPassword() dürfte nicht gehen - ich habe mal ein Programm geschrieben (lief unter Win95/98SE) das sperrte den Bildschirm (große Form die alles verdeckt) und verlangte nach dem Passwort, welches ich mir dieser API geprüft habe. Aber nach jeder falschen Eingabe wurde mehr Zeit für das prüfen gebraucht, so dass ich nach 30 Versuchen eine Tasse Kaffee holen gehen konnte...

Kommentar von Klaus Diel am 27.01.2005 um 12:31

Leider funktioniert dieser Tipp nicht. Er wird in folgender Routine mit error 5 abgebrochen.
If ERROR_SUCCESS = RegCloseKey(Handle) Then
Ret = Left$(Ret, Len(Ret) - 1)
For X = 1 To Len(Ret) Step 2
AA = AA & Chr$((HexDez(Mid$(Ret, X, 2)) Xor _
HexDez(Mid$(Key, X, 2))))
Next X
..es wird mit dem wert der länge 0 gerechnet (trotz vorhandenem passwort!
...schade.
mfg
Klasu Diel

Kommentar von D.Strauch am 13.05.2003 um 10:03

hi ...habe ein ganz anderes problem!
habe beim kunden ein server stehen bei dem der bildschirmschoner leuft und dazu einen passwort hat!
Der admin dieser firma ist abgehauen und gibt das passwort nicht raus ...
selbst über das gericht kommt man nicht an ihn heran! ...was kann ich da machen ?

Kommentar von Axel am 27.09.2001 um 00:25

Zu 5.
Der Schlüssel lautet statt 'Control Panel\desktop' '.Default\Control Panel\desktop'.
'ScreenSave_Data' habe ich in der gesamten REG nicht gefunden.
Diesen Satz hat es teilweise unterschlagen

Kommentar von Axel am 27.09.2001 um 00:20

Hallo,
also bei mir geht garnichts. Ich habe meine Comp's vernetzt (WIN '98)
Der Schlüssel lautet statt .
habe ich in der gesamten REG nicht gefunden.
WNetVerifyPassword() wäre eine Möglichkeit - aber wenn das PW nur 6 Zeichen lang ist, sind das - bei ca. 50 einsetzbaren Zeichen - im dümmsten Fall 15 Mrd. SchleifenDurchläufe. Aber den Schlüssel kenne ich dann immer noch nicht.
Bevor ich jetzt die - vor und nach Änderung des PW's - RegistryWerte gegeneinander laufen lasse um den Schlüssel zu finden, zähle ich erst einmal auf Euere Kompetenz.
MfG
Axel

Kommentar von Matze am 24.06.2001 um 05:55

Warzm setzt ihr keine schleife?

Kommentar von Christoph Königs am 11.04.2001 um 20:32

Der Fehler tritt bei mir (W98) auf, wenn seit Betriebssystem-Installation noch nie ein Passwort eingegeben wurde.
Abhilfe schafft ein Error goto ... wobei man ans Ende der Function springt und Passwort = "nicht gesetzt" einsetzt.

Kommentar von Movergan am 04.04.2001 um 23:24

Ich habe diesen Code unter Win95 und VB5 getestet. Wenn kein Bildschirmschonerpasswort eingestellt ist, tritt ein Fehler auf. Denn dann ist Ret = 0 und die Left-Funktion will noch eins abziehen. Das geht natürlich nicht. Ich weiß aber nicht, wie ich den Fehler korrigieren könnte. Vielleicht kann jemand weiterhelfen!

Kommentar von KlausSchicks am 05.03.2001 um 01:41

benutze WIN98, und dort klappt es leider nicht !
Laufzeitfehler "5". Dies liegt daran das er bei der Anweisung wo er Ret ausliest einen Fehler meldet (ungültiger Funktionsaufruf (Left$ ....). Würde mich auf eine Antwort freuen !