Получение адресов ф-ций из таблицы экспорта (особенности VISTA)

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

  1. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Есть код, который отыскивает адресс ф-ции в таблице экспорта (в частности kernel32.dll):

    Код (Text):
    1.     for (i = 0; i < expTbl_ptr->NumberOfNames; ++i)
    2.     {
    3.         char **ppp = (char**)((Uint32_t)BaseAddress + expTbl_ptr->AddressOfNames + i*sizeof(Uint32_t));
    4.         char *name = (Uint32_t)BaseAddress + *ppp;
    5.  
    6.         //тут сравнение имени ф-ции
    7.         if  (...) //наша ф-ция
    8.         {
    9.                 ppp = (char**)((Uint32_t)module_ptr->BaseAddress + expTbl_ptr->AddressOfFunctions + i*sizeof(Uint32_t));
    10.                 func_ptr = ((Uint32_t)module_ptr->BaseAddress + *ppp);
    11.         }
    12.     }
    Так вот, под Вистой ничегошеньки не работает, имена извлекает, а вот адреса не совпадают!
    В чем проблема? Под Вистой МС изменила PE-формат?
     
  2. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    Сам нашел решение:

    Код (Text):
    1.         if  (...) //наша ф-ция
    2.         {
    3.                 Uint16_t ord = *(Uint16_t*)((Uint32_t)module_ptr->BaseAddress + expTbl_ptr->AddressOfNameOrdinals + i*sizeof(Uint16_t));
    4.                 ppp = (char**)((Uint32_t)module_ptr->BaseAddress + expTbl_ptr->AddressOfFunctions + ord*sizeof(Uint32_t));
    5.                 func_ptr = ((Uint32_t)module_ptr->BaseAddress + *ppp);
    6.         }