⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 md5.c

📁 一份加密算法的源代码
💻 C
字号:

/*****************************************************************
*
* Reversed By yykingking (yykingking@126.com)
* 仅供学习交流使用
*****************************************************************/



#include <ntddk.h>
#include "header.h"
#include "md5.h"

extern PVOID g_pVoidUnknown1;
extern char* g_cArrayUnknown1;
unsigned   char   PADDING[64]   =   
{   
	 0x80,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0,     
		0,   0,   0,   0,   0,   0,   0,   0   
}; 

const   UINT4   S11   =   7;   
const   UINT4   S12   =   12;   
const   UINT4   S13   =   17;   
const   UINT4   S14   =   22;   
const   UINT4   S21   =   5;   
const   UINT4   S22   =   9;   
const   UINT4   S23   =   14;   
const   UINT4   S24   =   20;   
const   UINT4   S31   =   4;   
const   UINT4   S32   =   11;   
const   UINT4   S33   =   16;   
const   UINT4   S34   =   23;   
const   UINT4   S41   =   6;   
const   UINT4   S42   =   10;   
const   UINT4   S43   =   15;   
const   UINT4   S44   =   21;   

unsigned char g_DestBuffer[36] = { 0,};
unsigned char g_SourceBuffer[16] = { 0,};
unsigned char g_BinStrBuffer[132] = { 0,};	//存放2进制的字符串

void MD5_memset( char* Dest, char cByte, int Num)
{
	memset( Dest, cByte, Num);
}

void MD5Encode(unsigned   char   *output,   UINT4   *input,   unsigned   int   len)   
{   
	unsigned   int   i,   j;   
    
	for   (i   =   0,   j   =   0;   j   <   len;   i++,   j   +=   4)   {   
		output[j]   =   (unsigned   char)(input[i]   &   0xff);   
		output[j+1]   =   (unsigned   char)((input[i]   >>   8)   &   0xff);   
		output[j+2]   =   (unsigned   char)((input[i]   >>   16)   &   0xff);   
		output[j+3]   =   (unsigned   char)((input[i]   >>   24)   &   0xff);   
	}   
}   

void MD5_memcpy( char* Dest, char* Source, int Length)
{
	memcpy( Dest, Source, Length);
}

void MD5Decode(UINT4   *output,   unsigned   char   *input,   unsigned   int   len)   
{   
	unsigned   int   i,   j;   
    
	for   (i   =   0,   j   =   0;   j   <   len;   i++,   j   +=   4)   
		output[i]   =   ((UINT4)input[j])   |   (((UINT4)input[j+1])   <<   8)   |   
		(((UINT4)input[j+2])   <<   16)   |   (((UINT4)input[j+3])   <<   24);   
} 

void MD5Init( PMD5CONTEXT pContext)
{
	pContext->state[0] = 0x67452301;
	pContext->state[1] = 0xEFCDAB89;
	pContext->state[2] = 0x98BADCFE;
	pContext->state[3] = 0x10325476;
	pContext->count[0] = 0;
	pContext->count[1] = 0;
}

