Forum | | | | Georg Teles | Hallo Allerseits, hab mich hier seit der Anmeldung leider nie geblickt, aber hobbymäßig trotzdem einige Programme geschrieben (vielleicht poste ich die bei Gelegenheit mal), nu hab ich eine Frage Weiß jemand wie die Funktion MapFileAndCheckSum genau funktioniert ? KompilierenMarkierenSeparieren ... durch Probieren habe ich einen Code geschrieben, aber bei gewissen Größen rechnet er mir die "Checksumme" falsch um: (in Byte) 8, 12, 16, 20, 28, 32, ... 722 weiter hab ich nicht ausprobiert ...
bis dahin hab ich es mit Textdateien probiert, aber auch mit anderen Dateitypen, EXE JPG und dabei hat er auch bei einigen Dateien richtig, bei anderen falsch gerechnet ...
... der Grund wozu ch das brauche ist, dass ich anstatt jedes Mal die Datei zu schreiben um diese mit der oben genannten Funktion abzurufen, diese Funktion mittels Bereich intern berechnen lassen möchte.
hier natürlich der ganze Code inklusive Fenster Drag & Drop und alles Schnickschnack, die Funktion, die "MapFileAndChecksum" ersetzen soll, heisst "CR2", die Werte werden in der Liste unter "meine CRC" aufgelistet, die mit "MapFileCheckSum" unter "CheckSum" natürlich KompilierenMarkierenSeparieren $H windows.ph
'Set("ErrorLevel", 0)
Def DragAcceptFiles(2) !"SHELL32","DragAcceptFiles"
Def DragFinish(1) !"SHELL32","DragFinish"
Def DragQueryFile(4) !"SHELL32","DragQueryFileA"
DEF MapFileAndCheckSum(3) ! "Imagehlp","MapFileAndCheckSumA"
Declare HeadSum&,CheckSum&
Declare E%, PFn#, anz&, zah&, B01%, lstB&, winico&, lst$
WinMain(510,260)
Cls ~Getsyscolor(15)
Objects()
Activities()
Proc WinMain
Parameters x&,y&
Windowtitle "Checksum - Drag & Drop"
Windowstyle 8+16+512
Window ((%MaxX/2)-(x&/2)),((%MaxY/2)-(y&/2))-x&,y&
winico& = Create("hIcon",Par$(0),0)
SendMessage(%hwnd,$80,1,winico&)
~SetWindowLong(%hwnd,-16,$92CA0000)
PopUp "&Datei"
AppendMenu 100,"Öffne Liste"
AppendMenu 101,"Speichere Liste"
Separator
AppendMenu 102,"Beenden"
PopUp "&Liste"
AppendMenu 200,"Auswahl löschen"
AppendMenu 201,"Löschen"
Endproc
Proc Objects
lstB& = Create("GridBox",%HWnd,"Datei;0;115;Größe in Byte;1;100;CheckSum;1;80;meine CRC;1;80;Vergleich;1;75",2,5,5,493,200)
DragAcceptFiles(%HWnd,1)
EndProc
Proc Activities
Usermessages 563
CheckList
Clear E%
WhileNot E%
Waitinput
If %Message = 563
Drag()
ElseIf %Key = 2
Inc E%
ElseIf MenuItem(100)
lst$ = LoadFile$("Öffne Datei:","Alle Dateien |*.*")
If %Button = 1
op_(lst$)
EndIf
ElseIf MenuItem(101)
sa_()
ElseIf MenuItem(102)
Inc E%
ElseIf MenuItem(200)
del_(GetCount(lstB&),1)
ElseIf MenuItem(201)
del_(GetCount(lstB&))
EndIf
CheckList()
Endwhile
DragAcceptFiles(%HWnd,0)
EndProc
Proc Drag
DIM PFn#,261
anz& = DragQueryFile(&UWParam,$FFFFFFFF,PFn#,261)
Clear zah&
While zah&<anz&
Clear PFn#
DragQueryFile(&UWParam,zah&,PFn#,261)
Ad_(String$(PFn#,0))
Inc zah&
EndWhile
Dispose PFn#
DragFinish(&UWParam)
EndProc
Proc op_
parameters file$, z$
Assign #1,file$
Reset #1
If %IOResult
Messagebox("Datei kann nicht gelesen werden!","Fehler",16)
Else
WhileNot EOF(#1)
Input #1, z$
AddString(lstB&,z$)
EndWhile
EndIf
Close #1
EndProc
Proc sa_
Parameters file$
file$ = $progdir+"list_"+Date$(3)+"_"+Left$(Time$(0),2)+"."+Right$(Time$(0),2)+"."+Left$(Time$(1),2)+".txt"
Assign #1,file$
OpenRw #1
Close #1
Assign #1,file$
Append #1
WhileLoop 0,GetCount(lstB&)-1
Print #1,GetText$(lstB&,&loop,0)+"|"+GetText$(lstB&,&loop,1)+"|"+GetText$(lstB&,&loop,2)+"|"+GetText$(lstB&,&loop,3)+"|"+GetText$(lstB&,&loop,4)
EndWhile
Close #1
EndProc
Proc Ad_
Parameters file$, size&, crc&, cr2&, msg$
crc& = crc(file$)
cr2& = cr2(file$)
size& = FileSize(file$)
file$ = SubStr$(file$,-1,"\\")
If crc& = cr2&
msg$ = "gleich"
Else
msg$ = "UNgleich"
EndIf
AddString(lstB&,file$+"|"+Str$(size&)+"|"+Str$(crc&)+"|"+Str$(cr2&)+"|"+msg$)
EndProc
Proc crc
Parameters File$
Clear Headsum&, Checksum&
MapFileAndCheckSum(Addr(File$),addr(Headsum&),addr(Checksum&))
Return Checksum&
EndProc
Proc cr2
Parameters File$,fs&,fs#,p%
Clear fs&,p%
fs& = Filesize(file$)
Dim fs#, fs&
Clear fs#
Assign #2,file$
Openrw #2
Blockread(#2,fs#,0,fs&)
Close #2
WhileLoop 0,fs&\2
p% = p%+word(fs#,&loop*2)
If p% >= 65535
p% = (p%-65535)
endif
EndWhile
p% = (p%+fs&)
Dispose fs#
Return p%
EndProc
proc del_
Parameters c&, p&
If p& = 1
WhileLoop 0,(c&-1)
If GetState(lstB&,(c&-1)-&loop) >= 2
DeleteString(lstB&,(c&-1)-&loop)
EndIf
EndWHile
Else
WhileLoop 0,(c&-1)
DeleteString(lstB&,(c&-1)-&loop)
EndWHile
EndIf
EndProc
Proc CheckList
If GetCount(lstB&)
EnableMenu 200,0
EnableMenu 201,0
Else
EnableMenu 200,1
EnableMenu 201,1
EndIf
EndProc
END
Die Funktion scheint nicht einfach zu sein, aber mehr als Probieren kann ich nicht, im Netz steht auch nicht mehr darüber. |
| | | | |
| | | Hallo Georg,
wie ich es verstehe geht es darum von Exen oder DLLs eine Signatur zu erzeugen, eher nicht von anderen Dateien. MSDN
This function is used by any application that creates or modifies an executable image. Checksums are required for kernel-mode drivers and some system DLLs.
Was genau möchtest Du letztendlich erzielen? |
| | | | |
| | Georg Teles | Hi iF,
ja korrekt, es handelt sich um DLL und EXE, die Checksumme wird unter Anderem im Header der DLL / EXE "mitgeschleppt" und vor dem Ausführen wird die Checksumme gebildet und mit der verglichen, es wird also geprüft, ob das Programm manipuliert wurde bzw ob es überhaupt kompatibel ist am jeweiligen PC, es wäre ja unschön wenn es beim Ausführen des Programms zum Absturz des PC kommen würde neech ...
früher hab ich einen Beitrag hier gelesen, es ging darum diese Funktion zu nutzen, um eigene Programme oder Dateien zu schützen, ändert man wenigstens 1 Byte, so ändert sich die komplette Summe, und diese "Summe" ist das was ich meine, diese Funktion kann man scheinbar für jeden Dateityp verwenden, nur wird diese Summe nicht in der Datei hinterlegt beispiel TXT, man kann profan gesagt die Summe von beliebigen Dateien bilden.
Was ich erzielen möchte erkläre ich nochmal kurz: Da die CheckSum Funktion zwangsläufig einen Pfad zur Datei benötigt möchte ich mittels der eigenen Funktion das gleiche Ergebnis erziehen, an einem Bereichs anstatt der Datei.
Die Funktion soll eben intern im Programm die Checksumme bilden können ohne eine Datei zu schreiben ... ich merke gerade, dass es bei größeren Dateien ziemlich lange dauert bis ich die Summe habe ... naja egal, ich habe vor einen Archivierer zu schreiben, und diese Funktion will ich für sehr kleine Bereiche verwenden, und zwar für das Passwort ich habe bereits 2 Archivierer geschrieben, einer mit Passwortschutz aber den speichert er leider mit, und ich will diese Funktion irgendwie anstatt des Passwortes nutzen ...
ich merke ja noch was, ich brauch die Funktion so ja garnicht wie Checksum, es funktioniert ja schon wie ich es will, ich teste mal ob er richtig kodiert und dekodiert ... |
| | | | |
| | | Vielleicht wäre was Findus hier gepostet hat hilfreich(er): [...] |
| | | | |
| | Georg Teles | Schöner Code, leider arbeite ich mit XProfan 10 und "encode64" gibt es da nicht naja das Beispiel zeigt Textverschlüsselung durch Umsortieren, das will ich ja vermeiden, passt schon, ich tüftel mal weiter ... |
| | | | |
| | | Nimm doch FreeProfan: [...] |
| | | | |
| | Georg Teles | Danke iF, 64 Bit gibt es ja auch Juhuuuu
hab jetzt die Lösung ... Meine Funktion macht genau das, was MapFileAndCheckSum auch allerdings sehr langsam, für 1 MByte braucht das Programm 22,875 Sekunden, aber das ist egal, ich wende das nur für kleine Bereiche an
Anscheinend rechnet die Funktion den Rest der Summe einer Datei WORD für WORD zusammen... BZW so wie ich es verstanden habe, sobald die Summe des ersten WORD mit dem zweiten Max. erreicht oder größer ist (65535), wird es abgezogen, danach wird der Rest der bleibt mit dem nächsten WORD addiert, nach jeder Summe wird es wieder geprüft, ob die Summe Max. erreicht oder größer ist, in diesem Fall wird der Wert wieder abgezogen usw ... KompilierenMarkierenSeparieren
Proc cr2
Parameters File$,fs&,fs#,p%,s%
Clear fs&,p%,s%
fs& = Filesize(file$)
Dim fs#, fs&
Clear fs#
Assign #2,file$
Openrw #2
Blockread(#2,fs#,0,fs&)
Close #2
If fs& MOD 2 = 0
s% = (fs&\2)-1
ElseIf fs& MOD 2 = 1
s% = (fs&\2)
EndIf
WhileLoop 0,s%
p% = p%+word(fs#,&loop*2)
If p% > 65534
p% = (p%-65535)
endif
EndWhile
p% = (p%+fs&)
Dispose fs#
Return p%
EndProc
|
| | | | |
| | | Dann würde ich die Funktion (der Teil der rechnet) in eine nProc packen -
das geht dann schneller als der Blitz. |
| | | | |
| | Georg Teles | Hallo, dann werde ich mal hier das Thema auffrischen hab mal für meinen Archivierer ein Passwortsystem überlegt, funktioniert in etwa nach diesem Prinzip...
Wer Lust zum Testen hat ^^ der Test schreibt nur den Head meines Archivierers und Passwort + öffnen und Passwortabfrage ... es wird eine Datei angelegt asd.tew
Download |
| | | | |
| | | Ich bin nicht sicher, ob das Passwort sicher hinterlegt wird.
Wenn ich den Bytewert eines einzelnen Passwortzeichens um 1 erhöhe dann sollte sich in der Datei nicht auch einfach nur 1 Bytewert um 1 erhöhen. So sollte das Passwort selbst garnicht in der Datei stehen sondern eher eine Prüfsumme und nur wenn Prüfsummen übereinstimmen dann stimmen die Passworte überein. |
| | | | |
| | Georg Teles | Naja das ist ja die Sache, dass das Passowrt garnicht mit drin ist kannst mal die Datei mit Notepad öffnen und nach den Passwort suchen, da findest du nichts.
habe fast vergessen, ein Leerzeichen sollte man nicht benutzen, das funktioniert dann meistens nicht, ich teste mal weiter ...
Edit: drin steht auch nur die Prüfsumme, allerdings ist sie mit allen Anderen Parametern verknüpft sodass wenn man versucht den Header zu manipulieren, wird das Programm darauf auch reagieren, theoretisch hab ich mir das schon überlegt |
| | | | |
|
AntwortenThemenoptionen | 10.994 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |