Задача, переместить\скопировать тело DLL в другое место АП, создать поток в его EP. Падает с Access Voilation в ProcessReloc. В чем может быть проблема ? Этот же самый код успешно работает в Kernel Mode Код (Text): VOID ProcessReloc(ULONG ModuleBase, ULONG ModuleSize, PIMAGE_NT_HEADERS pNtHeaders, ULONG SpaceDelta) { PIMAGE_BASE_RELOCATION pRelocTable; ULONG RelocTableSize; PIMAGE_BASE_RELOCATION pReloc; PUSHORT RelocsTbl; ULONG i; ULONG TableAddr; pRelocTable = (PVOID)(pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress + (ULONG)ModuleBase); RelocTableSize = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size; for (pReloc = pRelocTable; (ULONG)pReloc < ((ULONG)pRelocTable + RelocTableSize); pReloc = (PVOID)((ULONG)pReloc + pReloc->SizeOfBlock)){ RelocsTbl = (PUSHORT)((ULONG)pReloc + 0x8); for (i = 0; i < ((pReloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / 2); i++) { TableAddr = pReloc->VirtualAddress + (RelocsTbl[i] & 0x0fff) + ModuleBase; if ((TableAddr < ModuleBase) || (TableAddr >= ModuleBase + ModuleSize)){ continue; } if ((RelocsTbl[i] & 0xF000) == 0x3000){ *(PULONG)TableAddr += SpaceDelta; } } } } BOOLEAN HideDll(PVOID pDllBase, ULONG nDllSize, ULONG nDllOffset) { PVOID pNewPlace; PVOID pNewEntry = NULL; HANDLE hThread; ULONG nDelta; PIMAGE_DOS_HEADER pImageDosHeader = NULL; PIMAGE_OPTIONAL_HEADER pImageOptionalHeader = NULL; PIMAGE_NT_HEADERS pImageNtHeaders = NULL; PIMAGE_FILE_HEADER pImageFileHeader = NULL; pNewPlace = ALLOC(nDllSize); if(!pNewPlace) return FALSE; memcpy(pNewPlace,pDllBase,nDllSize); pNewEntry = (PVOID)((ULONG)pNewPlace + nDllOffset); pImageDosHeader = (PIMAGE_DOS_HEADER)pNewPlace; pImageNtHeaders = (PIMAGE_NT_HEADERS)NTSIGNATURE(pImageDosHeader); nDelta = (ULONG)pNewPlace - (ULONG)pDllBase; ProcessReloc((ULONG)pNewPlace,nDllSize,pImageNtHeaders,nDelta); hThread = pCreateThread(NULL, 0, &pNewEntry, (LPVOID)pNewPlace, CREATE_SUSPENDED, &nDelta); if(!hThread) return FALSE; ResumeThread(hThread); return TRUE; } VOID FakeDllMain(LPVOID lParam) { MessageBox(0,"Fake Main",0,0); ExitThread(-1); } BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){ ULONG nOffset = (ULONG)((ULONG)FakeDllMain - (ULONG)hinstDLL); if(HideDll((PVOID)hinstDLL,DLL_SIZE,nOffset)) return FALSE; }