DLL | | | |  Sven Bader | Descargar
¡Hola zusammen,
otra vez möchte Yo una kleine DLL bereitstellen. Ab el 5. DLL erstelle Yo entonces una einzelne con allen Características 
Lo dejar se MD5 Prüfsummen de Cuerdas generieren, welche uno bekanntlich para allerhand Zwecke einsetzen kann. Yo habe viel getestet bin me pero la Stabilität y Korrektheit todavía no 100% sicher. Me complace hier also en Feedback!
Viele Grüße Sven

Hier una Beispielaufruf. Lo braucht una kleine Hilfsfunktion, como Funktionsaufrufe y Rückgaben en DLL Cuerdas sólo como Adresse verarbeiten puede:
Oder bastante sin DLL nativ en XProfan. Beim Compilieren en XProfan anstatt Profano2CPP debería el Compileranweisung en el "Proc md5_rl" todavía lejos voluntad. Das unsigned right shift <<<, unos pocos | = Zuweisungen y el Tilde ~ (Bitwise Not) musste Yo umschreiben, como lo esta en XProfan no son. Yo basiere de paso en el C++ Code de Paul Johnston [...] 
Def md5_tilde(1) (&(1) * (-1) -1)'~
Declarar md5_x&[524288], md5_hc$
'right shift unsigned >>>
Proc md5_rsu
Parámetros a&, b&
Declarar x&
x& = a& >> b&
whileloop 0, b&-1
x& = setbit(x&,31-&bucle,0)
endwhile
volver x&
ENDPROC
Proc md5_rh
Parámetros n&
Declarar j&, s$
s$ = ""
Whileloop 0, 3
j& = &bucle
s$ = s$ + Mid$(md5_hc$, ((n& >> (j&*8 + 4)) & $0F)+1,1) + Mid$(md5_hc$, ((n& >> (j&*8)) & $0F)+1,1)
Endwhile
volver s$
ENDPROC
Proc md5_ad
Parámetros x&, y&
Declarar l&, m&, return&
l& = (x& & $FFFF) + (y& & $FFFF)
m& = (x& >> 16) + (y& >> 16) + (l& >> 16)
return& = (m& << 16) | (l& & $FFFF)
volver return&
ENDPROC
Proc md5_rl
Declarar 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
Parámetros n&,c&
return& = (n& << c&) | md5_rsu(n&,(32-c&))
$ENDIF
volver return&
ENDPROC
Proc md5_cm
Parámetros q&,a&,b&,x&,s&,t&
Declarar return&
return& = md5_ad(md5_rl(md5_ad(md5_ad(a&,q&),md5_ad(x&,t&)),s&),b&)
volver return&
ENDPROC
Proc md5_ff
Parámetros a&,b&,c&,d&,x&,s&,t&
Declarar return&
return& = md5_cm(((b& & c&) | (md5_tilde(b&) & d&)),a&,b&,x&,s&,t&)
volver return&
ENDPROC
Proc md5_gg
Parámetros a&,b&,c&,d&,x&,s&,t&
Declarar return&
return& = md5_cm((b& & d&) | (c& & md5_tilde(d&)),a&,b&,x&,s&,t&)
volver return&
ENDPROC
Proc md5_hh
Parámetros a&,b&,c&,d&,x&,s&,t&
Declarar return&
return& = md5_cm(xor(xor(b&, c&), d&),a&,b&,x&,s&,t&)
volver return&
ENDPROC
Proc md5_ii
Parámetros a&,b&,c&,d&,x&,s&,t&
Declarar return&
return& = md5_cm(XOR(c&, (b& | md5_tilde(d&))),a&,b&,x&,s&,t&)
volver return&
ENDPROC
Proc md5_sb
Parámetros x$
Declarar i&, nblk&, return&
nblk& = ((len(x$) + 8) >> 6) + 1
Whileloop 0, (nblk&*16 - 1)
i& = &bucle
md5_x&[i&] = 0
Endwhile
Whileloop 0, (len(x$) - 1)
i& = &bucle
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
volver return&
ENDPROC
Proc md5
parámetros inputString$
declarar 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
Mientras que 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
Volver (md5_rh(a&) + md5_rh(b&) + md5_rh(c&) + md5_rh(d&))
ENDPROC
cls
declarar time&
time& = &gettickcount
imprimir "Hallo Welt: "+md5("Hallo Welt")
imprimir "ÄÖÜ: "+md5(Utf8Encode("ÄÖÜ"))
imprimir (&gettickcount-time&)
waitkey
end
|
 | | | | |
