Burada çıkarılan kullanarak LockBits olarak görüntünün sadece bayt bir SHA256 karma üreten bir powershell komut dosyası: Bu aynı zamanda joker karakterler ve edebi yolları kabul eden bir boru hattı yetenekli versiyonudur. Bu, farklı her dosya için benzersiz bir karma üretmelidir. Dosyayı yinelenen kodu eklemediğimi lütfen unutmayın, ancak şu andaki hardcode c: \ test.bmp dosyasını foreach dizin yineleyici ile değiştirmek nispeten basit bir görev olmalıdır. $ Final değişkeni, final hashının hex - ascii dizesini içerir.
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing.Imaging")
[System.Reflection.Assembly]::LoadWithPartialName("System.Security")
$bmp = [System.Drawing.Bitmap]::FromFile("c:\\test.bmp")
$rect = [System.Drawing.Rectangle]::FromLTRB(0, 0, $bmp.width, $bmp.height)
$lockmode = [System.Drawing.Imaging.ImageLockMode]::ReadOnly
$bmpData = $bmp.LockBits($rect, $lockmode, $bmp.PixelFormat);
$dataPointer = $bmpData.Scan0;
$totalBytes = $bmpData.Stride * $bmp.Height;
$values = New-Object byte[] $totalBytes
[System.Runtime.InteropServices.Marshal]::Copy($dataPointer, $values, 0, $totalBytes);
$bmp.UnlockBits($bmpData);
$sha = new-object System.Security.Cryptography.SHA256Managed
$hash = $sha.ComputeHash($values);
$final = [System.BitConverter]::ToString($hash).Replace("-", "");
Belki eşdeğer C# kodu da anlayış ve size yardımcı olacak:
private static String ImageDataHash(FileInfo imgFile)
{
using (Bitmap bmp = (Bitmap)Bitmap.FromFile(imgFile.FullName))
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr dataPointer = bmpData.Scan0;
int totalBytes = bmpData.Stride * bmp.Height;
byte[] values = new byte[totalBytes];
System.Runtime.InteropServices.Marshal.Copy(dataPointer, values, 0, totalBytes);
bmp.UnlockBits(bmpData);
SHA256 sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(values);
return BitConverter.ToString(hash).Replace("-", "");
}
}
İlk yaklaşım çalışmıyor . Aynı görüntü için farklı farklı kodlar döndürür (farklı meta veriler). İkinci yaklaşım işe yarıyor ve PowerShell betiğinde herkesin farklı seviyelerde tam olarak ne yaptıklarını açıklıyor. :-) –