void MD5Transform   (UINT4   state[4],   unsigned   char   block[64])   
{   
	UINT4   a   =   state[0],   b   =   state[1],   c   =   state[2],   d   =   state[3],   x[16];   
    
	MD5Decode(x,   block,   64);   
	/*   Round   1   */   
	FF   (a,   b,   c,   d,   x[   0],   S11,   0xd76aa478);   /*   1   */   
	FF   (d,   a,   b,   c,   x[   1],   S12,   0xe8c7b756);   /*   2   */   
	FF   (c,   d,   a,   b,   x[   2],   S13,   0x242070db);   /*   3   */   
	FF   (b,   c,   d,   a,   x[   3],   S14,   0xc1bdceee);   /*   4   */   
	FF   (a,   b,   c,   d,   x[   4],   S11,   0xf57c0faf);   /*   5   */   
	FF   (d,   a,   b,   c,   x[   5],   S12,   0x4787c62a);   /*   6   */   
	FF   (c,   d,   a,   b,   x[   6],   S13,   0xa8304613);   /*   7   */   
	FF   (b,   c,   d,   a,   x[   7],   S14,   0xfd469501);   /*   8   */   
	FF   (a,   b,   c,   d,   x[   8],   S11,   0x698098d8);   /*   9   */   
	FF   (d,   a,   b,   c,   x[   9],   S12,   0x8b44f7af);   /*   10   */   
	FF   (c,   d,   a,   b,   x[10],   S13,   0xffff5bb1);   /*   11   */   
	FF   (b,   c,   d,   a,   x[11],   S14,   0x895cd7be);   /*   12   */   
	FF   (a,   b,   c,   d,   x[12],   S11,   0x6b901122);   /*   13   */   
	FF   (d,   a,   b,   c,   x[13],   S12,   0xfd987193);   /*   14   */   
	FF   (c,   d,   a,   b,   x[14],   S13,   0xa679438e);   /*   15   */   
	FF   (b,   c,   d,   a,   x[15],   S14,   0x49b40821);   /*   16   */   
    
	/*   Round   2   */   
	GG   (a,   b,   c,   d,   x[   1],   S21,   0xf61e2562);   /*   17   */   
	GG   (d,   a,   b,   c,   x[   6],   S22,   0xc040b340);   /*   18   */   
	GG   (c,   d,   a,   b,   x[11],   S23,   0x265e5a51);   /*   19   */   
	GG   (b,   c,   d,   a,   x[   0],   S24,   0xe9b6c7aa);   /*   20   */   
	GG   (a,   b,   c,   d,   x[   5],   S21,   0xd62f105d);   /*   21   */   
	GG   (d,   a,   b,   c,   x[10],   S22,   0x02441453);   /*   22   */   
	GG   (c,   d,   a,   b,   x[15],   S23,   0xd8a1e681);   /*   23   */   
	GG   (b,   c,   d,   a,   x[   4],   S24,   0xe7d3fbc8);   /*   24   */   
	GG   (a,   b,   c,   d,   x[   9],   S21,   0x21e1cde6);   /*   25   */   
	GG   (d,   a,   b,   c,   x[14],   S22,   0xc33707d6);   /*   26   */   
	GG   (c,   d,   a,   b,   x[   3],   S23,   0xf4d50d87);   /*   27   */   
	GG   (b,   c,   d,   a,   x[   8],   S24,   0x455a14ed);   /*   28   */   
	GG   (a,   b,   c,   d,   x[13],   S21,   0xa9e3e905);   /*   29   */   
	GG   (d,   a,   b,   c,   x[   2],   S22,   0xfcefa3f8);   /*   30   */   
	GG   (c,   d,   a,   b,   x[   7],   S23,   0x676f02d9);   /*   31   */   
	GG   (b,   c,   d,   a,   x[12],   S24,   0x8d2a4c8a);   /*   32   */   
    
	/*   Round   3   */   
	HH   (a,   b,   c,   d,   x[   5],   S31,   0xfffa3942);   /*   33   */   
	HH   (d,   a,   b,   c,   x[   8],   S32,   0x8771f681);   /*   34   */   
	HH   (c,   d,   a,   b,   x[11],   S33,   0x6d9d6122);   /*   35   */   
	HH   (b,   c,   d,   a,   x[14],   S34,   0xfde5380c);   /*   36   */   
	HH   (a,   b,   c,   d,   x[   1],   S31,   0xa4beea44);   /*   37   */   
	HH   (d,   a,   b,   c,   x[   4],   S32,   0x4bdecfa9);   /*   38   */   
	HH   (c,   d,   a,   b,   x[   7],   S33,   0xf6bb4b60);   /*   39   */   
	HH   (b,   c,   d,   a,   x[10],   S34,   0xbebfbc70);   /*   40   */   
	HH   (a,   b,   c,   d,   x[13],   S31,   0x289b7ec6);   /*   41   */   
	HH   (d,   a,   b,   c,   x[   0],   S32,   0xeaa127fa);   /*   42   */   
	HH   (c,   d,   a,   b,   x[   3],   S33,   0xd4ef3085);   /*   43   */   
	HH   (b,   c,   d,   a,   x[   6],   S34,   0x04881d05);   /*   44   */   
	HH   (a,   b,   c,   d,   x[   9],   S31,   0xd9d4d039);   /*   45   */   
	HH   (d,   a,   b,   c,   x[12],   S32,   0xe6db99e5);   /*   46   */   
	HH   (c,   d,   a,   b,   x[15],   S33,   0x1fa27cf8);   /*   47   */   
	HH   (b,   c,   d,   a,   x[   2],   S34,   0xc4ac5665);   /*   48   */   
    
	/*   Round   4   */   
	II   (a,   b,   c,   d,   x[   0],   S41,   0xf4292244);   /*   49   */   
	II   (d,   a,   b,   c,   x[   7],   S42,   0x432aff97);   /*   50   */   
	II   (c,   d,   a,   b,   x[14],   S43,   0xab9423a7);   /*   51   */   
	II   (b,   c,   d,   a,   x[   5],   S44,   0xfc93a039);   /*   52   */   
	II   (a,   b,   c,   d,   x[12],   S41,   0x655b59c3);   /*   53   */   
	II   (d,   a,   b,   c,   x[   3],   S42,   0x8f0ccc92);   /*   54   */   
	II   (c,   d,   a,   b,   x[10],   S43,   0xffeff47d);   /*   55   */   
	II   (b,   c,   d,   a,   x[   1],   S44,   0x85845dd1);   /*   56   */   
	II   (a,   b,   c,   d,   x[   8],   S41,   0x6fa87e4f);   /*   57   */   
	II   (d,   a,   b,   c,   x[15],   S42,   0xfe2ce6e0);   /*   58   */   
	II   (c,   d,   a,   b,   x[   6],   S43,   0xa3014314);   /*   59   */   
	II   (b,   c,   d,   a,   x[13],   S44,   0x4e0811a1);   /*   60   */   
	II   (a,   b,   c,   d,   x[   4],   S41,   0xf7537e82);   /*   61   */   
	II   (d,   a,   b,   c,   x[11],   S42,   0xbd3af235);   /*   62   */   
	II   (c,   d,   a,   b,   x[   2],   S43,   0x2ad7d2bb);   /*   63   */   
	II   (b,   c,   d,   a,   x[   9],   S44,   0xeb86d391);   /*   64   */   
    
	state[0]   +=   a;   
	state[1]   +=   b;   
	state[2]   +=   c;   
	state[3]   +=   d;   
    
	/*   Zeroize   sensitive   information.   
	*/   
	MD5_memset((POINTER)x,   0,   sizeof   (x));   
}   

