Italia
Foro

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 File richtig, bei anderen falsch gerechnet ...

... der Grund wozu ch das brauche ist, dass ich anstatt jedes Mal die File zu schreiben um diese mit der oben genannten Funktion abzurufen, diese Funktion mittels Bereich intern berechnen lassen möchte.

hier naturalmente 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" naturalmente
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 DLL eine Signatur zu erzeugen,
eher nicht von anderen File.
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 DLL.


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 Testata 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 File 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 per jeden Dateityp verwenden, nur wird diese Summe nicht in der File hinterlegt beispiel TXT, man kann profan gesagt die Summe von beliebigen File bilden.

Was ich erzielen möchte erkläre ich nochmal kurz: Da die CheckSum Funktion zwangsläufig einen Pfad zur File necessario möchte ich mittels der eigenen Funktion das gleiche Ergebnis erziehen, an einem Bereichs anstatt der File.

Die Funktion soll eben intern im Programm die Checksumme bilden können ohne eine File zu schreiben ... ich merke gerade, dass es bei größeren File ziemlich lange dauert bis ich die Summe habe ... naja egal, ich habe vor einen Archivierer zu schreiben, und diese Funktion will ich per sehr kleine Bereiche verwenden, und zwar per das Password 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, per 1 MByte braucht das Programm 22,875 Sekunden, aber das ist egal, ich wende das nur per kleine Bereiche an

Anscheinend rechnet die Funktion den Rest der Summe einer File WORD per 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 un 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 per 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 Password + öffnen und Passwortabfrage ... es wird eine File angelegt asd.tew

Download

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

07.05.2013  
 



Ich bin nicht sicher, ob das Password sicher hinterlegt wird.

Wenn Io l' Bytewert eines einzelnen Passwortzeichens um 1 erhöhe dann
sollte sich in der File nicht auch einfach nur 1 Bytewert um 1 erhöhen. So
sollte das Password selbst garnicht in der File 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 File mit Notepad öffnen und nach den Password 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 Testata 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  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

11.068 Views

Untitledvor 0 min.
Georg Teles25.07.2023
Michael W.01.03.2023
RudiB.27.10.2021
Thomas Zielinski23.10.2021
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

Georg Teles (6x)
iF (5x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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