DLL relocation в АП процесса

Тема в разделе "WASM.WIN32", создана пользователем WIN32, 26 май 2008.

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Задача, переместить\скопировать тело DLL в другое место АП, создать поток в его EP.
    Падает с Access Voilation в ProcessReloc. В чем может быть проблема ?
    Этот же самый код успешно работает в Kernel Mode
    Код (Text):
    1. VOID ProcessReloc(ULONG ModuleBase,
    2.                   ULONG ModuleSize,
    3.                   PIMAGE_NT_HEADERS pNtHeaders,
    4.                   ULONG SpaceDelta)
    5. {
    6.     PIMAGE_BASE_RELOCATION  pRelocTable;
    7.     ULONG                   RelocTableSize;
    8.     PIMAGE_BASE_RELOCATION  pReloc;
    9.     PUSHORT                 RelocsTbl;
    10.     ULONG                   i;
    11.     ULONG                   TableAddr;
    12.  
    13.     pRelocTable    = (PVOID)(pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress + (ULONG)ModuleBase);
    14.     RelocTableSize = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
    15.  
    16.     for (pReloc = pRelocTable; (ULONG)pReloc < ((ULONG)pRelocTable + RelocTableSize); pReloc = (PVOID)((ULONG)pReloc + pReloc->SizeOfBlock)){
    17.         RelocsTbl = (PUSHORT)((ULONG)pReloc + 0x8);
    18.         for (i = 0; i < ((pReloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / 2); i++)
    19.         {
    20.             TableAddr = pReloc->VirtualAddress + (RelocsTbl[i] & 0x0fff) + ModuleBase;
    21.             if ((TableAddr < ModuleBase) || (TableAddr >= ModuleBase + ModuleSize)){
    22.                 continue;
    23.             }
    24.             if ((RelocsTbl[i] & 0xF000) == 0x3000){
    25.                 *(PULONG)TableAddr += SpaceDelta;
    26.             }
    27.         }
    28.     }
    29. }
    30. BOOLEAN HideDll(PVOID pDllBase,
    31.                 ULONG nDllSize,
    32.             ULONG nDllOffset)
    33. {
    34.     PVOID pNewPlace;
    35.     PVOID pNewEntry = NULL;
    36.     HANDLE  hThread;
    37.     ULONG nDelta;
    38.     PIMAGE_DOS_HEADER       pImageDosHeader = NULL;
    39.     PIMAGE_OPTIONAL_HEADER  pImageOptionalHeader = NULL;
    40.     PIMAGE_NT_HEADERS       pImageNtHeaders = NULL;
    41.     PIMAGE_FILE_HEADER      pImageFileHeader = NULL;
    42.  
    43.     pNewPlace = ALLOC(nDllSize);
    44.     if(!pNewPlace)
    45.         return FALSE;
    46.    
    47.     memcpy(pNewPlace,pDllBase,nDllSize);
    48.     pNewEntry = (PVOID)((ULONG)pNewPlace + nDllOffset);
    49.     pImageDosHeader = (PIMAGE_DOS_HEADER)pNewPlace;
    50.     pImageNtHeaders = (PIMAGE_NT_HEADERS)NTSIGNATURE(pImageDosHeader);
    51.     nDelta = (ULONG)pNewPlace - (ULONG)pDllBase;
    52.     ProcessReloc((ULONG)pNewPlace,nDllSize,pImageNtHeaders,nDelta);
    53.     hThread = pCreateThread(NULL, 0, &pNewEntry, (LPVOID)pNewPlace, CREATE_SUSPENDED, &nDelta);
    54.     if(!hThread)
    55.         return FALSE;
    56.     ResumeThread(hThread);
    57.     return TRUE;
    58. }
    59.  
    60. VOID FakeDllMain(LPVOID lParam)
    61. {
    62.     MessageBox(0,"Fake Main",0,0);
    63.     ExitThread(-1);
    64. }
    65.  
    66. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){
    67.     ULONG nOffset = (ULONG)((ULONG)FakeDllMain - (ULONG)hinstDLL);
    68.  
    69.     if(HideDll((PVOID)hinstDLL,DLL_SIZE,nOffset))
    70.         return FALSE;
    71.  
    72. }