| |  Sven Bader | Habs una vez más aktualisiert. El DLL es ahora más rápido y verarbeitet Umlaute etc. korrekt. |
| | | | |
| |  Sven Bader | Yo war una vez más dran y habe el DLL aktualisiert. Es ahora posible, Archivos a prüfen. Das eignet se, en por ejemplo Manipulationen oder sonstige Beschädigungen a Programmdateien a prüfen, kann aber una wenig dauern.
declarar hDll&, texto$
let hDll& = @UseDll("md5.dll")
ImportFunc(hDll&,"md5", "md5DLL")
ImportFunc(hDll&,"md5_file", "md5_fileDLL")
Proc md5
Parámetros inputstring$
Declarar target#
Dim target#, 33
md5DLL(Addr(inputstring$), target#)
Volver cadena$(target#,0)
ENDPROC
Proc md5_file
Parámetros inputstring$
Declarar target#
Dim target#, 33
md5_fileDLL(Addr(inputstring$), target#)
Volver cadena$(target#,0)
ENDPROC
Cls
declarar time&
time& = &gettickcount
Imprimir "a) Zeichenkette \qtest\q:"
Imprimir "098f6bcd4621d373cade4e832627b4f6"
Imprimir md5("test")
Imprimir ""
Imprimir "b) Expediente md5.dll:"
Imprimir "fa7a65f6042653776b524d829e5aef2b"
Imprimir md5_file("md5.dll")
Imprimir ""
Imprimir "c) 1024 Leerzeichen:"
Imprimir "10801b757893f9edbff42cd92fdd406a"
Imprimir md5(space$(1024))
Imprimir ""
Imprimir str$(int(&gettickcount-time&)) + "ms"
Waitinput
FreeDll hDll&
End
|
| | | | |
| |  Georg Teles | Nabend,
para Dateiprüfung kannst Usted eventuell el Función MapFileAndCheckSum uso:
oder hier [...] Yo el Ver código fuente Nuevo, como en Windows esta Función berechnet, hier el blanke Code (dauert auch beim Ausführen, como nProc se ejecuta lo sin embargo auch en großen Archivos a 2 Gb relativ rápidamente, el Expediente muss como Ganzes hineingelesen voluntad, eignet se also para Archivos, el no entpackt voluntad necesario como Bsp., el war mi Intention damals para Manipulationsschutz o. CheckSumme en mi Archivierer):
Conjunto("FileMode",0)
Asignar #1,file$
OpenRW #1
BlockRead(#1,ber#,0,size&)
cr2& = cr2(ber#,size&)
Cerrar #1
nProc cr2
Parámetros ber#,ps&
Declarar s&,res&
s& = 0
res& = 0
If ps& MOD 2 = 0
s& = (ps&\2)-1
Más
s& = (ps&\2)
EndIf
WhileLoop 0,s&
res& = res&+word(ber#,&bucle*2)
If res& > 65534
res& = (res&-65535)
Endif
EndWhile
res& = (res&+ps&)
Volver res&
ENDPROC
Grüße Georg |
| | | | |
| |  Sven Bader | ¡Hola Georg,
el MapFileAndCheckSumA Función es interessant y rápidamente genug. El 32 Bits dejar se bien como Integer ablegen, el MD5 Prüfsummen de 128 Bit schleift uno más veces como String con, el son entonces aber auch sicher nie doppelt.
El Desarrollo el DLL war ausnahmsweise veces no de Eigenbedarf, Yo hatte simplemente sólo Spaß daran 2 Gb sería Yo así ahora no prüfen aber inzwischen ir ca. 10 MB pro Sekunde, el MapFileAndCheckSumA es como etwa 10x más rápido, ha aber auch weniger a tun.
¿Puede du me sagen, welchem Standard deine cr2 Función o MapFileAndCheckSum haben? Yo podría el Ergebnisse no validieren, una CRC32 o 16 scheint no a ser.
Grüße Sven |
| | | | |
| |  Georg Teles | Hi Sven,
gute Cuestión, Yo kann sólo soviel sagen, dass esta Función una "Restwert" des WORD (2 Bytes) a Dateigröße addiert, el Ergebnis es entonces el Checksumme:
WORD 1 y WORD 2 el Expediente voluntad Addiert (also erste 2 Bytes con el nächsten 2 Bytes), debería el Valor igual o. encima 65.535 betragen (Max. Valor des WORD), se dieser abgezogen.
Zu diesem Rest se el nächste WORD (2 Bytes) addiert y otra vez verglichen y abgezogen, a el Dateiende erreicht es ... para Schluss es el Ergebnis, also el RestWORD, el Dateigröße addiert. Das Ergebnis es entonces el Summe des RestWORD y Dateigröße.
Laut MS wurde esta Fuktion gegen Manipulation ausführbarer Archivos entwickelt, sodass el CheckSumme direkt en el Encabezamiento el EXE Expediente geschrieben se (beim Kompilieren).
Bedeutet, si uno una EXE Expediente con dieser Fuktion abfragt y esta en el Encabezamiento el CheckSumme besitzt, se esta Fuktion valor simplemente auslesen y ausgeben (o. beim Ausführen con el Expediente incluso vergleichen, HeadSum con CheckSum, si manipuliert wurde) ... si la EXE Expediente no CheckSumme besitzt, se esta berechnet, una Vergleich y una Meldung bzgl. Manipulation entfällt.
Diese Función puede ser aber auch en todos Archivos anwenden, como el Berechnung bastante rápidamente va trotz großer Archivos.
So gesehen ha esta Función no Norm Aprovecho a.
Grüße Georg |
| | | | |
| |  Jens-Arne Reumschüssel | Es el Checksumme, el para el Erstellung de PE-Archivos (z.B. EXE, DLL) benötigt se. Für 32bit-Images es ellos de Offset 64, el Descripción bajo [...] 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 se "irgendwie" berechnet, pero no como MD5-Hash. Das muss sí ya deshalb así ser, porque se en una MD5-Algorithmus en todo Expediente el Hash verändert, si uno ihn una vez berechnet y luego en el Expediente eingefügt ha. Beim Hashen uno EXE/DLL se also mindestens el Hash incluso ausgelassen (Yo mi aber, auch todavía otro Teile).
Yo glaube de paso no, dass uno con MapFileAndCheckSumA beliebige Archivos verarbeiten kann:
"Passing a Filename parameter that does not point to a valid executable image voluntad 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 14 Tagen ▲ |
| |
|
Zur DLLThemeninformationenDieses Thema ha 3 subscriber: |