Помогите разобраться с РЕ форматом

Тема в разделе "WASM.BEGINNERS", создана пользователем yurza, 4 сен 2008.

  1. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Вот решил разобраться с данным фарматоми наступил на грабли мож кто объяснить есть прога

    Код (Text):
    1. #define pointPE(a)                 (*(DWORD*)(a+0x3c)+a)
    2. #define pIM_OPT_H(p)            ((BYTE*)(pointPE(p)+0x18))
    3. #define pDATADIRECTORY(p)    (DWORD*)(pIM_OPT_H(p)+0x60)
    4. #define xImageBase(p)             (*(DWORD*)(pIM_OPT_H(p)+0x1C))
    5.  
    6. main()
    7. {
    8.     PTSTR CommandLine;
    9.     CommandLine=GetCommandLine();
    10.     int i=0;
    11.     while (CommandLine[i]!=' ') i++;
    12.     CommandLine=CommandLine+i+1;
    13.     char Buffer[255];
    14.     lstrcpy(Buffer,CommandLine);
    15.      printf(Buffer);
    16.     HANDLE hFile=CreateFile(Buffer,GENERIC_WRITE | GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    17.     if (hFile==INVALID_HANDLE_VALUE){printf("ASS");ExitProcess(0);}
    18.     HANDLE hMapping=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
    19.     HANDLE hMap=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
    20.  
    21. DWORD* aaa=(DWORD*)pDATADIRECTORY((long)hMap);
    22. DWORD pExport=aaa[0]+xImageBase((long)hMap);
    23. printf(" IMAGE %X\n",xImageBase((long)hMap));
    24. printf(" pExport %X\n",pExport);
    25. DWORD nameRVA= *(DWORD*)(pExport + 0xC);
    26. printf("nameRVA %X",nameRVA);
    27.     UnmapViewOfFile(hMap);
    28.     CloseHandle(hMapping);
    29.     CloseHandle(hFile);
    30. }
    Так вроде мне казалось что в nameRVA дожно быть RVA относительно ImageBase в которой храниться Name из структуры
    IMAGE_EXPORT_DIRECTORY но вот он мне что то какуюто ерунду выдает. Сильно не пенайте я только учусь.
    За ранее благодарю.
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Первое что заметил - ты мапишь файл как он есть на диске. Поэтому RVA перед использованием надо переводить в физ смещение. Но проще отмапить файл таким образом, тогда ничего переводить не придётся.
    CreateFileMapping(hFile,NULL,PAGE_READWRITE | SEC_IMAGE,0,0,NULL);

    + отладчик в руки и смотрим чему равны переменные после каждой из этих строчек
    DWORD* aaa=(DWORD*)pDATADIRECTORY((long)hMap);
    DWORD pExport=aaa[0]+xImageBase((long)hMap);
    DWORD nameRVA= *(DWORD*)(pExport + 0xC);

    и сравнивает их с тем, что там должно появиться(определить проще с помощью PeTools)
     
  3. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Просмотрел в
    xImageBase=показывает то же значение что и в опционом заголовке
    pExport=0x4D4000 храниться то же значение что и показывает (PE Tools)
    причем когда я беру адрес nameRVA то он показывет правельный адрес но вот значение по этому адресу другое такое подозрение что он показывает значение не не замепиного файла и моей проги
    блин я что уже совсем чтоли
    0x4D4000+0xC=0x4D400C смотрю в HIEW (файл который мэп делаю) по этому адресу одно значение (то что нужно)
    моя же прога какуету фигню выдает
    в Ольки открываю моя прога.exe far.exe перехожу по адресу который мне выдает прога и там действительно уренда какаето
    Причем когда я проделываю тоже самое с .dll то он все нормально определяет
    Блин как победить данного зверя