RtlAddFunctionTable и DLL в памяти

Тема в разделе "WASM.X64", создана пользователем dermatolog, 2 апр 2010.

  1. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Делаю загрузку DLL из памяти. Перед вызовом DllMain делаю RtlAddFunctionTable (передаю туда указатель на FunctionTable самой DLL, размер таблицы, базу DLL в памяти) в результате обработка исключений в DLL не работает.
    Кто знает куда копать?
     
  2. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Код (Text):
    1. BOOLEAN WINAPI RtlAddFunctionTable(
    2.     __in PRUNTIME_FUNCTION FunctionTable,
    3.     __in DWORD EntryCount,
    4.     __in DWORD64 BaseAddress
    5. );
    Всё ето учитывается?
     
  3. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Да - я сую оригинальную FunctionTable из самой DLL (BaseAddress+ExсeptionDirectory.RVA ). EntryCount = ExсeptionDirectory.Size/12. BaseAddress - база ДЛЛ. Результат RtlAddFunctionTable = TRUE. Такое впечатление что до раскрутки стека дело даже не доходит.
     
  4. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    А GetLastError == ?
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    dermatolog
    Выглядит странно. Единственное, что пока можем предположить при условии корректности кода – раскруточные процедуры в ntdll занимаются какой-нибудь ерундой вроде проверки на [не]принадлежность целевого кода имаджу И одновременно [не]принадлежность базы целевой dll списку образов из базы лоадера или из каких-нибудь таблиц модулей с недавними исключениями (да, звучит натянуто и вообще).

    Одним из простейших путей узнавания о факте раскрутки могло бы быть 'bu KiUserExceptionDispatcher "ba r1 *ExceptionContext.Rip"' – поскольку для раскрутки необходимо узнавать, на какой инструкции произошло исключение ("не в эпилоге ли мы?"). Или же "ba" на начальном RVA в середине добавленной таблицы (там должен быть бинарный поиск же?).
    Если это нечто глубокое, то можешь приаттачить минимальную dll с лоадером для неё, символами и ожидаемым результатом – мы посмотрим в деталях на w7.
     
  6. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Sol_Ksacap
    Есть подозрение, что MS-вый рантайм в DLL выносит нафиг все что делалось ДО вызова DllMain. Буду экспериментировать с RtlInstallFunctionTableCallback, но сам факт неработоспособности RtlAddFunctionTable уже наводит на мысли о существовании очередного г@внокода от MS, который неизвестно как придется обходить.
    До раскрутки дело вообще не доходит.
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    dermatolog
    А дай-ка такие спеки на случай, если соберёмся разбирать поведение (может быть они не релевантны раскрутке, но вдруг):
    1) Тип региона памяти, где находится "dll" – MEM_PRIVATE? (MEM_IMAGE? MEM_SECTION?)
    2) "dll" добавлена в базу данных лоадера?
    3) FileHeader.Characteristics, OptionalHeader.DllCharacteristics – в численном виде (для "dll" и для главного исполняемого модуля).
    4) ?

    >Есть подозрение, что MS-вый рантайм в DLL выносит нафиг все что делалось ДО вызова DllMain.
    Маловероятно. Смотрели в своё время рантайм vc9 и подобных хитрых ходов не заметили.
     
  8. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    MEM_PRIVATE
    Нет.
    На это я первым делом посмотрел :)) IMAGE_DLLCHARACTERISTICS_NO_SEH нет ни там ни там.
     
  9. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Я за эту теорию, час-два трейса 100% дали бы ответ, все быстрее чем ждать.