неполные релоки

Тема в разделе "WASM.WIN32", создана пользователем loginrl_103, 8 июн 2008.

  1. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    проблема с генерацией кода. часть кода идёт с рва, что позволяет потом настраивать через релоки, а часть (хз почему) - через статические адреса.

    сам код
    Код (Text):
    1. #include "stdafx.h"
    2. #include <windows.h>
    3.  
    4. void test_func()
    5. {
    6.     char msg[] = "iamhere";
    7.     MessageBox (NULL, test, test, MB_YESNO);
    8. }
    9.  
    10. int _tWinMain(HINSTANCE hInstance,
    11.                    HINSTANCE hPrevInstance,
    12.                    LPTSTR    lpCmdLine,
    13.                    int       nCmdShow)
    14. {
    15.  
    16.     test_func();
    17.     return 0;
    18. }
    /fixed:no включено. но...часть кода всё равно компилится со стат адресами. в чём причина? как можно оттучить комплиятор от такого поведения?)
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    и что здесь без релоков?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Быть может ты неверно их ищешь (релоки)?
    Там несколько блоков есть..
     
  4. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    loginrl_103
    Ты не правильно понимаешь что такое релоки, если код идет с RVA (что не бывает), то релоки никакие не нужны, т.к. надо просто прибавить базу образа. В твоем случае единственный оффсет, для которого нужны релоки это строка, да и к ней можно обратиться базонезависимо.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Еще косвенный вызов апи call dword ptr [__imp_MessageBox@16] и куча других вызовов и переменных в CRT зашитых, взять тот же (Win)mainCRTStartup
     
  6. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    IMAGE_SCN_LNK_NRELOC_OVFL ? "Расширенная" секция релоков? Нету.


    Код (Text):
    1. int FixReloc(PVOID Image, DWORD dwDelta)
    2. {
    3.            ...
    4.     PIMAGE_DOS_HEADER dosI;
    5.     PIMAGE_NT_HEADERS peI;
    6.     PIMAGE_BASE_RELOCATION reloc;
    7.  
    8.     dosI    = (PIMAGE_DOS_HEADER)Image;
    9.     peI = (PIMAGE_NT_HEADERS) ((DWORD)dosI->e_lfanew + (DWORD)dosI);
    10.     reloc   = (PIMAGE_BASE_RELOCATION)((DWORD)peI->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress + (DWORD)Image);
    11.    
    12.     DWORD dwOffset, SmallOffset;
    13.     printf ("Image in our proc: %x\n", Image);
    14.     printf ("reloc: %x\n", reloc);
    15.     printf ("VirtualAddress: %x\n", reloc->VirtualAddress);
    16.            ....
    17. }
    Image - буффер с экзешником (createfile/virtualalloc/readfile). При работе показывает, что Image = reloc, те
    peI->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = ...0 ! Но релоки в тестовом экзешнике есть (тулза их видит)...Откуда там 0 ???
    ...
     
  7. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    ни у какого никаких идей? уже 5-ый час бьюсь)
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    посмотри в каком-нибудь PE-редакторе.
     
  9. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    Смотрел) Выше писал)...Проблема решилась...Я для теста пытался запихнуть блокнот в блокнот...в блокноте релоков НЕТУ )) Убрать забыл( Время потрачено "с толком"...)
     
  10. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    Код (Text):
    1. ...
    2. int main()
    3. {
    4.     HANDLE insF = CreateFileA ("E:\\test.exe", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    5.     if (insF == INVALID_HANDLE_VALUE) return -1;
    6.     DWORD size_low = GetFileSize (insF, NULL);
    7.     PVOID prcobuff = VirtualAlloc (NULL, size, MEM_COMMIT, PAGE_READWRITE);
    8.     DWORD read;
    9.     if (ReadFile (insF, prcobuff , size, &read, 0) == FALSE)
    10.     {
    11.         printf ("error reading file: %d\n", GetLastError());
    12.         return 0;
    13.     }
    14.  
    15.     Ins ("notepad.exe", 0, (PTHREAD_START_ROUTINE)((DWORD)prcobuff + 0x1000), (DWORD)prcobuff);
    16.     return 0;
    17. }
    Код (Text):
    1. int Ins(PCHAR ProcName, DWORD PID, PTHREAD_START_ROUTINE RemoteProc, DWORD Base)
    2. {
    3.     GetDebug();
    4.     IMAGE_DOS_HEADER * dos;
    5.     IMAGE_NT_HEADERS *pe;
    6.     DWORD RetVal = 0, SizeOfImage, tmp;
    7.     PVOID NewBase, NewImage;
    8.     HANDLE Proc;
    9.        
    10.     PID = FindProcess(ProcName);
    11.  
    12.     dos = (IMAGE_DOS_HEADER *) Base;
    13.     pe = (IMAGE_NT_HEADERS *) ((DWORD) dos->e_lfanew + (DWORD) dos);
    14.  
    15.     SizeOfImage = pe->OptionalHeader.SizeOfImage;
    16.  
    17.     Proc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, 0, PID);
    18.     NewBase = VirtualAllocEx(Proc, NULL, SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    19.  
    20.     if (Proc && NewBase)
    21.     {  
    22.         NewImage = VirtualAlloc(NULL, SizeOfImage, MEM_COMMIT, PAGE_READWRITE);
    23.                        memcpy (NewImage, Base, SizeOfImage);
    24.         //NewImage = (PVOID)Base;
    25.    
    26.         FixReloc(NewImage, (DWORD)NewBase - Base);
    27.  
    28.         WriteProcessMemory(Proc, NewBase, NewImage, SizeOfImage, &tmp);
    29.         RemoteProc = (PTHREAD_START_ROUTINE) ((DWORD) RemoteProc - Base + (DWORD) NewBase);
    30.         printf ("RemoteProc: %x\n", RemoteProc);
    31.         CreateRemoteThread(Proc, NULL, NULL, RemoteProc, (PVOID)NewBase, NULL, &tmp);
    32.         Sleep (-1);
    33.         VirtualFree(NewImage, 0, MEM_RELEASE);
    34.  
    35.         RetVal = -1;
    36.     }
    37.  
    38.     CloseHandle(Proc);
    39.  
    40.     return RetVal;
    41. }
    42.  
    43. // ------------------------------------------------------
    44.  
    45. void FixReloc(PVOID Image, UINT dwDelta)
    46. {
    47.     PIMAGE_NT_HEADERS pe;
    48.     PIMAGE_BASE_RELOCATION reloc;
    49.     DWORD dwOffset, SmallOffset;
    50.     int i;
    51.  
    52.     pe      = (PIMAGE_NT_HEADERS) ((DWORD)(((PIMAGE_DOS_HEADER)Image)->e_lfanew) + (DWORD)Image);
    53.  
    54.     DWORD delta = (DWORD)Image - (DWORD)pe->OptionalHeader.ImageBase;
    55.  
    56.     PIMAGE_FIXUP_BLOCK pfb;
    57.     pfb = (PIMAGE_FIXUP_BLOCK)RVATOVA(Image, pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
    58.    
    59.     PIMAGE_FIXUP_BLOCK startpfb = pfb;
    60.  
    61.     if((delta == 0) || (pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size == 0)) return;
    62.     while(((DWORD)(((char *)pfb)-((char *)startpfb))) < pe->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)
    63.     {
    64.      PIMAGE_FIXUP_ENTRY pfe;
    65.      int count;
    66.      count = 0;
    67.      printf ("dwBlockSize: %x\n", pfb->dwBlockSize);
    68.      printf ("dwPageRVA: %x\n", pfb->dwPageRVA);
    69.      if(pfb->dwBlockSize > 0)
    70.      {
    71.          count = (pfb->dwBlockSize - sizeof(IMAGE_FIXUP_BLOCK)) / sizeof(IMAGE_FIXUP_ENTRY);
    72.          pfe = (PIMAGE_FIXUP_ENTRY)(((char *)pfb) + sizeof(IMAGE_FIXUP_BLOCK));
    73.      }
    74.       else
    75.      {
    76.          pfb= (PIMAGE_FIXUP_BLOCK)(((char *)pfb) + sizeof(IMAGE_FIXUP_BLOCK));     
    77.          continue;
    78.      }
    79.      for(i=0; i < count; i++)
    80.      {
    81.         printf ("change reloc\n");
    82.         void *fixaddr;
    83.         fixaddr= (void *)RVATOVA(Image, pfb->dwPageRVA + pfe->offset);
    84.         switch(pfe->type)
    85.         {
    86.            case IMAGE_REL_BASED_ABSOLUTE:
    87.                 break;
    88.            case IMAGE_REL_BASED_HIGH:
    89.                 *((WORD *)fixaddr) += HIWORD(delta);
    90.                 break;
    91.            case IMAGE_REL_BASED_LOW:
    92.                 *((WORD *)fixaddr) += LOWORD(delta);
    93.                 break;
    94.            case IMAGE_REL_BASED_HIGHLOW:
    95.                 *((DWORD *)fixaddr) += delta;
    96.                 break;
    97.            case IMAGE_REL_BASED_HIGHADJ: // This one's really fucked up.
    98.            {
    99.             DWORD adjust;                  
    100.             adjust=((*((WORD *)fixaddr)) << 16) | (*(WORD *)(pfe+1));
    101.             adjust += delta;
    102.             adjust += 0x00008000;
    103.             *((WORD *)fixaddr) = HIWORD(adjust);
    104.            }
    105.            
    106.            pfe++;
    107.            break;
    108.            default:
    109.                 return;
    110.         }
    111.                
    112.         pfe++;
    113.     }
    114.  
    115.     pfb=(PIMAGE_FIXUP_BLOCK)((char *)pfb + pfb->dwBlockSize);
    116.    }
    117.    
    118.  
    119. }
    test.exe - скомпиляный код в самом первом посте. С релоками. Сначала грешил на кривой код FixReloc - потому взял этот из BO...Если в код программы, впихивающей ехе, определить простой messagebox и попробовать внедрить её прямо из памяти - всё проходит отлично. Но если брать образ с диска и его пытаться..то чорти что.
     
  11. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    Хм...Считать надо с файловым оффсетом...Теперь все релоки видятся и отображаются правильно)...Жду следующих проблем)
     
  12. loginrl_103

    loginrl_103 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2008
    Сообщения:
    271
    Хм...Работает ёшкин кот! Всем спасибо за содействие). Тему можно закрыть