122 lines
2.5 KiB
C
122 lines
2.5 KiB
C
#include "nzt.h"
|
|
#include "crypto.h"
|
|
|
|
#define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O))))
|
|
|
|
DWORD Crc32Hash(CONST PVOID Data, DWORD Size)
|
|
{
|
|
DWORD i, j, crc, cc;
|
|
|
|
if (NzT.Crc.Initialized == FALSE)
|
|
{
|
|
for (i = 0; i < 256; i++)
|
|
{
|
|
crc = i;
|
|
for (j = 8; j > 0; j--)
|
|
{
|
|
if (crc & 0x1)crc = (crc >> 1) ^ 0xEDB88320L;
|
|
else crc >>= 1;
|
|
}
|
|
NzT.Crc.Table[i] = crc;
|
|
}
|
|
|
|
NzT.Crc.Initialized = TRUE;
|
|
}
|
|
cc = 0xFFFFFFFF;
|
|
for (i = 0; i < Size; i++)cc = (cc >> 8) ^ NzT.Crc.Table[(((LPBYTE)Data)[i] ^ cc) & 0xFF];
|
|
return ~cc;
|
|
}
|
|
|
|
VOID CryptRC4(PCHAR pKey, DWORD Key, PVOID Destination, PVOID Source, DWORD Length)
|
|
{
|
|
DWORD i = 0, j = 0, k = 0;
|
|
UCHAR ucKey[256] = { 0 };
|
|
UCHAR ucTemp = 0;
|
|
|
|
for (i = 0; i < sizeof(ucKey); i++)
|
|
ucKey[i] = (CHAR)i;
|
|
|
|
for (i = j = 0; i < sizeof(ucKey); i++)
|
|
{
|
|
j = (j + pKey[i % Key] + ucKey[i]) % 256;
|
|
|
|
ucTemp = ucKey[i];
|
|
ucKey[i] = ucKey[j];
|
|
ucKey[j] = ucTemp;
|
|
}
|
|
|
|
for (i = j = 0, k = 0; k < Length; k++)
|
|
{
|
|
i = (i + 1) % 256;
|
|
j = (j + ucKey[i]) % 256;
|
|
|
|
ucTemp = ucKey[i];
|
|
ucKey[i] = ucKey[j];
|
|
ucKey[j] = ucTemp;
|
|
|
|
*RtlOffsetToPointer(Destination, k) = *RtlOffsetToPointer(Source, k) ^ ucKey[(ucKey[i] + ucKey[j]) % 256];
|
|
}
|
|
}
|
|
|
|
//
|
|
// Encrypts the specified memory buffer by XORing it's data with the specified key value in CBC manner.
|
|
//
|
|
VOID __stdcall CryptXor(
|
|
PCHAR Buffer, // data buffer
|
|
ULONG Size, // size of the buffer in bytes
|
|
ULONG Key, // key value
|
|
BOOL SkipZero // TRUE to skip zero dwords
|
|
)
|
|
{
|
|
PULONG pDwords = (PULONG)Buffer;
|
|
ULONG uDword, uVector = 0, Count = 0;
|
|
|
|
if (Size /= sizeof(ULONG))
|
|
{
|
|
do
|
|
{
|
|
uDword = *pDwords;
|
|
|
|
if (SkipZero && uDword == 0 && Size > 1 && pDwords[1] == 0)
|
|
break;
|
|
|
|
uDword = _rotl(uDword, Count += 1);
|
|
uDword ^= uVector;
|
|
uDword ^= Key;
|
|
uVector = uDword;
|
|
|
|
*pDwords = uDword;
|
|
pDwords += 1;
|
|
} while (Size -= 1);
|
|
} // if (Size /= sizeof(ULONG))
|
|
}
|
|
|
|
VOID __stdcall XorDecryptBuffer(
|
|
PCHAR Buffer, // buffer containing encrypted data
|
|
ULONG Size, // size of the buffer in bytes
|
|
ULONG Key, // key value
|
|
BOOL SkipZero // TRUE to skip zero dwords
|
|
)
|
|
{
|
|
PULONG pDwords = (PULONG)Buffer;
|
|
ULONG uDword, uLast, uVector = 0, Count = 0;
|
|
|
|
if (Size /= sizeof(ULONG))
|
|
{
|
|
do
|
|
{
|
|
uLast = uDword = *pDwords;
|
|
if (SkipZero && uDword == 0)
|
|
break;
|
|
|
|
uDword ^= Key;
|
|
uDword ^= uVector;
|
|
uDword = _rotr(uDword, Count += 1);
|
|
uVector = uLast;
|
|
|
|
*pDwords = uDword;
|
|
pDwords += 1;
|
|
} while (Size -= 1);
|
|
} // if (Size /= sizeof(ULONG))
|
|
}
|