void   MD5Update( PMD5CONTEXT pContext, unsigned char *input, unsigned int inputLen)   
{   
	unsigned int i, index, partLen;   
    
	//   Compute   number   of   bytes   mod   64   
	index = (unsigned int)((pContext->count[0]>>3)&0x3F);   
    
	//   Update   number   of   bits   
	if( ( pContext->count[0] += ((UINT4)inputLen<<3) ) < ( (UINT4)inputLen<<3) )   
		pContext->count[1]++;   
	pContext->count[1] += ( (UINT4)inputLen>>29 );   
    
	partLen = 64 - index;   
    
	//   Transform   as   many   times   as   possible.   
	if   (inputLen >= partLen)   
	{   
		MD5_memcpy((POINTER)&pContext->buffer[index], (POINTER)input, partLen);   
		MD5Transform( pContext->state, pContext->buffer);   
		
		for   (i = partLen; i + 63 < inputLen; i += 64)   
			MD5Transform(pContext->state,   &input[i]);   
		
		index   =   0;   
	}   
	else   
		i   =   0;   
    
	//   Buffer   remaining   input   
	MD5_memcpy((POINTER)&pContext->buffer[index], (POINTER)&input[i], inputLen-i);   
}   

void MD5Final(PMD5CONTEXT pContext, unsigned char digest[16])   
{   
	unsigned   char   bits[8];   
	unsigned   int   index,   padLen;   
    
	/*   Save   number   of   bits   */   
	MD5Encode(bits,   pContext->count,   8);   
    
	/*   Pad   out   to   56   mod   64.*/   
	index   =   (unsigned   int)((pContext->count[0]   >>   3)   &   0x3f);   
	padLen   =   (index   <   56)   ?   (56   -   index)   :   (120   -   index);   
	MD5Update(pContext,PADDING,   padLen);   
    
	/*   Append   length   (before   padding)   */   
	MD5Update(pContext,bits,   8);   
    
	/*   Store   state   in   digest   */   
	MD5Encode(digest,   pContext->state,   16);   
    
	/*   Zeroize   sensitive   information.   */   
	MD5_memset( (unsigned char*)pContext, 0, sizeof(MD5CONTEXT));   
}   

NTSTATUS MD5String( PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
{
	PIO_STACK_LOCATION pIrpStack;
	MD5CONTEXT md5Context;
	int Index;
	PMDL pMdl;

	pIrpStack = IoGetCurrentIrpStackLocation( pIrp);
	if ( g_pVoidUnknown1 != NULL)
	{
		// 推测此表是个*码转换表,,,???
		ConvertCharArray( g_cArrayUnknown1, g_pVoidUnknown1);
		memset( g_SourceBuffer, 0, 16);
		memset( g_DestBuffer, 0, 33);
		memset( g_BinStrBuffer, 0, 129);
		MD5Init( &md5Context);
		MD5Update( &md5Context, g_pVoidUnknown1, strlen( g_pVoidUnknown1));
		MD5Final( &md5Context, g_SourceBuffer);
		for ( Index=0; Index<16; Index++)
		{
			sprintf( g_DestBuffer, "%02x", g_SourceBuffer[Index]);
		}
		ChangeHexToBin( (char*)g_DestBuffer, (char*)g_BinStrBuffer);
		pMdl = pIrp->MdlAddress;
		if ( pMdl->MdlFlags == ( MDL_SOURCE_IS_NONPAGED_POOL | MDL_MAPPED_TO_SYSTEM_VA))
			MmMapLockedPages( pMdl, KernelMode);
		else
			pMdl = (PMDL)pMdl->MappedSystemVa;
		
		memcpy( pMdl, g_BinStrBuffer, pIrpStack->Parameters.DeviceIoControl.OutputBufferLength);
	}
	return STATUS_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -