private static uint CalcChecksum(ExecutableImage pe, out uint checkSumPos) { const uint checksum_pos_in_optional_headers = 64; checkSumPos = (uint)pe.NTHeaders.OptionalHeader.Location.FileOffset + checksum_pos_in_optional_headers; uint fileSize = (uint)pe.GetBytes().Length; MemoryStream ms = new MemoryStream(pe.GetBytes()); byte[] bytes4 = new byte[4]; int pos = 0; ulong calcSum = 0; ulong top = (ulong)0xFFFFFFFF + 1; while (ms.Read(bytes4, pos, 4) == 4) { uint dw = BitConverter.ToUInt32(bytes4, 0); if (ms.Position == checkSumPos + 4) { continue; } calcSum = (calcSum & 0xFFFFFFFF) + dw + (calcSum >> 32); if (calcSum > top) { calcSum = (calcSum & 0xFFFFFFFF) + (calcSum >> 32); } } calcSum = (calcSum & 0xffff) + (calcSum >> 16); calcSum = (calcSum) + (calcSum >> 16); calcSum = calcSum & 0xffff; calcSum += (uint)fileSize; return((uint)calcSum); }