DLLs | | | |  Sven Bader | Herunterladen
Hallo zusammen,
wieder möchte ich eine kleine DLL bereitstellen. Ab der 5. DLL erstelle ich dann eine einzelne mit allen Funktionen 
Es lassen sich MD5 Prüfsummen aus Strings generieren, welche man bekanntlich für allerhand Zwecke einsetzen kann. Ich habe viel getestet bin mir aber der Stabilität und Korrektheit noch nicht 100% sicher. Ich freue mich hier also auf Feedback!
Viele Grüße Sven

Hier ein Beispielaufruf. Es braucht eine kleine Hilfsfunktion, da Funktionsaufrufe und Rückgaben in DLLs Strings nur als Adresse verarbeiten können:
Oder ganz ohne DLL nativ in XProfan. Beim Compilieren in XProfan anstatt Profan2CPP müsste die Compileranweisung im "Proc md5_rl" noch entfernt werden. Das unsigned right shift <<<, ein paar | = Zuweisungen und die Tilde ~ (Bitwise Not) musste ich umschreiben, da es diese in XProfan nicht gibt. Ich basiere übrigens auf dem C++ Code von Paul Johnston [...] 
Def md5_tilde(1) (&(1) * (-1) -1)'~
Declare md5_x&[524288], md5_hc$
'right shift unsigned >>>
Proc md5_rsu
Parameters a&, b&
Declare x&
x& = a& >> b&
whileloop 0, b&-1
x& = setbit(x&,31-&loop,0)
endwhile
return x&
EndProc
Proc md5_rh
Parameters n&
Declare j&, s$
s$ = ""
Whileloop 0, 3
j& = &loop
s$ = s$ + Mid$(md5_hc$, ((n& >> (j&*8 + 4)) & $0F)+1,1) + Mid$(md5_hc$, ((n& >> (j&*8)) & $0F)+1,1)
Endwhile
return s$
EndProc
Proc md5_ad
Parameters x&, y&
Declare l&, m&, return&
l& = (x& & $FFFF) + (y& & $FFFF)
m& = (x& >> 16) + (y& >> 16) + (l& >> 16)
return& = (m& << 16) | (l& & $FFFF)
return return&
EndProc
Proc md5_rl
Declare return&
$IFDEF COMPILER
'P2CPP: <INLINE_CPP>
unsigned long lN = LongParam(1);
unsigned long lC = LongParam(2);
unsigned unsigned rr = (lN >> (32 - lC));
lReturn = _L(((lN << lC))) | _L(rr);
'P2CPP: </INLINE_CPP>
$ELSE
Parameters n&,c&
return& = (n& << c&) | md5_rsu(n&,(32-c&))
$ENDIF
return return&
Endproc
Proc md5_cm
Parameters q&,a&,b&,x&,s&,t&
Declare return&
return& = md5_ad(md5_rl(md5_ad(md5_ad(a&,q&),md5_ad(x&,t&)),s&),b&)
return return&
EndProc
Proc md5_ff
Parameters a&,b&,c&,d&,x&,s&,t&
Declare return&
return& = md5_cm(((b& & c&) | (md5_tilde(b&) & d&)),a&,b&,x&,s&,t&)
return return&
EndProc
Proc md5_gg
Parameters a&,b&,c&,d&,x&,s&,t&
Declare return&
return& = md5_cm((b& & d&) | (c& & md5_tilde(d&)),a&,b&,x&,s&,t&)
return return&
EndProc
Proc md5_hh
Parameters a&,b&,c&,d&,x&,s&,t&
Declare return&
return& = md5_cm(xor(xor(b&, c&), d&),a&,b&,x&,s&,t&)
return return&
EndProc
Proc md5_ii
Parameters a&,b&,c&,d&,x&,s&,t&
Declare return&
return& = md5_cm(XOR(c&, (b& | md5_tilde(d&))),a&,b&,x&,s&,t&)
return return&
EndProc
Proc md5_sb
Parameters x$
Declare i&, nblk&, return&
nblk& = ((len(x$) + 8) >> 6) + 1
Whileloop 0, (nblk&*16 - 1)
i& = &loop
md5_x&[i&] = 0
Endwhile
Whileloop 0, (len(x$) - 1)
i& = &loop
md5_x&[i& >> 2] = md5_x&[i& >> 2] | (ord(Mid$(x$,i&+1,1)) << ((i& MOD 4)*8))
Endwhile
inc i&
md5_x&[i& >> 2] = md5_x&[i& >> 2] | ($80 << (((i&) MOD 4)*8))
md5_x&[nblk&*16-2] = len(x$)*8
return& = nblk&*16
return return&
EndProc
Proc md5
parameters inputString$
declare a&,b&,c&,d&,olda&,oldb&,oldc&,oldd&,i&,lenx&
md5_hc$ = "0123456789abcdef"
lenx& = md5_sb(inputString$)
'messagebox str$(lenx& ),"",0
a& = 1732584193
b& = -271733879
c& = -1732584194
d& = 271733878
' messagebox str$(lenx&),"",0
While i& < lenx&
olda& = a&
oldb& = b&
oldc& = c&
oldd& = d&
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 0], 7, -680876936)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 1],12, -389564586)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 2],17, 606105819)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 3],22,-1044525330)
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 4], 7, -176418897)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 5],12, 1200080426)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 6],17,-1473231341)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 7],22, -45705983)
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 8], 7, 1770035416)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 9],12,-1958414417)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 10],17, -42063)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 11],22,-1990404162)
a& = md5_ff(a&,b&,c&,d&,md5_x&[i& + 12], 7, 1804603682)
d& = md5_ff(d&,a&,b&,c&,md5_x&[i& + 13],12, -40341101)
c& = md5_ff(c&,d&,a&,b&,md5_x&[i& + 14],17,-1502002290)
b& = md5_ff(b&,c&,d&,a&,md5_x&[i& + 15],22, 1236535329)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 1], 5, -165796510)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 6], 9,-1069501632)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 11],14, 643717713)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 0],20, -373897302)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 5], 5, -701558691)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 10], 9, 38016083)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 15],14, -660478335)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 4],20, -405537848)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 9], 5, 568446438)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 14], 9,-1019803690)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 3],14, -187363961)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 8],20, 1163531501)
a& = md5_gg(a&,b&,c&,d&,md5_x&[i& + 13], 5,-1444681467)
d& = md5_gg(d&,a&,b&,c&,md5_x&[i& + 2], 9, -51403784)
c& = md5_gg(c&,d&,a&,b&,md5_x&[i& + 7],14, 1735328473)
b& = md5_gg(b&,c&,d&,a&,md5_x&[i& + 12],20,-1926607734)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 5], 4, -378558)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 8],11,-2022574463)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 11],16, 1839030562)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 14],23, -35309556)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 1], 4,-1530992060)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 4],11, 1272893353)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 7],16, -155497632)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 10],23,-1094730640)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 13], 4, 681279174)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 0],11, -358537222)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 3],16, -722521979)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 6],23, 76029189)
a& = md5_hh(a&,b&,c&,d&,md5_x&[i& + 9], 4, -640364487)
d& = md5_hh(d&,a&,b&,c&,md5_x&[i& + 12],11, -421815835)
c& = md5_hh(c&,d&,a&,b&,md5_x&[i& + 15],16, 530742520)
b& = md5_hh(b&,c&,d&,a&,md5_x&[i& + 2],23, -995338651)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 0], 6, -198630844)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 7],10, 1126891415)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 14],15,-1416354905)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 5],21, -57434055)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 12], 6, 1700485571)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 3],10,-1894986606)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 10],15, -1051523)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 1],21,-2054922799)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 8], 6, 1873313359)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 15],10, -30611744)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 6],15,-1560198380)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 13],21, 1309151649)
a& = md5_ii(a&,b&,c&,d&,md5_x&[i& + 4], 6, -145523070)
d& = md5_ii(d&,a&,b&,c&,md5_x&[i& + 11],10,-1120210379)
c& = md5_ii(c&,d&,a&,b&,md5_x&[i& + 2],15, 718787259)
b& = md5_ii(b&,c&,d&,a&,md5_x&[i& + 9],21, -343485551)
a& = md5_ad(a&,olda&)
b& = md5_ad(b&,oldb&)
c& = md5_ad(c&,oldc&)
d& = md5_ad(d&,oldd&)
i& = i& + 16
EndWhile
Return (md5_rh(a&) + md5_rh(b&) + md5_rh(c&) + md5_rh(d&))
EndProc
cls
declare time&
time& = &gettickcount
print "Hallo Welt: "+md5("Hallo Welt")
print "ÄÖÜ: "+md5(Utf8Encode("ÄÖÜ"))
print (&gettickcount-time&)
waitkey
end
|
 | | | | |
