Таблица экспорта,подскажите мою ошибку

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 9 ноя 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Хочу вывести список имен ф-ций,но он не то что не выводиться,но еще и при парсинге IMAGE_EXPORT_DIRECTORY::AddressOfNames происходит креш.
    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     DWORD baselib=(DWORD)LoadLibrary(L"ntdll.dll");
    4.     DWORD toNT=((IMAGE_DOS_HEADER*)baselib)->e_lfanew;
    5.     IMAGE_NT_HEADERS *NT=(IMAGE_NT_HEADERS*)(baselib+toNT);
    6.     IMAGE_EXPORT_DIRECTORY *exp=(IMAGE_EXPORT_DIRECTORY *)(baselib+NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    7.     DWORD cntFuncs=0;
    8.     if(exp->NumberOfNames > exp->NumberOfFunctions)
    9.     {
    10.         cntFuncs = exp->NumberOfNames;
    11.     }
    12.     else
    13.     {
    14.         cntFuncs = exp->NumberOfFunctions;
    15.     }
    16.     char *funcName;
    17.     for(DWORD i=0;i<cntFuncs;i++)
    18.     {
    19.         if(i<exp->NumberOfFunctions)
    20.         {
    21.             funcName=(char*) ( ( (DWORD*) exp->AddressOfNames )[i] + baselib );
    22.             printf("%s\n",funcName);
    23.         }
    24.         else
    25.         {
    26.             break;
    27.         }
    28.     }
    29.     getch();
    30.     return 0;
    31. }
    Как правильно отпарсить IMAGE_EXPORT_DIRECTORY::AddressOfNames ?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _nic
    В нашем селе список имён не выводят, а компилируют. :)
    Код (Text):
    1. format binary as 'txt'
    2. include 'enumexport.inc'
    3. enumExport '%WinDir%\system32\kernel32.dll'
    enumexport.inc приложен.

    Теперь по Вашему коду. Вот это заведомо неверно:
    Код (Text):
    1.     if(exp->NumberOfNames > exp->NumberOfFunctions)
    2.     {
    3.         cntFuncs = exp->NumberOfNames;
    4.     }
    5.     else
    6.     {
    7.         cntFuncs = exp->NumberOfFunctions;
    8.     }
    Получается, что имена берутся из одного массива, а размер берётся от другого (большего) массива. Естесственно, будет падение.