LoadLibraryW на Win7

Тема в разделе "WASM.WIN32", создана пользователем 00h, 19 май 2010.

  1. 00h

    00h New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    27
    Столкнулся со странной проблемой - на XP (было проверенно несколько машин) LoadLibraryA и LoadLibraryW работают нормально (ясно что во вторую я передаю юникод строку), но на Win7 (опять же несколько машин) вторая возращает 0.

    Код (Text):
    1. invoke LoadLibrary*, _sLibName*
    2.  
    3. _sLibName* db "MyLib.dll", 00h
    4. _sLibName* du "MyLib.dll", 00h
    Код выглядел примерно как то так. Пока поставил ascii вариант, Но меня попросили переделать что бы работало и не по относительным путям.

    Никто не сталкивался?
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    GetLastError
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    RtlGetLastNtStatus
     
  4. 00h

    00h New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    27
    998 - ERROR_NOACCESS
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  6. 00h

    00h New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    27
    Вы даете такие ссылки, как будто пол часика порыться в интернетах сложнее, чем отпостить на форуме и днями дожидаться ответа. Правда сервис понравился, возьму на заметку.

    Да я искал, но подобной проблемы не нашел. Осложнение в том, что у меня самого XP, и запуститься из под отладчика я не могу. Сейчас накидал пример, попробую погоняться за товарищами, как у них пройдет такой трю не с моей *.dll, а с каким либо user32.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    00h
    Следующий код будет возвращать ERROR_NOACCESS:
    Код (Text):
    1. Local Variable[2]:BYTE
    2.     push offset $DllName
    3.     Call LoadLibraryA
    В чём же фишка :)
     
  8. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    У меня эту ошибку возвращало когда был C0000005 в длл_мейн. Мб крешится где-то по ходу загрузки длл-ки, вот тока что читал,чел решил эту проблему используя другой компилер. Выложи длл-ку. Кстати закономерности крешей на x86,x64 нету?
     
  9. 00h

    00h New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    27
    Похоже я нашел ошибку, в одном из возвратов DllEntryPointa стоял место retn 0ch просто retn. Странно, что оно работал вообще) Ну с другой стороны могу предположить, что в ХР и ascii варианте в Win7 не затрагивало какие либо локалки и т.д. Сейчас исправлю, поймалю людей для теста и отпишусь.
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    00h
    >но на Win7 (опять же несколько машин) вторая возращает 0
    Для dll без пути лоадер сначала пытается открыть секцию с соответсвующим именем ("MyLib.dll", с хендлом RootDirectory == "\KnownDlls[32]"):
    Код (Text):
    1. 0:000> k
    2. ChildEBP RetAddr
    3. 000cfc5c 77a9d45a ntdll!NtOpenSection
    4. 000cfc90 77a9c3d8 ntdll!LdrpFindKnownDll+0x88
    5. 000cfd80 77a9c305 ntdll!LdrpFindOrMapDll+0x18d
    6. 000cff00 77a9c116 ntdll!LdrpLoadDll+0x2b2
    7. 000cff34 76c81d2a ntdll!LdrLoadDll+0x92
    8. 000cff6c 76991e23 KERNELBASE!LoadLibraryExW+0x178
    9. 000cff80 00401099 kernel32!LoadLibraryW+0x11
    Обыкновенно для пользовательских dll здесь должен быть возвращён STATUS_OBJECT_NAME_NOT_FOUND – далее для него сделан специальный кейс для продолжения загрузки. Однако ты передаёшь невыровненную на 2 юникодную строку и возвращается STATUS_DATATYPE_MISALIGNMENT. Вот и всё.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Ага, смотрим в generr.c соответствия:
    Код (Text):
    1.     STATUS_DATATYPE_MISALIGNMENT, ERROR_NOACCESS,
    2.     STATUS_ACCESS_VIOLATION, ERROR_NOACCESS,
    3.     STATUS_DATATYPE_MISALIGNMENT_ERROR, ERROR_NOACCESS,
    Просто RtlNtStatusToDosError() конвертит разные нэйтивные коды ошибок в один винапишный.
     
  12. 00h

    00h New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    27
    Черт, да, ошибка была моя - в одном из возвратов из DllEntryPoint возращало 0, а не 12. Сбило с толку то, что это работало на XP и 7 в асковом варианте.

    Извиняюсь за некоректную тему. Вопрос закрыт.
     
  13. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    00h
    Нет, подожди.
    Код (Text):
    1. 0:000> k8
    2.  # ChildEBP RetAddr  
    3. 00 0028e5b8 77a997c0 WINBRAND!_DllMainCRTStartup
    4. 01 0028e5d8 77a9d749 ntdll!LdrpCallInitRoutine+0x14
    5. 02 0028e6cc 77a9d60c ntdll!LdrpRunInitializeRoutines+0x26f
    6. 03 0028e838 77a9c116 ntdll!LdrpLoadDll+0x4d1
    7. 04 0028e86c 76c81d2a ntdll!LdrLoadDll+0x92
    8. 05 0028e8a4 76c81d7a KERNELBASE!LoadLibraryExW+0x178
    9. 06 0028e8c4 75c7a27e KERNELBASE!LoadLibraryExA+0x26
    10. 07 0028e910 75cc7de2 SHELL32!__delayLoadHelper2+0x59
    11.  
    12. 0:000> uf LdrpCallInitRoutine
    13. ntdll!LdrpCallInitRoutine:
    14. 77a997ac push    ebp
    15. 77a997ad mov     ebp,esp
    16. 77a997af push    esi
    17. 77a997b0 push    edi
    18. 77a997b1 push    ebx
    19. 77a997b2 mov     esi,esp
    20. 77a997b4 push    dword ptr [ebp+14h]
    21. 77a997b7 push    dword ptr [ebp+10h]
    22. 77a997ba push    dword ptr [ebp+0Ch]
    23. 77a997bd call    dword ptr [ebp+8]
    24. 77a997c0 mov     esp,esi         ; <--
    25. 77a997c2 pop     ebx
    26. 77a997c3 pop     edi
    27. 77a997c4 pop     esi
    28. 77a997c5 pop     ebp
    29. 77a997c6 ret     10h
    Как можно видеть, в соблюдение конвенций вызова 7ка особо не верит и восстанавливает esp после вызова. Так что вопрос пока открыт. (И тема корректна).
     
  14. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Sol_Ksacap
    Так, а на какой адрес вернет нас retn при этом?
     
  15. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    На правильный.
     
  16. 00h

    00h New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    27
    Так, интересно. Ну во-превых оно теперь работает нормально (когда я подправил срез стека). С другой стороны я так понимаю юникод от аксии отличается только процедурой, подготовливающей строку (по крайней мере на хр). Может ли быть фейл от невыровненной юникод строки? (я столкнулся с этим при чтении из реестра, RegOpenKeyEx в часности)
     
  17. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    >Может ли быть фейл от невыровненной юникод строки?
    Да, может. В #10 показано, где может обрываться загрузка при передаче невыровненной строки в LoadLibraryW().

    Но ведь размер "retn" отличается от размера "ret 0Ch" на чётное число байт – это ведь не должно было повлиять на баланс выравнивания последующих строк?
     
  18. 00h

    00h New Member

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