| |  Sven Bader | Habs noch mal aktualisiert. Die DLL ist jetzt schneller und verarbeitet Umlaute etc. korrekt. |
| | | | |
| |  Sven Bader | Ich war noch mal dran und habe die DLL aktualisiert. Es ist jetzt möglich, Dateien zu prüfen. Das eignet sich, um beispielsweise Manipulationen oder sonstige Beschädigungen an Programmdateien zu prüfen, kann aber ein wenig dauern.
declare hDll&, text$
let hDll& = @UseDll("md5.dll")
ImportFunc(hDll&,"md5", "md5DLL")
ImportFunc(hDll&,"md5_file", "md5_fileDLL")
Proc md5
Parameters inputstring$
Declare target#
Dim target#, 33
md5DLL(Addr(inputstring$), target#)
Return string$(target#,0)
EndProc
Proc md5_file
Parameters inputstring$
Declare target#
Dim target#, 33
md5_fileDLL(Addr(inputstring$), target#)
Return string$(target#,0)
EndProc
Cls
declare time&
time& = &gettickcount
Print "a) Zeichenkette \qtest\q:"
Print "098f6bcd4621d373cade4e832627b4f6"
Print md5("test")
Print ""
Print "b) Datei md5.dll:"
Print "fa7a65f6042653776b524d829e5aef2b"
Print md5_file("md5.dll")
Print ""
Print "c) 1024 Leerzeichen:"
Print "10801b757893f9edbff42cd92fdd406a"
Print md5(space$(1024))
Print ""
Print str$(int(&gettickcount-time&)) + "ms"
Waitinput
FreeDll hDll&
End
|
| | | | |
| |  Georg Teles | Nabend,
für Dateiprüfung kannst Du eventuell die Funktion MapFileAndCheckSum verwenden:
oder hier [...] habe ich den Quelltext gepostet, wie in Windows diese Funktion berechnet, hier der blanke Code (dauert auch beim Ausführen, als nProc läuft es jedoch auch bei großen Dateien bis 2 Gb relativ schnell, die Datei muss als Ganzes hineingelesen werden, eignet sich also für Dateien, die nicht entpackt werden müssen als Bsp., das war meine Intention damals für Manipulationsschutz bzw. CheckSumme in meinem Archivierer):
Set("FileMode",0)
Assign #1,file$
OpenRW #1
BlockRead(#1,ber#,0,size&)
cr2& = cr2(ber#,size&)
Close #1
nProc cr2
Parameters ber#,ps&
Declare s&,res&
s& = 0
res& = 0
If ps& MOD 2 = 0
s& = (ps&\2)-1
Else
s& = (ps&\2)
EndIf
WhileLoop 0,s&
res& = res&+word(ber#,&loop*2)
If res& > 65534
res& = (res&-65535)
Endif
EndWhile
res& = (res&+ps&)
Return res&
EndProc
Grüße Georg |
| | | | |
| |  Sven Bader | Hallo Georg,
die MapFileAndCheckSumA Funktion ist interessant und schnell genug. Die 32 Bits lassen sich gut als Integer ablegen, die MD5 Prüfsummen von 128 Bit schleift man eher mal als String mit, die sind dann aber auch sicher nie doppelt.
Die Entwicklung der DLL war ausnahmsweise mal nicht aus Eigenbedarf, ich hatte einfach nur Spaß daran 2 Gb würde ich damit jetzt nicht prüfen aber inzwischen gehen ca. 10 MB pro Sekunde, die MapFileAndCheckSumA ist da etwa 10x schneller, hat aber auch weniger zu tun.
Kannst du mir sagen, welchem Standard deine cr2 Funktion oder die MapFileAndCheckSum haben? Ich konnte die Ergebnisse nicht validieren, ein CRC32 bzw 16 scheint es nicht zu sein.
Grüße Sven |
| | | | |
| |  Georg Teles | Hi Sven,
gute Frage, ich kann nur soviel sagen, dass diese Funktion einen "Restwert" des WORD (2 Bytes) zur Dateigröße addiert, das Ergebnis ist dann die Checksumme:
WORD 1 und WORD 2 der Datei werden Addiert (also erste 2 Bytes mit den nächsten 2 Bytes), sollte der Wert gleich bzw. über 65.535 betragen (Max. Wert des WORD), wird dieser abgezogen.
Zu diesem Rest wird das nächste WORD (2 Bytes) addiert und wieder verglichen und abgezogen, bis das Dateiende erreicht ist ... zum Schluss wird dem Ergebnis, also dem RestWORD, die Dateigröße addiert. Das Ergebnis ist dann die Summe des RestWORD und der Dateigröße.
Laut MS wurde diese Fuktion gegen Manipulation ausführbarer Dateien entwickelt, sodass die CheckSumme direkt in den Header der EXE Datei geschrieben wird (beim Kompilieren).
Bedeutet, wenn man eine EXE Datei mit dieser Fuktion abfragt und diese im Header die CheckSumme besitzt, wird diese Fuktion den Wert einfach auslesen und ausgeben (bzw. beim Ausführen mit der Datei selbst vergleichen, HeadSum mit CheckSum, ob manipuliert wurde) ... wenn die EXE Datei keine CheckSumme besitzt, wird diese berechnet, ein Vergleich und eine Meldung bzgl. Manipulation entfällt.
Diese Funktion kann man aber auch auf alle Dateien anwenden, da die Berechnung ziemlich schnell geht trotz großer Dateien.
So gesehen hat diese Funktion keine Norm nehme ich an.
Grüße Georg |
| | | | |
| |  Jens-Arne Reumschüssel | Das ist die Checksumme, die für die Erstellung von PE-Dateien (z.B. EXE, DLL) benötigt wird. Für 32bit-Images steht sie ab Offset 64, die Beschreibung unter [...] lautet:
"The image file checksum. The algorithm for computing the checksum is incorporated into IMAGHELP.DLL. The following are checked for validation at load time: all drivers, any DLL loaded at boot time, and any DLL that is loaded into a critical Windows process."
Das wird "irgendwie" berechnet, aber nicht als MD5-Hash. Das muss ja schon deshalb so sein, weil sich bei einem MD5-Algorithmus über die ganze Datei der Hash verändert, wenn man ihn einmal berechnet und dann in die Datei eingefügt hat. Beim Hashen einer EXE/DLL wird also mindestens der Hash selbst ausgelassen (ich meine aber, auch noch andere Teile).
Ich glaube übrigens nicht, dass man mit MapFileAndCheckSumA beliebige Dateien verarbeiten kann:
"Passing a Filename parameter that does not point to a valid executable image will produce unpredictable results. Any user of this function is encouraged to make sure that a valid executable image is being passed."
Viele Grüße, Jens-Arne |
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | vor 10 Tagen ▲ |
| |
|
Zur DLLThemenoptionen | 2.997 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |