www.pudn.com > ntshell.rar > shlib.c


#include  
#include  
 
#define RC5_R 12 
#define RC5_P 0xb7e15163 
#define RC5_Q 0x9e3779b9 
#define ROTL(x, c) (((x) << ((c) & 31)) | ((x) >> (32 - ((c) & 31)))) 
#define ROTR(x, c) (((x) >> ((c) & 31)) | ((x) << (32 - ((c) & 31)))) 
#define swap(a, b) {UCHAR t; t = *a; *a = *b; *b = t;} 
 
typedef unsigned char UCHAR; 
typedef unsigned short USHORT; 
typedef unsigned long ULONG; 
 
static ULONG rc5_sbox[RC5_R * 2 + 2]; 
static int crc_table_empty = 1; 
static ULONG crc_table[256]; 
static char base64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 
static UCHAR rc4_sbox[256]; 
static long holdrand = 1L; 
 
void rc4_key(UCHAR *key, ULONG len) 
{ 
	ULONG i, j, k; 
 
	for (i = 0; i < 256; i++) 
		rc4_sbox[i] = (UCHAR)i; 
 
	j = k = 0; 
 
	for (i = 0; i < 256; i++) 
	{ 
		j += key[k] + rc4_sbox[i]; 
 
		if (++k >= len) 
			k = 0; 
 
		swap(&rc4_sbox[i], &rc4_sbox[j & 255]); 
	} 
} 
 
void rc4_xor(UCHAR *buf, ULONG len) 
{  
	ULONG i; 
	UCHAR j, x, y; 
	UCHAR s[256]; 
 
	for (i = 0; i < 64; i++) 
		((ULONG *)s)[i] = ((ULONG *)rc4_sbox)[i]; 
 
	x = y = 0; 
 
	for (i = 0; i < len; i++) 
	{ 
		y += s[++x]; 
		swap(&s[x], &s[y]); 
		j = s[x] + s[y]; 
		buf[i] ^= s[j]; 
	} 
} 
 
static void make_crc_table() 
{ 
	ULONG c, poly; 
	int n, k; 
	static const UCHAR p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; 
 
	/* make exclusive-or pattern from polynomial (0xedb88320L) */ 
	poly = 0L; 
 
	for (n = 0; n < sizeof(p) / sizeof(UCHAR); n++) 
		poly |= 1L << (31 - p[n]); 
 
	for (n = 0; n < 256; n++) 
	{ 
		c = (ULONG)n; 
 
		for (k = 0; k < 8; k++) 
			c = c & 1 ? poly ^ (c >> 1) : c >> 1; 
		crc_table[n] = c; 
	} 
} 
/* ========================================================================= */ 
#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); 
#define DO2(buf)  DO1(buf); DO1(buf); 
#define DO4(buf)  DO2(buf); DO2(buf); 
#define DO8(buf)  DO4(buf); DO4(buf); 
/* ========================================================================= */ 
 
ULONG crc32(ULONG crc, void *buf, ULONG len) 
{ 
	if (crc_table_empty) 
	{ 
		make_crc_table(); 
		crc_table_empty = 0; 
	} 
 
	crc = crc ^ 0xffffffffL; 
 
	while (len >= 8) 
	{ 
		DO8(((UCHAR *)buf)); 
		len -= 8; 
	} 
 
	while (len--) 
		DO1(((UCHAR *)buf)); 
 
	return crc ^ 0xffffffffL; 
} 
 
ULONG Base64Encode(void *dst, void *src, ULONG len) 
{ 
	UCHAR *p1 = src; 
	char *p2 = dst; 
	ULONG i, v; 
 
	for (i = 0; i < len; i += 3) 
	{ 
		switch (len - i) 
		{ 
		case 1: 
			v = (p1[i] << 16); 
			*p2++ = base64_alphabet[v >> 18]; 
			*p2++ = base64_alphabet[(v >> 12) & 63]; 
			*p2++ = base64_alphabet[64]; 
			*p2++ = base64_alphabet[64]; 
			break; 
 
		case 2: 
			v = (p1[i] << 16) | (p1[i + 1] << 8); 
			*p2++ = base64_alphabet[v >> 18]; 
			*p2++ = base64_alphabet[(v >> 12) & 63]; 
			*p2++ = base64_alphabet[(v >> 6) & 63]; 
			*p2++ = base64_alphabet[64]; 
			break; 
 
		default: 
			v = (p1[i] << 16) | (p1[i + 1] << 8) | p1[i + 2]; 
			*p2++ = base64_alphabet[v >> 18]; 
			*p2++ = base64_alphabet[(v >> 12) & 63]; 
			*p2++ = base64_alphabet[(v >> 6) & 63]; 
			*p2++ = base64_alphabet[v & 63]; 
			break; 
		} 
	} 
 
	*p2++ = '\0'; 
 
	return p2 - (char *)dst; 
} 
 
ULONG Base64Decode(void *dst, void *src,ULONG len) 
{ 
	char *p1 = src; 
	UCHAR *p2 = dst; 
	ULONG i, v, n; 
	UCHAR base64_table[256]; 
 
	for (i = 0; i < sizeof(base64_table); i++) 
		base64_table[i] = 255; 
 
	for (i = 0; i < 64; i++) 
		base64_table[base64_alphabet[i]] = (char)i; 
 
	for (i = 0, n = 0; i < len; i++) 
	{ 
		if (base64_table[p1[i]] == 255) 
			break; 
 
		v = base64_table[p1[i]] | (v << 6); 
		n += 6; 
 
		if (n >= 8) 
		{ 
			n -= 8; 
			*p2++ = (UCHAR)(v >> n); 
		} 
	} 
 
	return p2 - (UCHAR *)dst; 
} 
 
void rc5_key(UCHAR *pbKey, ULONG dwLen) 
{ 
	ULONG i, j, k, A, B; 
	ULONG *S; 
	ULONG L[16]; 
	ULONG SL, LL; 
 
	SL = (RC5_R + 1) * 2; 
	LL = (dwLen + 3) >> 2; 
	S = rc5_sbox; 
	L[dwLen >> 2] = 0; 
	memcpy((UCHAR *)L, pbKey, dwLen); 
 
	S[0] = RC5_P; 
 
	for (i = 1; i < SL; i++) 
	{ 
		S[i] = S[i - 1] + RC5_Q; 
	} 
 
	i = (SL > LL ? SL : LL) * 3; 
	A = B = j = k = 0; 
 
	for (; i > 0; i--) 
	{ 
		A = S[j] = ROTL(S[j] + (A + B), 3); 
		B = L[k] = ROTL(L[k] + (A + B), (A + B)); 
		if (++j >= SL) j = 0; 
		if (++k >= LL) k = 0; 
	} 
} 
 
static void rc5_encrypt1(UCHAR *pOut, UCHAR *pIn) 
{ 
	ULONG i, A, B; 
	ULONG *S; 
 
	S = rc5_sbox; 
	A = ((ULONG *)pIn)[0] + S[0]; 
	B = ((ULONG *)pIn)[1] + S[1]; 
 
	for (i = 1; i <= RC5_R; i++) 
	{ 
		A = ROTL(A ^ B, B) + S[2 * i]; 
		B = ROTL(B ^ A, A) + S[2 * i + 1]; 
	} 
 
	((ULONG *)pOut)[0] = A; 
	((ULONG *)pOut)[1] = B; 
} 
 
static void rc5_decrypt1(UCHAR *pOut, UCHAR *pIn) 
{ 
	ULONG i, A, B; 
	ULONG *S; 
 
	S = rc5_sbox; 
	B = ((ULONG *)pIn)[1]; 
	A = ((ULONG *)pIn)[0]; 
 
	for (i = RC5_R; i > 0; i--) 
	{ 
		B = ROTR(B - S[2 * i + 1], A) ^ A; 
		A = ROTR(A - S[2 * i], B) ^ B; 
	} 
 
	((ULONG *)pOut)[1] = B - S[1]; 
	((ULONG *)pOut)[0] = A - S[0]; 
} 
 
void rc5_encrypt(void *dst, void *src, ULONG len) 
{ 
	ULONG i, m, n; 
 
	if (len < 8) 
	{ 
		for (i = 0; i < len; i++) 
			((UCHAR *)dst)[i] = ((UCHAR *)src)[i] ^ (UCHAR)rc5_sbox[i]; 
		return; 
	} 
 
	if (len & 7) 
	{ 
		n = (len & 7) + 8; 
		m = len - n; 
	} 
	else 
	{ 
		n = 0; 
		m = len; 
	} 
 
	for (i = 0; i < m; i += 8) 
	{ 
		rc5_encrypt1((UCHAR *)dst + i, (UCHAR *)src + i); 
	} 
 
	if (n) 
	{ 
		memcpy((UCHAR *)dst + i, (UCHAR *)src + i, n); 
		rc5_encrypt1((UCHAR *)dst + i, (UCHAR *)dst + i); 
		rc5_encrypt1((UCHAR *)dst + i + n - 8, (UCHAR *)dst + i + n - 8); 
	} 
} 
 
void rc5_decrypt(void *dst, void *src, ULONG len) 
{ 
	ULONG i, m, n; 
 
	if (len < 8) 
	{ 
		for (i = 0; i < len; i++) 
			((UCHAR *)dst)[i] = ((UCHAR *)src)[i] ^ (UCHAR)rc5_sbox[i]; 
		return; 
	} 
 
	if (len & 7) 
	{ 
		n = (len & 7) + 8; 
		m = len - n; 
	} 
	else 
	{ 
		n = 0; 
		m = len; 
	} 
 
	for (i = 0; i < m; i += 8) 
	{ 
		rc5_decrypt1((UCHAR *)dst + i, (UCHAR *)src + i); 
	} 
 
	if (n) 
	{ 
		memcpy((UCHAR *)dst + i, (UCHAR *)src + i, n); 
		rc5_decrypt1((UCHAR *)dst + i + n - 8, (UCHAR *)dst + i + n - 8); 
		rc5_decrypt1((UCHAR *)dst + i, (UCHAR *)dst + i); 
	} 
} 
 
void *MemorySearchLR(void *m1, ULONG n1, void *m2, ULONG n2) 
{ 
	UCHAR *s1 = m1; 
	UCHAR *s2 = m2; 
	ULONG i, index[256]; 
 
	if (n1 < n2) 
		return NULL; 
 
	if (n2 == 0) 
		return m1; 
 
	for (i = 0; i < 256; i++) 
		index[i] = n2 + 1; 
 
	for (i = 0; i < n2; i++) 
		index[s2[i]] = n2 - i; 
 
	do 
	{ 
		for (i = 0; s1[i] == s2[i]; i++) 
		{ 
			if (i == n2 - 1) 
				return s1; 
		} 
 
		s1 += index[s1[n2]]; 
	} while (s1 + n2 <= (char *)m1 + n1); 
 
	return NULL; 
} 
 
void *MemorySearchRL(void *m1, ULONG n1, void *m2, ULONG n2) 
{ 
	UCHAR *s1 = m1; 
	UCHAR *s2 = m2; 
	ULONG i, index[256]; 
 
	if (n1 < n2) 
		return NULL; 
 
	if (n2 == 0) 
		return m1; 
 
	for (i = 0; i < 256; i++) 
		index[i] = n2 + 1; 
 
	for (i = n2 - 1; i >= 0; i--) 
		index[s2[i]] = n2 - i; 
 
	do 
	{ 
		for (i = n2 - 1; s1[i] == s2[i]; i--) 
		{ 
			if (i == 0) 
				return s1; 
		} 
 
		s1 -= index[*(s1 - 1)]; 
	} while (s1 >= (char *)m1 + n2); 
 
	return NULL; 
} 
#ifdef _DEBUG 
size_t strlen(const char *str) 
{ 
	const char *s; 
	 
	s = str; 
	while (*s++); 
 
	return s - str - 1; 
} 
 
char *strcpy(char *dst, const char *src) 
{ 
	char *s; 
	 
	s = dst; 
	while (*s++ = *src++); 
 
	return dst; 
} 
 
char *strcat(char *dst, const char *src) 
{ 
	char *s; 
	 
	s = dst; 
	while (*s++); 
	s -= 1; 
	while (*s++ = *src++); 
 
	return dst; 
} 
 
int strcmp(const char *str1, const char *str2) 
{ 
	int ret; 
 
	while (!(ret = *str1 - *str2) && *str2) 
	{ 
		str1++; 
		str2++; 
	} 
 
	return ret; 
} 
#endif 
int stricmp(const char *str1, const char *str2) 
{ 
	unsigned char f, l; 
	int ret; 
 
	do 
	{ 
		f = *str1++; 
		l = *str2++; 
		if ((unsigned char)(f - 0x41) < 26) 
			f |= 0x20; 
		if ((unsigned char)(l - 0x41) < 26) 
			l |= 0x20; 
	} while (f && !(ret = f - l)); 
 
	return ret; 
} 
 
char *strncpy(char *dst, const char *src, size_t len) 
{ 
	char *s; 
 
	s = dst; 
	while (len && (*s++ = *src++)) len--; 
	while (len--) *s++ = '\0'; 
 
	return dst; 
} 
 
int strncmp(const char *str1, const char *str2, size_t len) 
{ 
	int ret = 0; 
 
	while (len-- && *str1 && !(ret = *str1 - *str2)) 
	{ 
		str1++; 
		str2++; 
	} 
 
	return ret; 
} 
 
int strnicmp(const char *str1, const char *str2, size_t len) 
{ 
	char f, l; 
	int ret; 
 
	while (len--) 
	{ 
		f = *str1++; 
		l = *str2++; 
		if (f >= 'A' && f <= 'Z') 
			f += 'a' - 'A'; 
		if (l >= 'A' && l <= 'Z') 
			l += 'a' - 'A'; 
		if (ret = f - l) break; 
	} 
 
	return ret; 
} 
 
char *strchr(const char *str, int chr) 
{ 
	do 
	{ 
		if (*str == (char)chr) 
			goto suc; 
	} while (*str++); 
	str = 0; 
 
suc: 
	return (char *)str; 
} 
 
char *strstr(const char *str1, const char *str2) 
{ 
	const char *pt1; 
	const char *pt2; 
 
	while (*str1) 
	{ 
		pt1 = str1; 
		pt2 = str2; 
		do 
		{ 
			if (!*pt2) goto suc; 
		} while (*pt1++ == *pt2++); 
		str1++; 
	} 
	str1 = 0; 
 
suc: 
	return (char *)str1; 
} 
 
char *strrchr(const char *string, int ch) 
{ 
	const char *start; 
 
	start = string; 
	while (*string++); 
	while (--string != start) 
		if (*string == (char)ch) 
			goto suc; 
	string = 0; 
 
suc: 
	return (char *)string; 
} 
 
void srand(unsigned int seed) 
{ 
	holdrand = (long)seed; 
} 
 
int rand(void) 
{ 
	return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); 
} 
 
void replace(char *str, const char *s1, const char *s2) 
{ 
	char *p1 = str, *p2; 
	int n1 = strlen(s1); 
	int n2 = strlen(s2); 
 
	while ((p1 = strstr(p1, s1)) != NULL) 
	{ 
		p2 = p1 + n1; 
		memmove(p1 + n2, p2, strlen(p2)); 
		memcpy(p1, s2, n2); 
		p1 = p2; 
	} 
} 
 
int compare(const char *str1, const char *str2) 
{ 
	UCHAR chr; 
 
	while (*str1 && *str2) 
	{ 
		switch (*str1) 
		{ 
		case '*': 
			while (*++str1 && *str1 == '*'); 
			do 
			{ 
				chr = *str2; 
				if (chr >= 'a' && chr <= 'z') 
					chr -= 'a' - 'A'; 
			} while (*str1 != chr && *++str2); 
			continue; 
		case '?': 
			str1++; 
			str2++; 
			continue; 
		} 
		chr = *str2; 
		if (chr >= 'a' && chr <= 'z') 
			chr -= 'a' - 'A'; 
		if (*str1 != chr) 
			break; 
		str1++; 
		str2++; 
	} 
 
	return *str2 - *str1; 
}