Crc32 Algoritması; Dword değerlerden oluşan 256 adet keyin kullanıldığı bir tabloyu baz alarak hash hesabı yapan bir fonksiyon. Sonunda hesaplanan hash yine 4byte'lık bir değerdir.
@Crc32: ;<= Procedure StartAşağıda ki tablo, yukarıdaki crc32 fonksiyonu ile bir dosyanın son 5 baytı okunurken hesaplanmış değerlerdir.
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
OR EAX,0FFFFFFFFh
MOV ECX,[ARG.2] ;Stack SS:[0012FEA8]=000A2540
MOV EDX,[ARG.1] ;Stack SS:[0012FEA4]=7FEB0010, (ASCII "MZP")
JMP @2
@1:
MOVSX ESI,BYTE PTR DS:[EDX]
MOV EBX,EAX
XOR EAX,ESI
AND EAX,0FFh
SHR EBX,8
XOR EBX,DWORD PTR DS:[EAX*4+(Ctc Table Adress)]
INC EDX
MOV EAX,EBX
@2:
MOV EBX,ECX
ADD ECX,-1
TEST EBX,EBX
JNZ @1
NOT EAX ;Checksum
POP ESI
POP EBX
POP EBP
RETN ;<= Procedure End
bn+1 = fn
Bu dosyanın checksum değeri istenilen bir değer ile değiştirilmek istendiğinde tablodaki değerler kullanılarak brüte edilebilir.
Hedef Checksum: 0000BAC2 -> not checksum = f4 = FFFF45D3
xor f4,[h4] = e4 -> h4/4 = d4 -> c4f0 = D20296F9
xor c4,a4 = b4 = f3
xor f3,[h3] = e3 -> h3/4 = d3 -> c3
xor c3,a3 = b3 = f2
xor f2,[h2] = e2 -> h2/4 = d2 -> c2
xor c2,a2 = b2 = f1
xor f1,[h1] = e1 -> h1/4 = d1 -> c1
xor c1,a1 = b1 = f0
Sonuç itibari ile Checksum 4 baytlık bir değer, 4 baytın her biri için crc tablosunun her değeri denenerek brüte edilir. Crc Table 256 adet keyden oluştuğuna göre n^4 deneme demek oluyor. 256^4 = 4.294.967.296
GetTickCount Api'si işletim sistemi başladığı anda resetlenir ve her ms (milisaniye) değeri 1 artan işletim sistemine has bir değerdir.
DWORD GetTickCount(VOID), geri dönüş değeri 4 byte olduğuna göre yani 32 bit işaretsiz bir tamsayı.
Değer aralığı ise 0, .., 4.294.967.295 arasındadır. saat 23:59'dan sonra 00:00 olduğu gibi 4.294.967.295+1 ms sonra yani 49,71 gün sonra bu değer sıfırlanır.
Bunları neden yazdım? Bende bilmiyorum. :) Öylesine bir karalama...
0 yorum:
Yorum Gönder