сквозной экспорт не из dll

Тема в разделе "WASM.WIN32", создана пользователем nMaxwell, 24 июн 2011.

  1. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    возможно ли сделать сквозной экспорт для библиотеки, расширение которой отлично от dll? (dll'ка с экспортом создается, но импортирует функции все равно из dll)
     
  2. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    поясните, не понял(
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    h0t
    При сквозном экспорте (forwarded export) внутри таблицы экспорта находятся строки вида NTDLL.RtlAllocateHeap, на которые указывают RVA соответствующих функций (в данном примере ф-ия HeapAlloc из kernel32.dll). Загрузчик при разрешении импорта такой функции (HeapAlloc) сразу кладёт в IAT адрес RtlAllocateHeap из ntdll.dll.

    Вопрос в том, можно ли этот же вид экспорта использовать, чтобы загрузчик искал адрес импортируемой функции в библиотеке somedll.plg, например, а не в somedll.dll.
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    О сквозном экспорте я знаю, просто не понял вопроса вначале.

    Знайте, наверное нет, так-как на сколько я помню загрузчику неоткуда взять полное имя файла...

    P.S. l_inc спасибо)
     
  5. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    а зачем загрузчику полное имя файла? достаточно знать до расширения - NTDLL.RtlAllocateHeap

    somedll.plg -> SOMEDLL.SomeFunc

    Дельфевые bpl-то,наверное, работают...

    А вот что будет, если загрузить ntdll.dll и ntdll.bpl... вот надо поэкспериментировать...
     
  6. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    gorodon
    вот именно, bpl'ки не срабатывают
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    А чем плохо .bpl переименовать в .dll?
     
  8. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    l_inc
    если использовать dll, то придется ломать всю логику delphi, т.к. все пакеты там используют bpl.
    ладно, фиг с ним, с экспортом, как перехватить тогда не в ран-тайме пару функций у delphi32.exe ( у него в экспорте туева куча)
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    Ничего не надо ломать. Прокси dll нужно дать расширение bpl. А оригинальную переименовать в .dll. Т.о. все будут использовать прокси dll.
     
  10. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Под полным именем я имел виду имя с расширением
     
  11. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    я, видимо, не вижу другого обьяснения тому, что кроме delphi32.exe никакие другие приложения и библиотеки наотрез отказываются работать, т.е. когда дельфя начинает загружать свои либы, они выкидывают ошибки (может функция rtl-инициализации запускается в нормальном режиме, а через прокси она теряется, следовательно вызов какой-то неинициализированной переменной приводит к ошибке)
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    Предположительно теряться ничего не должно. Я бы сам попробовал, но у меня нету delphi. Если хотите, выложите код прокси dll и тексты ошибок и опишите, где что лежит (приложение, основная dll, прокси dll) и под какими именами.
     
  13. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5. include 'forwardedexport.inc'
    6.  
    7. section 'CODE' code readable executable
    8.  
    9. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    10.         mov     eax, TRUE
    11.         ret
    12. endp
    13.  
    14. proc ReadStr name
    15.         invoke MessageBox,NULL,text,title,MB_OK
    16.         ret
    17. endp
    18.        title           db 'Title',0
    19.        text            db 'A call catched',0
    20.  
    21. section '.idata' import data readable writeable
    22.   library user32,'USER32.DLL'
    23.   import user32, MessageBox, 'MessageBoxA'
    24.  
    25. section '.edata' export data readable
    26.   exportForwarded 'rtl70.bpl','rtl70.bpl', ReadStr, '@Dateutils@IsPM$qqrx16System@TDateTime', DllEntryPoint, 5007 ;
    27.  
    28. section '.reloc' fixups data discardable
    выкидывается Runtime error 216 at 40005CDE

    все находится в одной диръ

    имена соответственно
    1)rtl70.dll (оригинал переименованный), rtls7.bpl (прокси, в exe поменял имя) и rtl70.bpl (для остальных библиотек)
    2)rtl70.dll (оригинал переименованный), rtl70.bpl (прокси)
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    Во-первых, не забываете потом переименовать rtl70.bpl в rtl70.dll и наоборот?

    Во-вторых,
    Вот это ещё зачем?

    В-третьих, если я правильно помню, delphi использует fastcall, что у Вас, похоже, не учитывается.

    На таком коде всё нормально отрабатывает?
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5. include 'forwardedexport.inc'
    6.  
    7. section '.text' code readable executable
    8.  
    9. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    10.         mov     eax, TRUE
    11.         ret
    12. endp
    13.  
    14. ReadStr:
    15. jmp [OriginalReadStr]
    16.  
    17. title           db 'Title',0
    18. text            db 'A call catched',0
    19.  
    20. section '.idata' import data readable writeable
    21.   library user32,'USER32.DLL',\
    22.            rtl70bpl,'RTL70.DLL'
    23.  
    24.   import user32,\
    25.            MessageBox, 'MessageBoxA'
    26.  
    27.   import rtl70bpl,\
    28.            OriginalReadStr,'@Dateutils@IsPM$qqrx16System@TDateTime'
    29.  
    30. section '.edata' export data readable
    31.   exportForwarded 'rtl70.bpl','rtl70.bpl',\
    32.                          ReadStr, '@Dateutils@IsPM$qqrx16System@TDateTime'
    33.  
    34. section '.reloc' fixups data discardable
    P.S. Имя rtl70bpl было неправильное. Подправил.
     
  15. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    l_inc
    тут дело не совсем в том, код получается одинаковый
    1) @Dateutils@IsPM$qqrx16System@TDateTime - первая попавшаяся мне функция, не используемая дельфи при запуске, поэтому fastcall не причем тут.
    2) rtl70.bpl при запуске использует функцию по ординалу равную 5007, поэтому я написал 'DllEntryPoint, 5007'
    главная задача, пока что, это запуск IDE без перехвата)
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    Ну так Вы взяли и заменили его функцию, которая, наверное, какие-то полезные действия выполняет, на пустую. Причём, вероятно 5007 — fastcall, а DllEntryPoint — stdcall, в результате чего ещё и стек портится. Так что fastcall очень даже причём.
     
  17. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    l_inc
    EP rtl70.bpl делает джамп на 5007 и все, больше никаких действий он не выполняет, как утверждает ида.
    а если нет параметров, есть ли разница, как вызывать? просто call? или надо еще указывать ( как например в cdecl - cinvoke, в stdcall - invoke)
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    В данном случае нету, но его внутренний прыжок не имеет никакого значения. Важно, вызывают ли внешние модули 5007.
    Просто проверьте, работает ли код из #14. Если работает, значит никаких проблем с bpl/dll нету.
     
  19. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    l_inc
    не работает, опяьт же 216, только адрес другой
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nMaxwell
    Тогда ХЗ, но маловероятно, что это как-то связано с расширениями. Возможно, delphi использует собственные процедуры разрешения импорта и не учитывает сквозной экспорт.