You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
7.2 KiB
C#
199 lines
7.2 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Navicat_Keygen_Patch_By_DFoX
|
|
{
|
|
class mCheckSum
|
|
{
|
|
public string Pein = string.Empty;
|
|
public string Pefi = string.Empty;
|
|
public string TrovaCheckSum(string sFilePath)
|
|
{
|
|
if (File.Exists(sFilePath))
|
|
{
|
|
uint AttualeHeaderSum, CheckSumCalcolato = 0; uint uRet = 0;
|
|
uRet = MapFileAndCheckSum(sFilePath, out AttualeHeaderSum, out CheckSumCalcolato);
|
|
if (uRet == 0x00)
|
|
return AttualeHeaderSum.ToString("X8") + "-" + CheckSumCalcolato.ToString("X8");
|
|
else return "0";
|
|
}
|
|
else return "";
|
|
}
|
|
|
|
public bool FixCheckSum(string sFilePath)
|
|
{
|
|
if (!File.Exists(sFilePath))
|
|
return false;
|
|
IMAGE_DOS_HEADER DHD = new IMAGE_DOS_HEADER();
|
|
IMAGE_NT_HEADERS NHD = new IMAGE_NT_HEADERS();
|
|
|
|
int iPointer = 0;
|
|
uint uOriginal = 0;
|
|
uint uRecalculated = 0;
|
|
uint uRet = 0;
|
|
byte[] fBytes = new byte[0];
|
|
|
|
try
|
|
{
|
|
BinaryReader bReader = new BinaryReader(new FileStream(sFilePath, FileMode.Open, FileAccess.Read));
|
|
fBytes = bReader.ReadBytes((int)bReader.BaseStream.Length);
|
|
bReader.Close();
|
|
}
|
|
catch { }
|
|
|
|
if (fBytes.Length <= 0) { return false; }
|
|
|
|
GCHandle gHandle = GCHandle.Alloc(fBytes, GCHandleType.Pinned);
|
|
iPointer = gHandle.AddrOfPinnedObject().ToInt32();
|
|
DHD = (IMAGE_DOS_HEADER)Marshal.PtrToStructure(new IntPtr(iPointer), typeof(IMAGE_DOS_HEADER));
|
|
NHD = (IMAGE_NT_HEADERS)Marshal.PtrToStructure(new IntPtr(iPointer + DHD.e_lfanew), typeof(IMAGE_NT_HEADERS));
|
|
gHandle.Free();
|
|
|
|
if (NHD.Signature != 17744 || DHD.e_magic != 23117) { return false; }
|
|
|
|
uRet = MapFileAndCheckSum(sFilePath, out uOriginal, out uRecalculated);
|
|
|
|
if (uRet == 0x00)
|
|
{
|
|
if (uOriginal == uRecalculated)
|
|
{
|
|
Pein = uOriginal.ToString("X8");
|
|
Pefi = uRecalculated.ToString("X8");
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Pein = string.Empty;
|
|
Pefi = string.Empty;
|
|
return false;
|
|
}
|
|
Pein = uOriginal.ToString("X8");
|
|
Pefi = uRecalculated.ToString("X8");
|
|
NHD.OptionalHeader.CheckSum = uRecalculated;
|
|
|
|
byte[] bNHD = getBytes_(NHD);
|
|
if (fBytes.Length - (DHD.e_lfanew + bNHD.Length) <= 0) { Array.Resize(ref fBytes, (int)(fBytes.Length + bNHD.Length)); }
|
|
Array.Copy(bNHD, 0, fBytes, DHD.e_lfanew, bNHD.Length);
|
|
|
|
try
|
|
{
|
|
BinaryWriter bWriter = new BinaryWriter(new FileStream(sFilePath, FileMode.Open));
|
|
bWriter.Write(fBytes);
|
|
bWriter.Flush();
|
|
bWriter.Close();
|
|
}
|
|
catch { return false; }
|
|
|
|
return true;
|
|
}
|
|
|
|
private byte[] getBytes_(object oObject)
|
|
{
|
|
int iSize = Marshal.SizeOf(oObject);
|
|
IntPtr ipBuffer = Marshal.AllocHGlobal(iSize);
|
|
Marshal.StructureToPtr(oObject, ipBuffer, false);
|
|
byte[] bData = new byte[iSize];
|
|
Marshal.Copy(ipBuffer, bData, 0, iSize);
|
|
Marshal.FreeHGlobal(ipBuffer);
|
|
return bData;
|
|
}
|
|
|
|
//STRUCTURES
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct IMAGE_DOS_HEADER
|
|
{
|
|
public UInt16 e_magic;
|
|
public UInt16 e_cblp;
|
|
public UInt16 e_cp;
|
|
public UInt16 e_crlc;
|
|
public UInt16 e_cparhdr;
|
|
public UInt16 e_minalloc;
|
|
public UInt16 e_maxalloc;
|
|
public UInt16 e_ss;
|
|
public UInt16 e_sp;
|
|
public UInt16 e_csum;
|
|
public UInt16 e_ip;
|
|
public UInt16 e_cs;
|
|
public UInt16 e_lfarlc;
|
|
public UInt16 e_ovno;
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
|
|
public UInt16[] e_res1;
|
|
public UInt16 e_oemid;
|
|
public UInt16 e_oeminfo;
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
|
|
public UInt16[] e_res2;
|
|
public Int32 e_lfanew;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct IMAGE_FILE_HEADER
|
|
{
|
|
public UInt16 Machine;
|
|
public UInt16 NumberOfSections;
|
|
public UInt32 TimeDateStamp;
|
|
public UInt32 PointerToSymbolTable;
|
|
public UInt32 NumberOfSymbols;
|
|
public UInt16 SizeOfOptionalHeader;
|
|
public UInt16 Characteristics;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct IMAGE_DATA_DIRECTORY
|
|
{
|
|
public UInt32 VirtualAddress;
|
|
public UInt32 Size;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct IMAGE_OPTIONAL_HEADER32
|
|
{
|
|
public UInt16 Magic;
|
|
public Byte MajorLinkerVersion;
|
|
public Byte MinorLinkerVersion;
|
|
public UInt32 SizeOfCode;
|
|
public UInt32 SizeOfInitializedData;
|
|
public UInt32 SizeOfUninitializedData;
|
|
public UInt32 AddressOfEntryPoint;
|
|
public UInt32 BaseOfCode;
|
|
public UInt32 BaseOfData;
|
|
public UInt32 ImageBase;
|
|
public UInt32 SectionAlignment;
|
|
public UInt32 FileAlignment;
|
|
public UInt16 MajorOperatingSystemVersion;
|
|
public UInt16 MinorOperatingSystemVersion;
|
|
public UInt16 MajorImageVersion;
|
|
public UInt16 MinorImageVersion;
|
|
public UInt16 MajorSubsystemVersion;
|
|
public UInt16 MinorSubsystemVersion;
|
|
public UInt32 Win32VersionValue;
|
|
public UInt32 SizeOfImage;
|
|
public UInt32 SizeOfHeaders;
|
|
public UInt32 CheckSum;
|
|
public UInt16 Subsystem;
|
|
public UInt16 DllCharacteristics;
|
|
public UInt32 SizeOfStackReserve;
|
|
public UInt32 SizeOfStackCommit;
|
|
public UInt32 SizeOfHeapReserve;
|
|
public UInt32 SizeOfHeapCommit;
|
|
public UInt32 LoaderFlags;
|
|
public UInt32 NumberOfRvaAndSizes;
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
|
|
public IMAGE_DATA_DIRECTORY[] DataDirectory;
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct IMAGE_NT_HEADERS
|
|
{
|
|
public UInt32 Signature;
|
|
public IMAGE_FILE_HEADER FileHeader;
|
|
public IMAGE_OPTIONAL_HEADER32 OptionalHeader;
|
|
}
|
|
|
|
//API's
|
|
[DllImport("Imagehlp.dll", EntryPoint = "MapFileAndCheckSum", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
|
|
private static extern uint MapFileAndCheckSum(string Filename, out uint HeaderSum, out uint CheckSum);
|
|
}
|
|
}
|