Deutsch
Forum

MapFileAndCheckSum

 

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
DEF MapFileAndCheckSum(3) ! "Imagehlp","MapFileAndCheckSumA"

... 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.
 
XProfan 10
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

16.03.2013  
 



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?
 
17.03.2013  
 




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 ...
 
XProfan 10
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

17.03.2013  
 



Vielleicht wäre was Findus hier gepostet hat hilfreich(er): [...] 
 
17.03.2013  
 




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 ...
 
XProfan 10
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

17.03.2013  
 



Nimm doch FreeProfan: [...] 
 
17.03.2013  
 




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

 
XProfan 10
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

21.03.2013  
 



Dann würde ich die Funktion (der Teil der rechnet) in eine nProc packen -

das geht dann schneller als der Blitz.
 
21.03.2013  
 




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

214 kB
Hochgeladen:07.05.2013
Ladeanzahl159
Herunterladen
 
XProfan 10
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

07.05.2013  
 



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.
 
07.05.2013  
 




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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

07.05.2013  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

10.994 Betrachtungen

Unbenanntvor 0 min.
Georg Teles25.07.2023
Michael W.01.03.2023
RudiB.27.10.2021
Thomas Zielinski23.10.2021
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

Georg Teles (6x)
iF (5x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie